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

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值
        • 建议主键一定要使用数字类型,因为数字的检索速度会非常快
        • 如果主键是数字类型,还可以设置自动增长
  • CREATE TABLE t_teacher( id INT PRIMARY KEY AUTO INCREMENT ... );
    • 非空约束 NOT NULL 字段值不能为NULL
      • 非空约束要求字段的值不能为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;
  • 查询语句的子句执行顺序
    • 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

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 正则表达式
  • 逻辑运算符
    • AND 与关系
      • OR 或关系
      • NOT 非关系
  • 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子句应该是第几个执行? FROM -> WHERE- >LECT -> ORDER BY ->LIMIT

4. 数据库的高级查询

4.1数据操作语言:聚合函数

什么是聚合函数

  • 聚合函数在数据的查询分析中,应用十分广泛。聚合函数可以对数据求和、求最大值和最小值、求平均值等等。 聚合函数
  • SUM函数
    • SUM函数用于求和,只能用于数字类型,字符类型的统计结果为0,日期类型统计结果是毫秒数相加。 SELECT SUM(ename) FROM t emp; SELECT SUM(sal) FROM t emp; WHERE deptno In (10, 20);
  • 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
  • MIN函数
    • MIN函数用于获得非空值的最小值。 SELECT MIN (empno) FROM t emp; SELECT MIN (hiredate) FRoM t empi
  • AVG函数
    • AVG函数用于获得非空值的平均值,非数字数据统计结果为0 SELECT AVG(sal+IFNULL(comm)) FROM t empi
  • COUNT函数
    • COUNT()用于获得包含空值的记录数, COUNT(列名)用于获得包含非空值的记录数。 SELECT COUNT(*) FROM t emp;
  • 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)

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

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表名

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,…,

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…]
    • 练习
      • 删除 SALES部门和该部门的全部员工记录
      • 删除每个低于部门平均底薪的员工记录
    • DELETE语句的表连接(二)
      • DELETE语句的表连接既可以是内连接,又可以是外连接 DELETE表1,……FROM表1 LEFT IRGHTJOIN 表2 ON条件
    • 快速删除数据表全部记录
      • DELETE语句是在事务机制下删除记录,删除记录之前,先把将要删除的记录保存到日志文件里,然后再删除记录
      • TRUNCATE语句在事务机制之外删除记录,速度远超过 DELETE语句 TRUNCATE TABLE表名

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偏移量时间单位)
  • 计算日期之间相隔的天数
    • DATEDIFFOI函数用来计算两个日期之间相差的天数 DATEDIFF(日期,日期)

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
  • 练习
    • 公司年庆决定组织员工集体旅游,每个部门旅游目的地是不同的。 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;

7.2 数据导入与导出

  • 数据导出与备份的区别
    • 数据导出,导出的纯粹是业务数据
    • 数据备份,备份的是数据文件、日志文件、索引文件等等
  • 数据导出的分类
    • SQL文档
    • 文本文档
  • 导入SQL文件
    • mysqldump用来把业务数据导出成SQL文件,其中也包括了表结构 mysqldump -uroot-p[ no-data]逻辑库>路径