美文网首页
MySQL基础-函数/约束/多表/事务

MySQL基础-函数/约束/多表/事务

作者: 石头耳东 | 来源:发表于2022-05-23 20:53 被阅读0次

    前言:本文皆为基础内容,已经熟练掌握的建议跳过,你有更重要的内容需要学习。

    零、本文纲要

    一、函数

    1. 字符串函数
    2. 数值函数
    3. 日期函数
    4. 流程函数

    二、约束

    1. 约束分类
    2. 外键约束

    三、多表查询

    1. 查询分类
    2. 内连接
    3. 外连接
    4. 自连接
    5. 子查询

    四、事务

    1. 控制事务
    2. 事务四大特性
    3. 并发事务问题
    4. 事务隔离级别

    一、函数

    1. 字符串函数

    函数 功能
    CONCAT(S1,S2,...Sn) 字符串拼接,将S1,S2,... Sn拼接成一个字符串
    LOWER(str) 将字符串str全部转为小写
    UPPER(str) 将字符串str全部转为大写
    LPAD(str,n,pad) 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
    RPAD(str,n,pad) 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度
    TRIM(str) 去掉字符串头部和尾部的空格
    SUBSTRING(str,start,len) 返回从字符串str从start位置起的len个长度的字符串

    UPDATE emp SET workno = LPAD(workno, 5, '0');

    2. 数值函数

    函数 功能
    CEIL(x) 向上取整
    FLOOR(x) 向下取整
    MOD(x,y) 返回x/y的模
    RAND() 返回0~1内的随机数
    ROUND(x,y) 求参数x的四舍五入的值,保留y位小数

    3. 日期函数

    函数 功能
    CURDATE() 返回当前日期
    CURTIME() 返回当前时间
    NOW() 返回当前日期和时间
    YEAR(date) 获取指定date的年份
    MONTH(date) 获取指定date的月份
    DAY(date) 获取指定date的日期
    DATE_ADD(date, INTERVAL exprtype) 返回一个日期/时间值加上一个时间间隔expr后的时间值
    DATEDIFF(date1,date2) 返回起始时间date1 和 结束时间date2之间的天数

    SELECT name, DATEDIFF(CURDATE(), entrydate) AS 'entrydays' FROM emp ORDER BY entrydays DESC;

    4. 流程函数

    函数 功能
    IF(value , t , f) 如果value为true,则返回t,否则返回f
    IFNULL(value1 , value2) 如果value1不为空,返回value1,否则返回value2
    CASE WHEN [ val1 ] THEN [res1] ...ELSE [ default ] END 如果val1为true,返回res1,... 否则返回default默认值
    CASE [ expr ] WHEN [ val1 ] THEN [res1] ... ELSE [ default ] END 如果expr的值等于val1,返回res1,... 否则返回default默认值

    SELECT
    name,
    ( CASE workaddress WHEN '北京' THEN '一线城市' WHEN '上海' THEN '一线城市' ELSE
    '二线城市' END ) AS '工作地址'
    FROM emp;

    二、约束

    1. 约束分类

    约束 描述 关键字
    非空约束 限制该字段的数据不能为null NOT NULL
    唯一约束 保证该字段的所有数据都是唯一、不重复的 UNIQUE
    主键约束 主键是一行数据的唯一标识,要求非空且唯一 PRIMARY KEY
    默认约束 保存数据时,如果未指定该字段的值,则采用默认值 DEFAULT
    检查约束(8.0.16版本之后) 保证字段值满足某一个条件 CHECK
    外键约束 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 FOREIGN KEY

    2. 外键约束

    • ① 添加外键

    CREATE TABLE 表名(
    字段名 数据类型,
    ...
    [CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名)
    );

    ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名)
    REFERENCES 主表 (主表列名) ;

    • ② 删除外键

    ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

    • ③ 删除/更新行为

    ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES
    主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;

    行为 说明
    NO ACTION 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则
    不允许删除/更新。 (与 RESTRICT 一致) 默认行为
    RESTRICT 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则
    不允许删除/更新。 (与 NO ACTION 一致) 默认行为
    CASCADE 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,
    则也删除/更新外键在子表中的记录
    SET NULL 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表
    中该外键值为null(这就要求该外键允许取null)
    SET DEFAULT 父表有变更时,子表将外键列设置成一个默认的值 (Innodb不支持)

    三、多表查询

    1. 查询分类

    • ① 连接查询

    内连接:相当于查询A、B交集部分数据
    外连接:
    左外连接:查询左表所有数据,以及两张表交集部分数据
    右外连接:查询右表所有数据,以及两张表交集部分数据
    自连接:当前表与自身的连接查询,自连接必须使用表别名

    • ② 子查询

    2. 内连接

    查询集合A与集合B的交集

    • ① 隐式内连接(常用)

    SELECT 字段列表 FROM 表1 , 表2 WHERE 条件 ... ;

    • ② 显式内连接

    SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ... ;

    -- 隐式内连接
    SELECT e.name emp_id, d.name dept_name FROM emp e , dept d WHERE e.dept_id = d.id;
    
    -- 显式内连接
    SELECT e.name emp_id, d.name dept_name FROM emp e INNER JOIN dept d ON e.dept_id = d.id;
    

    3. 外连接

    集合A或者集合B的全部,以及二者交集

    • ① 左外连接(常用)

    SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ... ;

    • ② 右外连接

    SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ... ;

    -- 左外连接
    SELECT e.*, d.name dept_name FROM emp e LEFT OUTER JOIN dept d ON e.dept_id = d.id;
    SELECT e.*, d.name dept_name FROM emp e LEFT JOIN dept d ON e.dept_id = d.id;
    
    -- 左外与右外等效的情形
    SELECT d.*, e.* FROM emp e RIGHT OUTER JOIN dept d ON e.dept_id = d.id;
    SELECT d.*, e.* FROM dept d LEFT OUTER JOIN emp e ON e.dept_id = d.id;
    

    4. 自连接

    • ① 自连接查询

    SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ... ;

    SELECT a.name 'employee', b.name 'leader' FROM emp a LEFT JOIN emp b ON a.managerid = b.id;
    
    • ② 联合查询

    SELECT 字段列表 FROM 表A ...
    UNION [ ALL ]
    SELECT 字段列表 FROM 表B ....;

    注意:
    对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
    UNION ALL 会将全部的数据【直接合并】在一起, UNION 会对合并之后的数据【去重】。

    5. 子查询

    SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );

    • ① 子查询特点

    Ⅰ 子查询外部的语句可以是 INSERT / UPDATE / DELETE / SELECT 的任何一个;
    Ⅱ 根据子查询位置可以是 WHERE之后 / FROM之后 / SELECT之后 的任何一个;
    Ⅲ 子查询结果的结果可以是 标量 / 列 / 行 / 表 的任何一个。

    • ② 标量子查询

    子查询结果为单个值

    -- 需求:查询 "销售部" 的所有员工信息
    -- 查询 "销售部" 部门ID

    select id from dept where name = '销售部';
    -- 根据 "销售部" 部门ID, 查询员工信息
    select * from emp where dept_id = (select id from dept where name = '销售部');

    • ③ 列子查询

    子查询结果为一列

    -- 需求:查询 "销售部" 和 "市场部" 的所有员工信息
    -- 查询 "销售部" 和 "市场部" 的部门ID
    select id from dept where name = '销售部' or name = '市场部';
    -- 根据部门ID, 查询员工信息
    select * from emp where dept_id in (select id from dept where name = '销售部' or name = '市场部');

    • ④ 行子查询

    子查询结果为一行

    -- 查询与 "乔布斯" 的薪资及直属领导相同的员工信息 ;
    -- 查询 "乔布斯" 的薪资及直属领导
    select salary, managerid from emp where name = '乔布斯';
    -- 查询与 "乔布斯" 的薪资及直属领导相同的员工信息 ;
    select * from emp where (salary, managerid) = (select salary, managerid from emp
    where name = '乔布斯');

    • ⑤ 表子查询

    子查询结果为多行多列

    -- 查询与 "乔布斯" , "库克" 的职位和薪资相同的员工信息
    -- 查询 "乔布斯" , "库克" 的职位和薪资
    select job, salary from emp where name = '乔布斯' or name = '库克';
    -- 查询与 "乔布斯" , "库克" 的职位和薪资相同的员工信息
    select * from emp where (job, salary) in ( select job, salary from emp where name = '乔布斯' or name = '库克' );

    不难看出,子查询的技巧就是先完成部分,再完成整体。

    四、事务

    1. 控制事务

    查看事务提交方式 SELECT @@autocommit ;

    • ① 方式一

    Ⅰ 设置事务提交方式
    SET @@autocommit = 0 ;
    Ⅱ 提交事务
    COMMIT;
    Ⅲ 回滚事务
    ROLLBACK;

    • ② 方式二

    Ⅰ 开启事务
    START TRANSACTION 或 BEGIN ;
    Ⅱ 提交事务
    COMMIT;
    Ⅲ 回滚事务
    ROLLBACK;

    2. 事务四大特性

    ACID:原子性(Atomicity)\一致性(Consistency)\隔离性(Isolation)\持久性(Durability)

    3. 并发事务问题

    Ⅰ 赃读:一个事务读到另外一个事务还没有提交的数据;
    Ⅱ 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读;
    Ⅲ 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 "幻影"。

    4. 事务隔离级别

    隔离级别 脏读 不可重复读 幻读
    Read uncommitted
    Read committed ×
    Repeatable Read(默认) × ×
    Serializable × × ×

    查看事务隔离级别
    SELECT @@TRANSACTION_ISOLATION;

    设置事务隔离级别
    SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

    五、结尾

    以上即为MySQL基础-函数/约束/多表/事务的全部内容,感谢阅读。

    相关文章

      网友评论

          本文标题:MySQL基础-函数/约束/多表/事务

          本文链接:https://www.haomeiwen.com/subject/uqvrprtx.html