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

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

零、本文纲要

一、函数

  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基础-函数/约束/多表/事务的全部内容,感谢阅读。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容