MySQL数据库
课程目标: - MySQL数据库安装与配置 - MySQL表操作 - MySQL基本查询 - MySQL高级查询 - MySQL写入操作 - MySQL基本函数 - MySQL的综合应用
1. MySQL数据库安装与配置
1.1 数据库简介
什么是数据库系统:
- 数据库系统(DBMS)Database Management System 是指一个能为用户提供信息服务的系统。它实现了有组织地、动态地储存大量相关数据的功能,提供了数据处理和信息资源共享的便利手段。
什么是关系型数据库系统:
- 关系型数据库系统( RDBMS)Relational database management system是指使用了关系模型的数据库系统
- 关系模型中,数据是分类存放的,数据之间可以有联系
第一个关系型数据库
- 1976年BM的 System R团队在出版的论文中阐述了关系模型,1979年 Oracle公司推出了首个关系型数据库成品
- 关系型数据的应用
- 关系型数据库被应用在非常多的领域,教育系统,商业系统,医疗系统,而且关系型数据库可以有效组织和管理大量复杂的数据,所以关系型数据库才是最重要的数据库产品。
主流的关系型数据库
- DB2
- Oracle
- MySQL
- SQL Server 什么是 NOSQL数据库系统?
- NOSQL数据库指的是数据分类存放,但是数据之间没有关联关系的数据库系统
- 主流的NoSQL数据库
- Redis 秒杀 ,微博
- MongoDB: 知乎,简书
- MemCache
- Ne04j
1.2 MySQL数据库安装与初始化
MySQL数据库:
- MySQL是应用最广泛、普及度最高的开源关系型数据库
- MySQL由瑞典 MySQL AB公司开发,目前属于 Oracle旗下产品
MySQL 大事记 - 1996 MySQL1.0 诞生 - 1999 MySQL AB公司成立 - 2000 MysQL4.0发布 - 2003 MySQL5.0发布 MySQL衍生版 - Oracle - MariaDB - Percona
1.3 用户管理
MySQL客户端:Navicat
- 官网地址 https://www.navicat.com.cn 重设root密码
- 创建一个TXT文件,定义修改密码的SQL语句
ALTER USER root'@'localhost' IDENTIFIED BY ′123456′
注意本地localhost 加上%,代表可远程登录
- 右键,Window PowerShell管理员运行
- 停止:输入net stop mysql 80
- 启动:mysql --defaults-file="路径\my.ini" --init-file=“TXT路径” --console
- 停止:输入net stop mysql 80
1.4 MySQL配置文件
MySQL配置文件
- 在my.ini文件中,我们可以设置各种 MySQL的配置,例如字符集、端口号、目录地址等等
- `port=3306`#端口号
`datadir=C:/ ProgramData/ MySQL/ MySQL Server8.0/Data`#数据目录
`default authentication_ plugin= caching sha2_ password`#密码认证插件
`default- storage- engine= INNODB`#默认存储引擎
`sq1-mode=" STRICT TRANS TABLES, NO ENGINE SUBSTITUTION`"#开启严格模式
`log- output=FILE`#用文件记录日志
`genera1-10g=0`#关闭日志输出
`genera1_1 og file=" DESKTOP-HB42AU2.1og`"#日志文件名称
`slow- query-1og=1`#开启慢查询日志
`query_1 og file=" DESKTOP-HB42AU2-s1ow.1og"`#慢查询日志文件名称
`long query time=10`#大于多少秒的执行SQL被记录在慢查询日志
`log- error=" DESKTOP-HB42AU2.err”`#错误日志名称
`server-id=1`#数据库ID
`lower case table names=1`#把表名转换成小写
`secure-f1le-priv="C:/ ProgramData/MyQL/ lySQL Server8.0/ Uploads"`#导入导出数据的目录地址
`max connections=151`#最大连接数
`table open cache=2000`
`tmp table size=16M`
`thread cache size=10`#线程数量
`myisam max sort file size=100G`
`myisam sort buffer size=8M`
`key buffer size=8M`
`read buffer size=0`
2. 数据库表的相关操作
2.1 定义逻辑库,数据表
什么是SQL语言:SQL是用于访问和处理数据的标准的计算机语言 SQL语言分类 - DML:添加 修改 删除 查询 - DCL:用户 权限 事务 - DDL:逻辑库 数据表 视图 索引 SQL语句注意事项 - SQL语句不区分大小写,但是字符串区分大小写 SELECT “HelloWorld” - SQL语句必须以分号结尾 - SQL语句中的空白和换行没有限制,但是不能破坏语法 SQL语句的注释
- SQL语句的注释有两种,分别如下
- #这是一段注释文字
- /这是另一段注释文字/
- #这是一段注释文字
创建逻辑库
- `mysql> CREATE DATABASE 逻辑库名称` #创建逻辑库
- `mysql> SHOW DATABASES;` #展示逻辑库
- `mysql> DROP DATABSE 逻辑库名称`;#展示逻辑库
创建数据表
- `CREATE TABLE数据表 (`
`列名1 数据类型 [约束][ COMMENT注释],`
`列名2 数据类型 [约束][ COMMENT注释],`
`...`
`)[ COMMENT=注释];`
- `CREATE TABLE student(`
`id INT UNSIGNED PRIMARY KEY,`
`name VARCHAR(20) NOT NULL,`
`sex CHAR(1)NOT NULL,`
`birthday DATE NOT NULL,`
`tel CHAR(11) NOT NULL,`
`remark VARCHAR(200),`
`);`
写入数据表
insert into student VALUES(1,"张三",“男”,“1995-05-13”,“13383838438”,NULL)
数据表的其他操作
`SHOW tables;`#查看逻辑表
`DESC Student;`#查看数据表
`SHOW CREATE TABLE student`,#查询建表语句
`DROP TABLE Student`#删除表文件
2.2 定义数据库语言:数据类型
- 数字类型:
- tinyint:小整数
- int 整数
- bigint: 大整数
- float:单精度浮点数
- double:双精度浮点数
- 字符串类型:
- char:固定长度字符串
- varchar 不固定长度字符串
- 日期类型:
- Date:日期
- Time:时间
- Year:年份
2.3 字段约束
数据库的范式: 构造数据库必须遵循一定的规则,这种规则就是范式
- 目前关系数据库有6种范式,一般情况下,只满足第三范式即可
- 第一范式:原子性
- 第一范式是数据库的基本要求,不满足这一点就不是关系数据库
- 数据表的每一列都是不可分割的基本数据项,同一列中不能有多个值,也不能存在重复的属性。
- 第二范式:唯一性
- 数据表中的每条记录必须是唯一的。为了实现区分,通常要为表加上一个列用来存储唯一标识,这个唯一属性列被称作主键列
- 第三范式:关联性
- 每列都与主键有直接关系,不存在传递依赖
- 依照第三范式,数据可以拆分保存到不同的数据表,彼此保持关联
- 第一范式:原子性
字段约束
- MySQL中的字段约束共有四种
- 主键约束 PRIMARY KEY 字段值唯一,且不能为NULL
- 主键约束要求字段的值在全表必须唯一,而且不能为NUL值
- 建议主键一定要使用数字类型,因为数字的检索速度会非常快
- 如果主键是数字类型,还可以设置自动增长
- 主键约束要求字段的值在全表必须唯一,而且不能为NUL值
- 主键约束 PRIMARY KEY 字段值唯一,且不能为NULL
CREATE TABLE t_teacher(
id INT PRIMARY KEY AUTO INCREMENT
...
);
- 非空约束 NOT NULL 字段值不能为NULL
- 非空约束要求字段的值不能为NULL值
- NULL值以为没有值,而不是"" 空字符串
- 非空约束 NOT NULL 字段值不能为NULL
`CREATE TABLE t_teacher(`
`id INT PRIMARY KEY AUTO INCREMENT,`
`name VARCHAR(200) NOT NULL`
`married BOOLEAN NOT NULL deFAUlT False`
`);`
- 唯一约束 UNIQUE 字段值唯一,且可以为NULL
- 外键约束 FOREIGN KEY 保持关联数据的逻辑性
- 外键约束用来保证关联数据的逻辑关系
- 外键约束的定义是写在子表上的
- `CREATE TABLE t_dept(#父表`
`deptno INT UNSIGNED PRIMARY KEY`
`dname VARCHAR(20) NOT NULL UNIQUE`
`tel CHAR(4) UNIQUE`
`);`
`CREATE TABLE t_temp(`
`empno INT UNSIGNED PRIMARY KEY,`
`ename VARCHAR(20) NOT NULL`
`sex enum("男","女") NOT NULL`,#enum:只能选男或者女
`deptno INT UNSIGNED`
`hiredate DATE NOT NUlL`
`FOREIGN KEY(deptno)REFERENCES t_dept(deptno)`
`);关联单词 references`
2.4 索引
数据排序的好处
- 一旦数据排序之后,查找的速度就会翻倍,现实世界跟程序世界都是如此 如何创建索引
CREATE TABLE表名称(
...,
INDEX[索引名称](字段),
...,
);
如何添加与删除索引CREATE INDEX 索引名称 ON 表名(字段);
ALTER TABLE 表名称 ADD INDEX [索引名](字段)
SHOW INDEX FROM 表名
DROP INDEX 索引名称 ON 表名
索引的使用原则 - 数据量很大,而且经常被查询的数据表可以设置索引 - 索引只添加在经常被用作检索条件的字段上面 - 不要在大字段上创建索引
3. 数据库的基本查询
3.1 数据库操作语言:普通查询
记录查询
- 最基本的查询语句是由 SELECT和FROM关键字组成的
SELECT * FROM t_emp;
SELECT empno, ename, sal FROM t_emp;
- SELECT语句屏蔽了物理层的操作,用户不必关心数据的真实存储,交由数据库高效的査找数据 使用列别名
- 通常情况下, SELECT-子句中使用了表达式,那么这列的名字就默认为表达式,因此需要一种对列名重命名的机制
SELECT empno,sal * 12 as "income" FROM t_emp;
查询语句的子句执行顺序
- 词法分析与优化,读取SQL语句
- FROM 选择数据来源
- SELECT 选择输出内容
3.2 数据库操作语言:数据分页
数据分页
- 如我们查看朋友圈,只会加载少量部分信息,不用一次性加载全部朋友圈,那样只会浪费CPU时间、内存和网络带宽
- 如果结果集的记录很多,则可以使用limit关键字限定结果集数量
SELECT .... FROM … LIMIT 起始位置,偏移量;
SELECT empno, ename FROM t_emp LIMIT 0,20;
- 数据分页的简写用法
- 如果LIMIT子句只有一个参数,它表示的是偏移量,起始值默认为0
SELECT empno, ename FROM t emp LIMIT 10;
SELECT empno, ename FROM t emp LIMIT 0, 10;
- 如果LIMIT子句只有一个参数,它表示的是偏移量,起始值默认为0
- 查询语句的子句执行顺序
FROM -> SELECT -> LIMIT
3.3 数据操作语言:排序
结果集排序
- 如果没有设置,查询语句不会对结果集迸行排序。也就是说,如果想让结果集按照某种顺序排列,就必须使用 ORDER BY子句。
SELECT FROM ORDER BY 列名 [ASC|DESC]
SELECT ename,sal from t_emp ORDER BY sal;
排序关键字
- ASC代表升序(默认), DESC代表降序
- 如果排序列是数字类型,数据库就按照数字大小排序,
- 如果是日期类型就按照日期大小排序
- 如果是字符串就按照字符集序号排序。
SELECT ename, sal FROM t_emp order BY hiredate desc;
多个排序字段
- 如果排序列是数字类型,数据库就按照数字大小排序,
- 我们可以使用 ORDER BY规定首要排序条件和次要排序条件。数据库会先按照首要排序条件排序,如果遇到首要排序內容相同的记录,那么就会启用次要排序条件接着排序
SELECT empno, ename, sal hiredate FROM t emp ORDER BY sal desc,hiredate Asc;
排序+分页- ORDER BY子句书写的时候放在LMIT子句的前面
FROM - SELECT - ORDER BY - LIMIT
- ORDER BY子句书写的时候放在LMIT子句的前面
3.4 数据操作语言:去除重复记录
去除重复记录
- 如果我们需要去除重复的数据,可以使用 DISTINCT关键字来实现
- SELECT D| STINCT 字段 FROM…;
- SELECT DISTINCT job FROM t emp;
- 注意事项
- 使用 DISTINCT的 SELECT子句中只能查询一列数据,如果查询多列,去除重复记录就会失效。
- DISTINCT关键字只能在 SELECT 子句中使用一次
3.5 数据操作语言:条件查询
条件查询
- 很多时候,用户感兴趣的并不是逻辑表里的全部记录,而只是它们当中能够满足某一种或某几种条件的记录。这类条件要用 WHERE子句来实现数据的筛选
SELECT FROM WHERE条件[AND|OR]条件 .....;
SELECT empno, ename, sal FRom t emp WHERE deptno=10 AND sal >=2000;
- 算数运算符
- +加法
- -减法
- *乘法
- /除法
- %求模
- +加法
- 比较运算符
- 包含 IN
- 为空 IS NULL
- BETWEEN AND 范围
- LIKE 模糊查询
- REGEXP 正则表达式
- 包含 IN
- 逻辑运算符
- AND 与关系
- OR 或关系
- NOT 非关系
- AND 与关系
- WHERE子句的注意事项
- WHERE子句中,条件执行的顺序是从左到右的。所以我们应该把索引条件,或者筛选掉记录最多的条件写在最左侧
SELECT empno, ename FROM t emp WHERE ename = FORD AND sal >=2000
SELECT empno, ename FROM t emp Where deptno =10 AND sal >=2000
- WHERE子句中,条件执行的顺序是从左到右的。所以我们应该把索引条件,或者筛选掉记录最多的条件写在最左侧
- 各种子句的执行顺序
- 条件查询中, WHERE子句应该是第几个执行?
FROM -> WHERE- >LECT -> ORDER BY ->LIMIT
- 条件查询中, WHERE子句应该是第几个执行?
4. 数据库的高级查询
4.1数据操作语言:聚合函数
什么是聚合函数
- 聚合函数在数据的查询分析中,应用十分广泛。聚合函数可以对数据求和、求最大值和最小值、求平均值等等。 聚合函数
- SUM函数
- SUM函数用于求和,只能用于数字类型,字符类型的统计结果为0,日期类型统计结果是毫秒数相加。
SELECT SUM(ename) FROM t emp;
SELECT SUM(sal) FROM t emp;
WHERE deptno In (10, 20);
- SUM函数用于求和,只能用于数字类型,字符类型的统计结果为0,日期类型统计结果是毫秒数相加。
- MAX函数
- MAX函数用于获得非空值的最大值。
SELECT MAX (comm) FROM t empi
- 问题1:查询10和20部门中,月收入最高的员工?
SELECT MAX (sal+IFNULL(comm, 0)) FROM t emp WhERE deptno IN(10,20)
- 问题2:查询员工名字最长的是几个字符?
SELECT MAX (LENGTH (ename)) FROM t emp
- MAX函数用于获得非空值的最大值。
- MIN函数
- MIN函数用于获得非空值的最小值。
SELECT MIN (empno) FROM t emp;
SELECT MIN (hiredate) FRoM t empi
- MIN函数用于获得非空值的最小值。
- AVG函数
- AVG函数用于获得非空值的平均值,非数字数据统计结果为0
SELECT AVG(sal+IFNULL(comm)) FROM t empi
- AVG函数用于获得非空值的平均值,非数字数据统计结果为0
- COUNT函数
- COUNT()用于获得包含空值的记录数, COUNT(列名)用于获得包含非空值的记录数。
SELECT COUNT(*) FROM t emp;
- COUNT()用于获得包含空值的记录数, COUNT(列名)用于获得包含非空值的记录数。
- COUNT函数
- 查询10和20部门中,底薪超过2000元并且工龄超过15年的员工人数?
SELECT COUNT(*)FROM t emp WhERE deptno IN (10, 20) AND sal>=2000 AND DATEDIFF(NOW(hiredate)/365>=15
- 查询1985年以后入职的员工,底薪超过公司平均底薪的员工数量?
SELECT COUNT (* FROM t emp WHERE hiredate>=1985-01-01 AND Sal>AVG(sal)
- 查询10和20部门中,底薪超过2000元并且工龄超过15年的员工人数?
4.2数据操作语言:分组查询
为什么要分组?
- 默认情况下汇总函数是对全表范围内的数据做统计
- GROUP BY子句的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对每个小区域分别进行数据汇总处理
SELECT deptno, AVG(sal) FROM t_emp GROUP BY deptno
逐级分组- 数据库支持多列分组条件,执行的时候逐级分组。
- 查询每个部门里,每种职位的人员数量和平均底薪
SELECT deptno, job, COUNT(*), AVG(sal) FROM t emp GroUP BY deptno, job ORDER BY deptno
对 SELECT子句的要求
- 查询语句中如果含有 GROUP BY子句,那么 SELECT-子句中的内容就必须要遵守规定: SELECT子句中可以包括聚合函数,或者 GROUP BY子句的分组列,其余内容均不可以出现在 SELECT子句中
SELECT deptno, CoUNT(*), AVG(sal) FROM t emp GroUP BY deptno;
selECt deptno, CoUNT(), AVG(sal), sal FROM t emp GroUP BY deptno;
- 对分组结果集再次做汇总计算
SELECT deptno, CoUNT(*),AVG(sal), MAX (sal), MIN (sal) ROM t emp groUP BY deptno WITH ROLLUP;
- GROUP CONCAT函数
- GROUP CONCAT函数可以把分组查询中的某个字段拼接成一个字符串
- 查询每个部门内底薪超过2000元的人数和员工姓名
SELECT deptno, GroUP CONCAT (ename), COUNT(*) FROM t emp WHERE sal>=2000 GROUP BY deptno
- 各种子句的执行顺序
- 查询语句中, GROUP BY子句应该第几个执行?
FROM - WHERE-> GROUP BY -> SELECT - ORDER BY -> LIMIT
- 查询语句中, GROUP BY子句应该第几个执行?
4.3数据操作语言: HAVING子句
- HAVING子句的特殊用法 按照数字1分组, MySQL会依据 SELECT子句中的列进行分组,HAVING子句也可以正常使用
4.4 表连接查询
从多张表中提取数据
- 从多张表中提取数据,必须指定关联的条件。如果不定义关联条件就会出现无条件连接,两张表的数据会交叉连接,产生笛卡尔积。
- 从多张表中提取数据规定了连接条件的表连接语句,就不会出现笛卡尔积
SELECT e empno, e. ename, d dname
FROM t emp e join t dept d
oN e deptno=d. deptnoi
- 表连接的分类
- 内连接: 内连接是结果集中只保留符合连接条件的记录
- 内连接的简介
- 内连接是最常见的一种表连接,用于查询多张关系表符合连接条件的记录。
SELECT FROM表1
[|NER] JON表2 ON 条件
[NER] JON表3 ON 条件
- 内连接的多种语法形式
SELECT ...FROM 表1 J0IN 表2 0N 连接条件
SELECT ...FROM 表1 J0IN 表2 WHERE 连接条件;
SELECT…FROM表1,表2 WHERE连接条件
- 内连接是最常见的一种表连接,用于查询多张关系表符合连接条件的记录。
- 外连接: 外连接是不管符不符合连接条件,记录都要保留在结果集中
- 外连接简介 外连接与内连接的区别在于,除了符合条件的记录之外,结果集中还会保留不符合条件的记录。
- 左连接和右连接
- 左外连接就是保留左表所有的记录,与右表做连接。如果右表有符合条件的记录就与左表连接。如果右表没有符合条件的记录,就用NUL与左表连接。右外连接也是如此。
- 外连接的注意事项 内连接只保留符合条件的记录,所以查询条件写在ON子句和WHERE子句中的效果是相同的。但是外连接里,条件写在 WHERE子句里,不合符条件的记录是会被过滤掉的,而不是保留下来。
4.5 子查询
子查询简介 - 子查询是一种査询中嵌套查询的语句 - 查询底薪超过公司平均底薪的员工的信息 子查询的分类 - 子查询可以写在三个地方: WHERE子句、FROM子句、 SELECT子句,但是只有FROM子句子查询是最可取的 WHERE子查询 - 这种子查询最简单,最容易理解,但是却是效率很低的子查询 - 查询底薪超过公司平均底薪的员工的信息 FROM子查询 - 这种子查询只会执行一次,所以查询效率很高 SELECT-子查询 - 这种子查询每输出一条记录的时候都要执行一次,查询效率很低
单行子查询和多行子查询
- 单行子查询的结果集只有一条记录,多行子查询结果集有多行记录
- 多行子查询只能出现在 WHERE子句和FROM子句中
- WHERE子句中的多行子查询
- WHERE子句中,可以使用N、ALL、ANY、 EXISTS关键字来处理多行表达式结果集的条件判断
- EXISTS关键字
- EXISTS关键字是把原来在子查询之外的条件判断,写到了子查询的里面。
SELECT……FROM表名 WHERE[NOT] EXISTS(子查询)
5. MySQL对数据的基本操作
5.1数据操作语言: INSERT语句
- INSERT语句可以向数据表写入记录,可以是一条记录,也可以是多条记录
INSERT INTO 表名(字段1,字段2,…) VALUES(值1,值2,)
INSERT INTO 表名(字段1,字段2,… VALUES(值1,值2,……),(值1,值2,…)
- INSERT语句方言
- MYSQL的 NSERT语句还有一种方言语法
INSERT INTO表名SET字段1=值1,字段2=值2,……
- IGNORE关键字
- IGNORE关键字会让 INSERT只插入数据库不存在的记录
INSERT [IGNORE] INTO表名
- IGNORE关键字会让 INSERT只插入数据库不存在的记录
5.2 数据操作语言: UPDATE语句
- UPDATE语句
- UPDATE语句用于修改表的记录
UPDATE[ GNORE]表名
SET字段1=值1,字段2=值2,
[WHERE条件1…]
[ ORDER BY…]
[LIMIT …….]
练习题- 把每个员工的编号和上司的编号+1,用 ORDER BY子句完成
- 把月收入前三名的员工底薪减100元,用LMT子句完成
- 把10部门中,工龄超过20年的员工,底薪增加200元
- 把ALEN调往 RESEARCH部门,职务调整为 ANALYST
- UPDATE语句的表连接
- 因为相关子查询效率非常低,所以我们可以利用表连接的方式来改造 UPDATE语句
UPDATE表10表2 ON条件 SET字段1=值1,字段2=值2,.....,
- 表连接的 UPDATE语句可以修改多张表的记录
- UPDATE语句的表连接既可以是内连接,又可以是外连接
UPDATE 表1[ LEFT I RIGHT]JOIN 表2 0N条件 SET字段1=值1,字段2=值2,…,
- 因为相关子查询效率非常低,所以我们可以利用表连接的方式来改造 UPDATE语句
5.5数据操作语言: DELECT 语句
- DELETE语句
- DELETE语句用于删除记录,语法如下:
DELETE [ GNORE] FROM 表名
[ WHERE 条件1,条件2,…]
[ORDER BY ,.....]
[LMIT….];
- 练习:
- 删除10部门中,工龄超过20年的员工记录 删除20部门中工资最高的员工记录
- DELETE语句的表连接(一)
- 因为相关子查询效率非常低,所以我们可以利用表连接的方式来改造 DELETE语句
DELETE表1, FROM 表1 J0IN 表2 ON条件
[ WHERE条件1,条件2.,,,,,,]
[ORDER BY......]
[LIMIT…]
- 因为相关子查询效率非常低,所以我们可以利用表连接的方式来改造 DELETE语句
- 练习
- 删除 SALES部门和该部门的全部员工记录
- 删除每个低于部门平均底薪的员工记录
- DELETE语句的表连接(二)
- DELETE语句的表连接既可以是内连接,又可以是外连接 DELETE表1,……FROM表1 LEFT IRGHTJOIN 表2 ON条件
- 快速删除数据表全部记录
- DELETE语句是在事务机制下删除记录,删除记录之前,先把将要删除的记录保存到日志文件里,然后再删除记录
- TRUNCATE语句在事务机制之外删除记录,速度远超过 DELETE语句
TRUNCATE TABLE表名
- DELETE语句用于删除记录,语法如下:
6. MySQL基本函数的使用
6.1 MySQL的函数
函数的定义:像编程语言利用函数封装业务功能一样,数据库也把一些复杂的功能封装到函数里,供使用者调用
- 函数的分类
- 数字函数
- 字符函数
- 日期函数
- 条件函数
6.2 数字函数
- ABS 绝对值
- ROUND 四舍五入
- POWER 幂函数
- LOG 对数函数
- LN 对数函数
6.3 日期函数
- 获取系统时间函数
- NOW() 函数能获得系统日期和时间,格式yy-MM-dh:mm:ss
- CURDATE() 函数能获得当前系统日期,格式yy-MM-dd
- CURTIME() 函数能获得当前系统时间,格式hh:mm:Ss
- DATE FORMAT() 函数用于格式化曰期,返回用户想要的日期格式
DATE FORMAT(日期,表达式)
SELECT ename, DATE FORMAT(hiredater,“%Y”)FROM t emp
练习- 利用日期函数,查询明年你的生日是星期几?
- 利用日期函数,查询1981年上半年入职的员工有多少人?
- 日期计算的注意事项
- MySQL数据库里面,两个日期不能直接加減,日期也不能与数字加减
- 日期偏移计算
- DATE ADD0函数可以实现日期的偏移计算,而且时间单位很灵活
DATE ADD(日期, NTERVAL偏移量时间单位)
- DATE ADD0函数可以实现日期的偏移计算,而且时间单位很灵活
- 计算日期之间相隔的天数
- DATEDIFFOI函数用来计算两个日期之间相差的天数
DATEDIFF(日期,日期)
- DATEDIFFOI函数用来计算两个日期之间相差的天数
6.4字符函数
字符函数
- LOWER 转换小写字符
- UPPER 转换大写字符
- LENGTH 字符数量
- CONCAT 连接字符串
- INSTR 字符出现的位置
- INSERT 插入/替换字符
- SUBSTR截取字符串
- SUBSTRING截取字符串
- TRIM 去除首尾
6.5条件函数
- SQL语句中可以利用条件函数来实现编程语言里的条件判断
- IFNUL(表达式,值)
- IF(表达式,值1,值2) 练习
- 中秋节公司发放礼品, SALES部门发放礼品A,其余部门发放礼品B,打印每名员工获得的礼品。
- 条件语句
- 复杂的条件判断可以用条件语句来实现,比F语句功能更强大
CASE
WHEN 表达式 THEN 值1
WHEN 表达式 THEN 值2
ELSE 值 N
END
- 复杂的条件判断可以用条件语句来实现,比F语句功能更强大
- IFNUL(表达式,值)
- 练习
- 公司年庆决定组织员工集体旅游,每个部门旅游目的地是不同的。 SALES部门去P1地点, ACCOUNTING部门去P2地点, RESEARCH部门去P3地点,查询每名员工的旅行地点。
7. MySQL的综合应用
7.1事务机制
避免写入直接操作数据文件
- 如果数据的写入直接操作数据文件是非常危险的事情
- 利用日志来实现间接写入
- MySQL总共有5种日志,其中只有redo日志和undo日志与事务有关
- 事务机制( Transaction) RDBMS=SQL语句+事务(ACID) 事务是一个或者多个SQL语句组成的整体,要么全部执行成功,要么全都执行失败
- 事务执行流程
- 开启事物 UPDATE语句 DELETE语句 提交事物
- 管理事务
- 默认情况下, MySQL执行每条SQL语句都会自动开启和提交事务
- 为了让多条SQL语句纳入到一个事务之下,可以手动管理事务
- START TRANSACTION
SQL语句I COMMIT I ROLLBACK I
- 事务的ACD属性
- 原子性:一个事务中的所有操作要么全部完成,要么全部失败。事务执行后不允许停留在中间某个状态
- 一致性:事务的一致性。不管在任何给定的时间、并发事务有多少,事务必须保证运行结果的一致性
- 隔离性:隔离性要求事务不受其他并发事务的影响,如同在给定的时间內该事务是数据库唯一运行的事物,默认情况下A事务,只能看到日志中该事务的相关数据
- 持久性:事务一旦提交,结果便是永久性的。即便发生宕机,仍然可以依靠事务日志完成数据的持久化
- 事务的四个隔离级别
- read uncommitted 读取未提交数据
- read committed 读取已提交数据
- repeatable read 重复读取
- serializable序列化
- 修改事务隔离级别
- READ UNCOMMITTED代表可以读取其他事务未提交的数据
SET SESSION TRANSACTON工 SOLATION LEVEL READ UNCOMMITTED
- READ COMMITTED代表只能读取其他事务提交的数据
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
- READ COMMITTED代表只能读取其他事务提交的数据
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
- 事务的序列化
- 由于事务并发执行所带来的各种问题,前三种隔离级别只适用在某些业务场景中,但是序列化的隔离性,让事务逐一执行,就不会产生上述问题
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
- 由于事务并发执行所带来的各种问题,前三种隔离级别只适用在某些业务场景中,但是序列化的隔离性,让事务逐一执行,就不会产生上述问题
- READ UNCOMMITTED代表可以读取其他事务未提交的数据
7.2 数据导入与导出
- 数据导出与备份的区别
- 数据导出,导出的纯粹是业务数据
- 数据备份,备份的是数据文件、日志文件、索引文件等等
- 数据导出的分类
- SQL文档
- 文本文档
- 导入SQL文件
- mysqldump用来把业务数据导出成SQL文件,其中也包括了表结构
mysqldump -uroot-p[ no-data]逻辑库>路径
- mysqldump用来把业务数据导出成SQL文件,其中也包括了表结构