mysql

基础篇

通用语法及分类

  • DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)
  • DML: 数据操作语言,用来对数据库表中的数据进行增删改
  • DQL: 数据查询语言,用来查询数据库中表的记录
  • DCL: 数据控制语言,用来创建数据库用户、控制数据库的控制权限

DDL(数据定义语言)

数据定义语言

数据库操作

查询所有数据库:
SHOW DATABASES;
查询当前数据库:
SELECT DATABASE();
创建数据库:
CREATE DATABASE [ IF NOT EXISTS ] 数据库名 [ DEFAULT CHARSET 字符集] [COLLATE 排序规则 ];
删除数据库:
DROP DATABASE [ IF EXISTS ] 数据库名;
使用数据库:
USE 数据库名;

注意事项
  • UTF8字符集长度为3字节,有些符号占4字节,所以推荐用utf8mb4字符集

表操作

查询当前数据库所有表:
SHOW TABLES;
查询表结构:
DESC 表名;
查询指定表的建表语句:
SHOW CREATE TABLE 表名;

创建表:

  1. <span class="pln">CREATE TABLE <span class="pun">&#x8868;&#x540D;(</span></span>
  2. <span class="pln"> <span class="pun">&#x5B57;&#x6BB5;<span class="lit">1<span class="pln"> <span class="pun">&#x5B57;&#x6BB5;<span class="lit">1<span class="pun">&#x7C7B;&#x578B;<span class="pln"> <span class="pun">[<span class="pln">COMMENT <span class="pun">&#x5B57;&#x6BB5;<span class="lit">1<span class="pun">&#x6CE8;&#x91CA;],</span></span></span></span></span></span></span></span></span></span></span></span></span>
  3. <span class="pln"> <span class="pun">&#x5B57;&#x6BB5;<span class="lit">2<span class="pln"> <span class="pun">&#x5B57;&#x6BB5;<span class="lit">2<span class="pun">&#x7C7B;&#x578B;<span class="pln"> <span class="pun">[<span class="pln">COMMENT <span class="pun">&#x5B57;&#x6BB5;<span class="lit">2<span class="pun">&#x6CE8;&#x91CA;],</span></span></span></span></span></span></span></span></span></span></span></span></span>
  4. <span class="pln"> <span class="pun">&#x5B57;&#x6BB5;<span class="lit">3<span class="pln"> <span class="pun">&#x5B57;&#x6BB5;<span class="lit">3<span class="pun">&#x7C7B;&#x578B;<span class="pln"> <span class="pun">[<span class="pln">COMMENT <span class="pun">&#x5B57;&#x6BB5;<span class="lit">3<span class="pun">&#x6CE8;&#x91CA;],</span></span></span></span></span></span></span></span></span></span></span></span></span>
  5. <span class="pln"> <span class="pun">...</span></span>
  6. <span class="pln"> <span class="pun">&#x5B57;&#x6BB5;<span class="pln">n <span class="pun">&#x5B57;&#x6BB5;<span class="pln">n<span class="pun">&#x7C7B;&#x578B;<span class="pln"> <span class="pun">[<span class="pln">COMMENT <span class="pun">&#x5B57;&#x6BB5;<span class="pln">n<span class="pun">&#x6CE8;&#x91CA;]</span></span></span></span></span></span></span></span></span></span></span></span>
  7. <span class="pun">)[<span class="pln"> COMMENT <span class="pun">&#x8868;&#x6CE8;&#x91CA;<span class="pln"> <span class="pun">];</span></span></span></span></span>

最后一个字段后面没有逗号

添加字段:
ALTER TABLE &#x8868;&#x540D; ADD &#x5B57;&#x6BB5;&#x540D; &#x7C7B;&#x578B;(&#x957F;&#x5EA6;) [COMMENT &#x6CE8;&#x91CA;] [&#x7EA6;&#x675F;];
例: ALTER TABLE emp ADD nickname varchar(20) COMMENT '&#x6635;&#x79F0;';

修改数据类型:
ALTER TABLE &#x8868;&#x540D; MODIFY &#x5B57;&#x6BB5;&#x540D; &#x65B0;&#x6570;&#x636E;&#x7C7B;&#x578B;(&#x957F;&#x5EA6;);
修改字段名和字段类型:
ALTER TABLE &#x8868;&#x540D; CHANGE &#x65E7;&#x5B57;&#x6BB5;&#x540D; &#x65B0;&#x5B57;&#x6BB5;&#x540D; &#x7C7B;&#x578B;(&#x957F;&#x5EA6;) [COMMENT &#x6CE8;&#x91CA;] [&#x7EA6;&#x675F;];
例:将emp表的nickname字段修改为username,类型为varchar(30)
ALTER TABLE emp CHANGE nickname username varchar(30) COMMENT '&#x6635;&#x79F0;';

删除字段:
ALTER TABLE &#x8868;&#x540D; DROP &#x5B57;&#x6BB5;&#x540D;;

修改表名:
ALTER TABLE &#x8868;&#x540D; RENAME TO &#x65B0;&#x8868;&#x540D;

删除表:
DROP TABLE [IF EXISTS] &#x8868;&#x540D;;
删除表,并重新创建该表:
TRUNCATE TABLE &#x8868;&#x540D;;

DML(数据操作语言)

添加数据

指定字段:
INSERT INTO &#x8868;&#x540D; (&#x5B57;&#x6BB5;&#x540D;1, &#x5B57;&#x6BB5;&#x540D;2, ...) VALUES (&#x503C;1, &#x503C;2, ...);
全部字段:
INSERT INTO &#x8868;&#x540D; VALUES (&#x503C;1, &#x503C;2, ...);

批量添加数据:
INSERT INTO &#x8868;&#x540D; (&#x5B57;&#x6BB5;&#x540D;1, &#x5B57;&#x6BB5;&#x540D;2, ...) VALUES (&#x503C;1, &#x503C;2, ...), (&#x503C;1, &#x503C;2, ...), (&#x503C;1, &#x503C;2, ...);
INSERT INTO &#x8868;&#x540D; VALUES (&#x503C;1, &#x503C;2, ...), (&#x503C;1, &#x503C;2, ...), (&#x503C;1, &#x503C;2, ...);

注意事项
  • 字符串和日期类型数据应该包含在引号中
  • 插入的数据大小应该在字段的规定范围内

更新和删除数据

修改数据:
UPDATE &#x8868;&#x540D; SET &#x5B57;&#x6BB5;&#x540D;1 = &#x503C;1, &#x5B57;&#x6BB5;&#x540D;2 = &#x503C;2, ... [ WHERE &#x6761;&#x4EF6; ];
例:
UPDATE emp SET name = 'Jack' WHERE id = 1;

删除数据:
DELETE FROM &#x8868;&#x540D; [ WHERE &#x6761;&#x4EF6; ];

DQL(数据查询语言)

语法:

  1. <span class="pln">SELECT</span>
  2. <span class="pln"> <span class="pun">&#x5B57;&#x6BB5;&#x5217;&#x8868;</span></span>
  3. <span class="pln">FROM</span>
  4. <span class="pln"> <span class="pun">&#x8868;&#x540D;&#x5B57;&#x6BB5;</span></span>
  5. <span class="pln">WHERE</span>
  6. <span class="pln"> <span class="pun">&#x6761;&#x4EF6;&#x5217;&#x8868;</span></span>
  7. <span class="pln">GROUP BY</span>
  8. <span class="pln"> <span class="pun">&#x5206;&#x7EC4;&#x5B57;&#x6BB5;&#x5217;&#x8868;</span></span>
  9. <span class="pln">HAVING</span>
  10. <span class="pln"> <span class="pun">&#x5206;&#x7EC4;&#x540E;&#x7684;&#x6761;&#x4EF6;&#x5217;&#x8868;</span></span>
  11. <span class="pln">ORDER BY</span>
  12. <span class="pln"> <span class="pun">&#x6392;&#x5E8F;&#x5B57;&#x6BB5;&#x5217;&#x8868;</span></span>
  13. <span class="pln">LIMIT</span>
  14. <span class="pln"> <span class="pun">&#x5206;&#x9875;&#x53C2;&#x6570;</span></span>

基础查询

查询多个字段:
SELECT &#x5B57;&#x6BB5;1, &#x5B57;&#x6BB5;2, &#x5B57;&#x6BB5;3, ... FROM &#x8868;&#x540D;;
SELECT * FROM &#x8868;&#x540D;;

设置别名:
SELECT &#x5B57;&#x6BB5;1 [ AS &#x522B;&#x540D;1 ], &#x5B57;&#x6BB5;2 [ AS &#x522B;&#x540D;2 ], &#x5B57;&#x6BB5;3 [ AS &#x522B;&#x540D;3 ], ... FROM &#x8868;&#x540D;;
SELECT &#x5B57;&#x6BB5;1 [ &#x522B;&#x540D;1 ], &#x5B57;&#x6BB5;2 [ &#x522B;&#x540D;2 ], &#x5B57;&#x6BB5;3 [ &#x522B;&#x540D;3 ], ... FROM &#x8868;&#x540D;;

去除重复记录:
SELECT DISTINCT &#x5B57;&#x6BB5;&#x5217;&#x8868; FROM &#x8868;&#x540D;;

转义:
SELECT * FROM &#x8868;&#x540D; WHERE name LIKE '/_&#x5F20;&#x4E09;' ESCAPE '/'
/ 之后的_不作为通配符

条件查询

语法:
SELECT &#x5B57;&#x6BB5;&#x5217;&#x8868; FROM &#x8868;&#x540D; WHERE &#x6761;&#x4EF6;&#x5217;&#x8868;;

条件:

比较运算符功能 > 大于 >= 大于等于 < 小于

例子:

  1. <span class="pun">--<span class="pln"> <span class="pun">&#x5E74;&#x9F84;&#x7B49;&#x4E8E;<span class="lit">30</span></span></span></span>
  2. <span class="kwd">select<span class="pln"> <span class="pun">*<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">where<span class="pln"> age <span class="pun">=<span class="pln"> <span class="lit">30<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span>
  3. <span class="pun">--<span class="pln"> <span class="pun">&#x5E74;&#x9F84;&#x5C0F;&#x4E8E;<span class="lit">30</span></span></span></span>
  4. <span class="kwd">select<span class="pln"> <span class="pun">*<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">where<span class="pln"> age <span class="pun"><<span class="pln"> <span class="lit">30<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span>
  5. <span class="pun">--<span class="pln"> <span class="pun">&#x5C0F;&#x4E8E;&#x7B49;&#x4E8E;</span></span></span>
  6. <span class="kwd">select<span class="pln"> <span class="pun">*<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">where<span class="pln"> age <span class="pun"><=<span class="pln"> <span class="lit">30<span class="pun">;</span></span><!--=<span--></span></span></span></span></span></span></span></span></span>
  7. <span class="pun">--<span class="pln"> <span class="pun">&#x6CA1;&#x6709;&#x8EAB;&#x4EFD;&#x8BC1;</span></span></span>
  8. <span class="kwd">select<span class="pln"> <span class="pun">*<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">where<span class="pln"> idcard <span class="kwd">is<span class="pln"> <span class="kwd">null<span class="pln"> <span class="kwd">or<span class="pln"> idcard <span class="pun">=<span class="pln"> <span class="str">''<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  9. <span class="pun">--<span class="pln"> <span class="pun">&#x6709;&#x8EAB;&#x4EFD;&#x8BC1;</span></span></span>
  10. <span class="kwd">select<span class="pln"> <span class="pun">*<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">where<span class="pln"> idcard<span class="pun">;</span></span></span></span></span></span></span></span></span>
  11. <span class="kwd">select<span class="pln"> <span class="pun">*<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">where<span class="pln"> idcard <span class="kwd">is<span class="pln"> <span class="kwd">not<span class="pln"> <span class="kwd">null<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  12. <span class="pun">--<span class="pln"> <span class="pun">&#x4E0D;&#x7B49;&#x4E8E;</span></span></span>
  13. <span class="kwd">select<span class="pln"> <span class="pun">*<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">where<span class="pln"> age <span class="pun">!=<span class="pln"> <span class="lit">30<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span>
  14. <span class="pun">--<span class="pln"> <span class="pun">&#x5E74;&#x9F84;&#x5728;<span class="lit">20<span class="pun">&#x5230;<span class="lit">30<span class="pun">&#x4E4B;&#x95F4;</span></span></span></span></span></span></span>
  15. <span class="kwd">select<span class="pln"> <span class="pun">*<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">where<span class="pln"> age between <span class="lit">20<span class="pln"> <span class="kwd">and<span class="pln"> <span class="lit">30<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  16. <span class="kwd">select<span class="pln"> <span class="pun">*<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">where<span class="pln"> age <span class="pun">>=<span class="pln"> <span class="lit">20<span class="pln"> <span class="kwd">and<span class="pln"> age <span class="pun"><=<span class="pln"> <span class="lit">30<span class="pun">;</span></span><!--=<span--></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  17. <span class="pun">--<span class="pln"> <span class="pun">&#x4E0B;&#x9762;&#x8BED;&#x53E5;&#x4E0D;&#x62A5;&#x9519;&#xFF0C;&#x4F46;&#x67E5;&#x4E0D;&#x5230;&#x4EFB;&#x4F55;&#x4FE1;&#x606F;</span></span></span>
  18. <span class="kwd">select<span class="pln"> <span class="pun">*<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">where<span class="pln"> age between <span class="lit">30<span class="pln"> <span class="kwd">and<span class="pln"> <span class="lit">20<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  19. <span class="pun">--<span class="pln"> <span class="pun">&#x6027;&#x522B;&#x4E3A;&#x5973;&#x4E14;&#x5E74;&#x9F84;&#x5C0F;&#x4E8E;<span class="lit">30</span></span></span></span>
  20. <span class="kwd">select<span class="pln"> <span class="pun">*<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">where<span class="pln"> age <span class="pun"><<span class="pln"> <span class="lit">30<span class="pln"> <span class="kwd">and<span class="pln"> gender <span class="pun">=<span class="pln"> <span class="str">'&#x5973;'<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  21. <span class="pun">--<span class="pln"> <span class="pun">&#x5E74;&#x9F84;&#x7B49;&#x4E8E;<span class="lit">25<span class="pun">&#x6216;<span class="lit">30<span class="pun">&#x6216;<span class="lit">35</span></span></span></span></span></span></span></span>
  22. <span class="kwd">select<span class="pln"> <span class="pun">*<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">where<span class="pln"> age <span class="pun">=<span class="pln"> <span class="lit">25<span class="pln"> <span class="kwd">or<span class="pln"> age <span class="pun">=<span class="pln"> <span class="lit">30<span class="pln"> <span class="kwd">or<span class="pln"> age <span class="pun">=<span class="pln"> <span class="lit">35<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  23. <span class="kwd">select<span class="pln"> <span class="pun">*<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">where<span class="pln"> age <span class="kwd">in<span class="pln"> <span class="pun">(<span class="lit">25<span class="pun">,<span class="pln"> <span class="lit">30<span class="pun">,<span class="pln"> <span class="lit">35<span class="pun">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  24. <span class="pun">--<span class="pln"> <span class="pun">&#x59D3;&#x540D;&#x4E3A;&#x4E24;&#x4E2A;&#x5B57;</span></span></span>
  25. <span class="kwd">select<span class="pln"> <span class="pun">*<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">where<span class="pln"> name like <span class="str">'__'<span class="pun">;</span></span></span></span></span></span></span></span></span></span>
  26. <span class="pun">--<span class="pln"> <span class="pun">&#x8EAB;&#x4EFD;&#x8BC1;&#x6700;&#x540E;&#x4E3A;<span class="pln">X</span></span></span></span>
  27. <span class="kwd">select<span class="pln"> <span class="pun">*<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">where<span class="pln"> idcard like <span class="str">'%X'<span class="pun">;</span></span></span></span></span></span></span></span></span></span>

聚合查询(聚合函数)

常见聚合函数:

函数功能 count 统计数量 max 最大值 min 最小值 avg 平均值 sum 求和

语法:
SELECT &#x805A;&#x5408;&#x51FD;&#x6570;(&#x5B57;&#x6BB5;&#x5217;&#x8868;) FROM &#x8868;&#x540D;;
例:
SELECT count(id) from employee where workaddress = "&#x5E7F;&#x4E1C;&#x7701;";

分组查询

语法:
SELECT &#x5B57;&#x6BB5;&#x5217;&#x8868; FROM &#x8868;&#x540D; [ WHERE &#x6761;&#x4EF6; ] GROUP BY &#x5206;&#x7EC4;&#x5B57;&#x6BB5;&#x540D; [ HAVING &#x5206;&#x7EC4;&#x540E;&#x7684;&#x8FC7;&#x6EE4;&#x6761;&#x4EF6; ];

where 和 having 的区别:

  • 执行时机不同:where是分组之前进行过滤,不满足where条件不参与分组;having是分组后对结果进行过滤。
  • 判断条件不同:where不能对聚合函数进行判断,而having可以。

例子:

  1. <span class="pun">--<span class="pln"> <span class="pun">&#x6839;&#x636E;&#x6027;&#x522B;&#x5206;&#x7EC4;&#xFF0C;&#x7EDF;&#x8BA1;&#x7537;&#x6027;&#x548C;&#x5973;&#x6027;&#x6570;&#x91CF;&#xFF08;&#x53EA;&#x663E;&#x793A;&#x5206;&#x7EC4;&#x6570;&#x91CF;&#xFF0C;&#x4E0D;&#x663E;&#x793A;&#x54EA;&#x4E2A;&#x662F;&#x7537;&#x54EA;&#x4E2A;&#x662F;&#x5973;&#xFF09;</span></span></span>
  2. <span class="kwd">select<span class="pln"> count<span class="pun">(*)<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">group<span class="pln"> <span class="kwd">by<span class="pln"> gender<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span>
  3. <span class="pun">--<span class="pln"> <span class="pun">&#x6839;&#x636E;&#x6027;&#x522B;&#x5206;&#x7EC4;&#xFF0C;&#x7EDF;&#x8BA1;&#x7537;&#x6027;&#x548C;&#x5973;&#x6027;&#x6570;&#x91CF;</span></span></span>
  4. <span class="kwd">select<span class="pln"> gender<span class="pun">,<span class="pln"> count<span class="pun">(*)<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">group<span class="pln"> <span class="kwd">by<span class="pln"> gender<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span></span>
  5. <span class="pun">--<span class="pln"> <span class="pun">&#x6839;&#x636E;&#x6027;&#x522B;&#x5206;&#x7EC4;&#xFF0C;&#x7EDF;&#x8BA1;&#x7537;&#x6027;&#x548C;&#x5973;&#x6027;&#x7684;&#x5E73;&#x5747;&#x5E74;&#x9F84;</span></span></span>
  6. <span class="kwd">select<span class="pln"> gender<span class="pun">,<span class="pln"> avg<span class="pun">(<span class="pln">age<span class="pun">)<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">group<span class="pln"> <span class="kwd">by<span class="pln"> gender<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  7. <span class="pun">--<span class="pln"> <span class="pun">&#x5E74;&#x9F84;&#x5C0F;&#x4E8E;<span class="lit">45<span class="pun">&#xFF0C;&#x5E76;&#x6839;&#x636E;&#x5DE5;&#x4F5C;&#x5730;&#x5740;&#x5206;&#x7EC4;</span></span></span></span></span>
  8. <span class="kwd">select<span class="pln"> workaddress<span class="pun">,<span class="pln"> count<span class="pun">(*)<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">where<span class="pln"> age <span class="pun"><<span class="pln"> <span class="lit">45<span class="pln"> <span class="kwd">group<span class="pln"> <span class="kwd">by<span class="pln"> workaddress<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  9. <span class="pun">--<span class="pln"> <span class="pun">&#x5E74;&#x9F84;&#x5C0F;&#x4E8E;<span class="lit">45<span class="pun">&#xFF0C;&#x5E76;&#x6839;&#x636E;&#x5DE5;&#x4F5C;&#x5730;&#x5740;&#x5206;&#x7EC4;&#xFF0C;&#x83B7;&#x53D6;&#x5458;&#x5DE5;&#x6570;&#x91CF;&#x5927;&#x4E8E;&#x7B49;&#x4E8E;<span class="lit">3<span class="pun">&#x7684;&#x5DE5;&#x4F5C;&#x5730;&#x5740;</span></span></span></span></span></span></span>
  10. <span class="kwd">select<span class="pln"> workaddress<span class="pun">,<span class="pln"> count<span class="pun">(*)<span class="pln"> address_count <span class="kwd">from<span class="pln"> employee <span class="kwd">where<span class="pln"> age <span class="pun"><<span class="pln"> <span class="lit">45<span class="pln"> <span class="kwd">group<span class="pln"> <span class="kwd">by<span class="pln"> workaddress having address_count <span class="pun">>=<span class="pln"> <span class="lit">3<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
注意事项
  • 执行顺序:where > 聚合函数 > having
  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义

排序查询

语法:
SELECT &#x5B57;&#x6BB5;&#x5217;&#x8868; FROM &#x8868;&#x540D; ORDER BY &#x5B57;&#x6BB5;1 &#x6392;&#x5E8F;&#x65B9;&#x5F0F;1, &#x5B57;&#x6BB5;2 &#x6392;&#x5E8F;&#x65B9;&#x5F0F;2;

排序方式:

  • ASC: 升序(默认)
  • DESC: 降序

例子:

  1. <span class="pun">--<span class="pln"> <span class="pun">&#x6839;&#x636E;&#x5E74;&#x9F84;&#x5347;&#x5E8F;&#x6392;&#x5E8F;</span></span></span>
  2. <span class="pln">SELECT <span class="pun">*<span class="pln"> FROM employee ORDER BY age ASC<span class="pun">;</span></span></span></span>
  3. <span class="pln">SELECT <span class="pun">*<span class="pln"> FROM employee ORDER BY age<span class="pun">;</span></span></span></span>
  4. <span class="pun">--<span class="pln"> <span class="pun">&#x4E24;&#x5B57;&#x6BB5;&#x6392;&#x5E8F;&#xFF0C;&#x6839;&#x636E;&#x5E74;&#x9F84;&#x5347;&#x5E8F;&#x6392;&#x5E8F;&#xFF0C;&#x5165;&#x804C;&#x65F6;&#x95F4;&#x964D;&#x5E8F;&#x6392;&#x5E8F;</span></span></span>
  5. <span class="pln">SELECT <span class="pun">*<span class="pln"> FROM employee ORDER BY age ASC<span class="pun">,<span class="pln"> entrydate DESC<span class="pun">;</span></span></span></span></span></span>
注意事项

如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序

分页查询

语法:
SELECT &#x5B57;&#x6BB5;&#x5217;&#x8868; FROM &#x8868;&#x540D; LIMIT &#x8D77;&#x59CB;&#x7D22;&#x5F15;, &#x67E5;&#x8BE2;&#x8BB0;&#x5F55;&#x6570;;

例子:

  1. <span class="pun">--<span class="pln"> <span class="pun">&#x67E5;&#x8BE2;&#x7B2C;&#x4E00;&#x9875;&#x6570;&#x636E;&#xFF0C;&#x5C55;&#x793A;<span class="lit">10<span class="pun">&#x6761;</span></span></span></span></span>
  2. <span class="pln">SELECT <span class="pun">*<span class="pln"> FROM employee LIMIT <span class="lit">0<span class="pun">,<span class="pln"> <span class="lit">10<span class="pun">;</span></span></span></span></span></span></span></span>
  3. <span class="pun">--<span class="pln"> <span class="pun">&#x67E5;&#x8BE2;&#x7B2C;&#x4E8C;&#x9875;</span></span></span>
  4. <span class="pln">SELECT <span class="pun">*<span class="pln"> FROM employee LIMIT <span class="lit">10<span class="pun">,<span class="pln"> <span class="lit">10<span class="pun">;</span></span></span></span></span></span></span></span>
注意事项
  • 起始索引从0开始,起始索引 = (查询页码 – 1) * 每页显示记录数
  • 分页查询是数据库的方言,不同数据库有不同实现,MySQL是LIMIT
  • 如果查询的是第一页数据,起始索引可以省略,直接简写 LIMIT 10

DQL执行顺序

FROM -> WHERE -> GROUP BY -> SELECT -> ORDER BY -> LIMIT

mysql

DCL

管理用户

查询用户:

  1. <span class="pln">USE mysql<span class="pun">;</span></span>
  2. <span class="pln">SELECT <span class="pun">*<span class="pln"> FROM user<span class="pun">;</span></span></span></span>

创建用户:
CREATE USER '&#x7528;&#x6237;&#x540D;'@'&#x4E3B;&#x673A;&#x540D;' IDENTIFIED BY '&#x5BC6;&#x7801;';

修改用户密码:
ALTER USER '&#x7528;&#x6237;&#x540D;'@'&#x4E3B;&#x673A;&#x540D;' IDENTIFIED WITH mysql_native_password BY '&#x65B0;&#x5BC6;&#x7801;';

删除用户:
DROP USER '&#x7528;&#x6237;&#x540D;'@'&#x4E3B;&#x673A;&#x540D;';

例子:

  1. <span class="pun">--<span class="pln"> <span class="pun">&#x521B;&#x5EFA;&#x7528;&#x6237;<span class="pln">test<span class="pun">&#xFF0C;&#x53EA;&#x80FD;&#x5728;&#x5F53;&#x524D;&#x4E3B;&#x673A;<span class="pln">localhost<span class="pun">&#x8BBF;&#x95EE;</span></span></span></span></span></span></span>
  2. <span class="pln">create user <span class="str">'test'<span class="pun">@<span class="str">'localhost'<span class="pln"> identified <span class="kwd">by<span class="pln"> <span class="str">'123456'<span class="pun">;</span></span></span></span></span></span></span></span></span>
  3. <span class="pun">--<span class="pln"> <span class="pun">&#x521B;&#x5EFA;&#x7528;&#x6237;<span class="pln">test<span class="pun">&#xFF0C;&#x80FD;&#x5728;&#x4EFB;&#x610F;&#x4E3B;&#x673A;&#x8BBF;&#x95EE;</span></span></span></span></span>
  4. <span class="pln">create user <span class="str">'test'<span class="pun">@<span class="str">'%'<span class="pln"> identified <span class="kwd">by<span class="pln"> <span class="str">'123456'<span class="pun">;</span></span></span></span></span></span></span></span></span>
  5. <span class="pln">create user <span class="str">'test'<span class="pln"> identified <span class="kwd">by<span class="pln"> <span class="str">'123456'<span class="pun">;</span></span></span></span></span></span></span>
  6. <span class="pun">--<span class="pln"> <span class="pun">&#x4FEE;&#x6539;&#x5BC6;&#x7801;</span></span></span>
  7. <span class="pln">alter user <span class="str">'test'<span class="pun">@<span class="str">'localhost'<span class="pln"> identified <span class="kwd">with<span class="pln"> mysql_native_password <span class="kwd">by<span class="pln"> <span class="str">'1234'<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span>
  8. <span class="pun">--<span class="pln"> <span class="pun">&#x5220;&#x9664;&#x7528;&#x6237;</span></span></span>
  9. <span class="pln">drop user <span class="str">'test'<span class="pun">@<span class="str">'localhost'<span class="pun">;</span></span></span></span></span>
注意事项
  • 主机名可以使用 % 通配

权限控制

常用权限:

权限说明 ALL, ALL PRIVILEGES 所有权限 SELECT 查询数据 INSERT 插入数据 UPDATE 修改数据 DELETE 删除数据 ALTER 修改表 DROP 删除数据库/表/视图 CREATE 创建数据库/表

更多权限请看权限一览表

查询权限:
SHOW GRANTS FOR '&#x7528;&#x6237;&#x540D;'@'&#x4E3B;&#x673A;&#x540D;';

授予权限:
GRANT &#x6743;&#x9650;&#x5217;&#x8868; ON &#x6570;&#x636E;&#x5E93;&#x540D;.&#x8868;&#x540D; TO '&#x7528;&#x6237;&#x540D;'@'&#x4E3B;&#x673A;&#x540D;';

撤销权限:
REVOKE &#x6743;&#x9650;&#x5217;&#x8868; ON &#x6570;&#x636E;&#x5E93;&#x540D;.&#x8868;&#x540D; FROM '&#x7528;&#x6237;&#x540D;'@'&#x4E3B;&#x673A;&#x540D;';

注意事项
  • 多个权限用逗号分隔
  • 授权时,数据库名和表名可以用 * 进行通配,代表所有

函数

  • 字符串函数
  • 数值函数
  • 日期函数
  • 流程函数

字符串函数

常用函数:

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

使用示例:

  1. <span class="pun">--<span class="pln"> <span class="pun">&#x62FC;&#x63A5;</span></span></span>
  2. <span class="pln">SELECT CONCAT<span class="pun">(<span class="str">'Hello'<span class="pun">,<span class="pln"> <span class="str">'World'<span class="pun">);</span></span></span></span></span></span></span>
  3. <span class="pun">--<span class="pln"> <span class="pun">&#x5C0F;&#x5199;</span></span></span>
  4. <span class="pln">SELECT LOWER<span class="pun">(<span class="str">'Hello'<span class="pun">);</span></span></span></span>
  5. <span class="pun">--<span class="pln"> <span class="pun">&#x5927;&#x5199;</span></span></span>
  6. <span class="pln">SELECT UPPER<span class="pun">(<span class="str">'Hello'<span class="pun">);</span></span></span></span>
  7. <span class="pun">--<span class="pln"> <span class="pun">&#x5DE6;&#x586B;&#x5145;</span></span></span>
  8. <span class="pln">SELECT LPAD<span class="pun">(<span class="str">'01'<span class="pun">,<span class="pln"> <span class="lit">5<span class="pun">,<span class="pln"> <span class="str">'-'<span class="pun">);</span></span></span></span></span></span></span></span></span></span>
  9. <span class="pun">--<span class="pln"> <span class="pun">&#x53F3;&#x586B;&#x5145;</span></span></span>
  10. <span class="pln">SELECT RPAD<span class="pun">(<span class="str">'01'<span class="pun">,<span class="pln"> <span class="lit">5<span class="pun">,<span class="pln"> <span class="str">'-'<span class="pun">);</span></span></span></span></span></span></span></span></span></span>
  11. <span class="pun">--<span class="pln"> <span class="pun">&#x53BB;&#x9664;&#x7A7A;&#x683C;</span></span></span>
  12. <span class="pln">SELECT TRIM<span class="pun">(<span class="str">' Hello World '<span class="pun">);</span></span></span></span>
  13. <span class="pun">--<span class="pln"> <span class="pun">&#x5207;&#x7247;&#xFF08;&#x8D77;&#x59CB;&#x7D22;&#x5F15;&#x4E3A;<span class="lit">1<span class="pun">&#xFF09;</span></span></span></span></span>
  14. <span class="pln">SELECT SUBSTRING<span class="pun">(<span class="str">'Hello World'<span class="pun">,<span class="pln"> <span class="lit">1<span class="pun">,<span class="pln"> <span class="lit">5<span class="pun">);</span></span></span></span></span></span></span></span></span></span>

数值函数

常见函数:

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

日期函数

常用函数:

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

例子:

  1. <span class="pun">--<span class="pln"> DATE_ADD</span></span>
  2. <span class="pln">SELECT DATE_ADD<span class="pun">(<span class="pln">NOW<span class="pun">(),<span class="pln"> INTERVAL <span class="lit">70<span class="pln"> YEAR<span class="pun">);</span></span></span></span></span></span></span></span>

流程函数

常用函数:

函数功能 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默认值

例子:

  1. <span class="kwd">select</span>
  2. <span class="pln"> name<span class="pun">,</span></span>
  3. <span class="pln"> <span class="pun">(<span class="kwd">case<span class="pln"> <span class="kwd">when<span class="pln"> age <span class="pun">><span class="pln"> <span class="lit">30<span class="pln"> <span class="kwd">then<span class="pln"> <span class="str">'&#x4E2D;&#x5E74;'<span class="pln"> <span class="kwd">else<span class="pln"> <span class="str">'&#x9752;&#x5E74;'<span class="pln"> <span class="kwd">end<span class="pun">)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  4. <span class="kwd">from<span class="pln"> employee<span class="pun">;</span></span></span>
  5. <span class="kwd">select</span>
  6. <span class="pln"> name<span class="pun">,</span></span>
  7. <span class="pln"> <span class="pun">(<span class="kwd">case<span class="pln"> workaddress <span class="kwd">when<span class="pln"> <span class="str">'&#x5317;&#x4EAC;&#x5E02;'<span class="pln"> <span class="kwd">then<span class="pln"> <span class="str">'&#x4E00;&#x7EBF;&#x57CE;&#x5E02;'<span class="pln"> <span class="kwd">when<span class="pln"> <span class="str">'&#x4E0A;&#x6D77;&#x5E02;'<span class="pln"> <span class="kwd">then<span class="pln"> <span class="str">'&#x4E00;&#x7EBF;&#x57CE;&#x5E02;'<span class="pln"> <span class="kwd">else<span class="pln"> <span class="str">'&#x4E8C;&#x7EBF;&#x57CE;&#x5E02;'<span class="pln"> <span class="kwd">end<span class="pun">)<span class="pln"> <span class="kwd">as<span class="pln"> <span class="str">'&#x5DE5;&#x4F5C;&#x5730;&#x5740;'</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  8. <span class="kwd">from<span class="pln"> employee<span class="pun">;</span></span></span>

约束

分类:

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

约束是作用于表中字段上的,可以再创建表/修改表的时候添加约束。

常用约束

约束条件关键字 主键 PRIMARY KEY 自动增长 AUTO_INCREMENT 不为空 NOT NULL 唯一 UNIQUE 逻辑条件 CHECK 默认值 DEFAULT

例子:

  1. <span class="pln">create table user<span class="pun">(</span></span>
  2. <span class="pln"> id <span class="kwd">int<span class="pln"> primary key auto_increment<span class="pun">,</span></span></span></span>
  3. <span class="pln"> name varchar<span class="pun">(<span class="lit">10<span class="pun">)<span class="pln"> <span class="kwd">not<span class="pln"> <span class="kwd">null<span class="pln"> unique<span class="pun">,</span></span></span></span></span></span></span></span></span></span>
  4. <span class="pln"> age <span class="kwd">int<span class="pln"> check<span class="pun">(<span class="pln">age <span class="pun">><span class="pln"> <span class="lit">0<span class="pln"> <span class="kwd">and<span class="pln"> age <span class="pun"><<span class="pln"> <span class="lit">120<span class="pun">),</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  5. <span class="pln"> status <span class="kwd">char<span class="pun">(<span class="lit">1<span class="pun">)<span class="pln"> <span class="kwd">default<span class="pln"> <span class="str">'1'<span class="pun">,</span></span></span></span></span></span></span></span></span></span>
  6. <span class="pln"> gender <span class="kwd">char<span class="pun">(<span class="lit">1<span class="pun">)</span></span></span></span></span>
  7. <span class="pun">);</span>

外键约束

添加外键:

  1. <span class="pln">CREATE TABLE <span class="pun">&#x8868;&#x540D;(</span></span>
  2. <span class="pln"> <span class="pun">&#x5B57;&#x6BB5;&#x540D;<span class="pln"> <span class="pun">&#x5B57;&#x6BB5;&#x7C7B;&#x578B;,</span></span></span></span>
  3. <span class="pln"> <span class="pun">...</span></span>
  4. <span class="pln"> <span class="pun">[<span class="pln">CONSTRAINT<span class="pun">]<span class="pln"> <span class="pun">[&#x5916;&#x952E;&#x540D;&#x79F0;]<span class="pln"> FOREIGN KEY<span class="pun">(&#x5916;&#x952E;&#x5B57;&#x6BB5;&#x540D;)<span class="pln"> REFERENCES <span class="pun">&#x4E3B;&#x8868;(&#x4E3B;&#x8868;&#x5217;&#x540D;)</span></span></span></span></span></span></span></span></span></span>
  5. <span class="pun">);</span>
  6. <span class="pln">ALTER TABLE <span class="pun">&#x8868;&#x540D;<span class="pln"> ADD CONSTRAINT <span class="pun">&#x5916;&#x952E;&#x540D;&#x79F0;<span class="pln"> FOREIGN KEY <span class="pun">(&#x5916;&#x952E;&#x5B57;&#x6BB5;&#x540D;)<span class="pln"> REFERENCES <span class="pun">&#x4E3B;&#x8868;(&#x4E3B;&#x8868;&#x5217;&#x540D;);</span></span></span></span></span></span></span></span>
  7. <span class="pun">--<span class="pln"> <span class="pun">&#x4F8B;&#x5B50;</span></span></span>
  8. <span class="pln">alter table emp add constraint fk_emp_dept_id foreign key<span class="pun">(<span class="pln">dept_id<span class="pun">)<span class="pln"> references dept<span class="pun">(<span class="pln">id<span class="pun">);</span></span></span></span></span></span></span></span>

删除外键:
ALTER TABLE &#x8868;&#x540D; DROP FOREIGN KEY &#x5916;&#x952E;&#x540D;;

删除/更新行为

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

更改删除/更新行为:
ALTER TABLE &#x8868;&#x540D; ADD CONSTRAINT &#x5916;&#x952E;&#x540D;&#x79F0; FOREIGN KEY (&#x5916;&#x952E;&#x5B57;&#x6BB5;) REFERENCES &#x4E3B;&#x8868;&#x540D;(&#x4E3B;&#x8868;&#x5B57;&#x6BB5;&#x540D;) ON UPDATE &#x884C;&#x4E3A; ON DELETE &#x884C;&#x4E3A;;

多表查询

多表关系

  • 一对多(多对一)
  • 多对多
  • 一对一

一对多

案例:部门与员工
关系:一个部门对应多个员工,一个员工对应一个部门
实现:在多的一方建立外键,指向一的一方的主键

多对多

案例:学生与课程
关系:一个学生可以选多门课程,一门课程也可以供多个学生选修
实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

一对一

案例:用户与用户详情
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率
实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

查询

合并查询(笛卡尔积,会展示所有组合结果):
select * from employee, dept;

笛卡尔积:两个集合A集合和B集合的所有组合情况(在多表查询时,需要消除无效的笛卡尔积)

消除无效笛卡尔积:
select * from employee, dept where employee.dept = dept.id;

内连接查询

内连接查询的是两张表交集的部分

隐式内连接:
SELECT &#x5B57;&#x6BB5;&#x5217;&#x8868; FROM &#x8868;1, &#x8868;2 WHERE &#x6761;&#x4EF6; ...;

显式内连接:
SELECT &#x5B57;&#x6BB5;&#x5217;&#x8868; FROM &#x8868;1 [ INNER ] JOIN &#x8868;2 ON &#x8FDE;&#x63A5;&#x6761;&#x4EF6; ...;

显式性能比隐式高

例子:

  1. <span class="pun">--<span class="pln"> <span class="pun">&#x67E5;&#x8BE2;&#x5458;&#x5DE5;&#x59D3;&#x540D;&#xFF0C;&#x53CA;&#x5173;&#x8054;&#x7684;&#x90E8;&#x95E8;&#x7684;&#x540D;&#x79F0;</span></span></span>
  2. <span class="pun">--<span class="pln"> <span class="pun">&#x9690;&#x5F0F;</span></span></span>
  3. <span class="kwd">select<span class="pln"> e<span class="pun">.<span class="pln">name<span class="pun">,<span class="pln"> d<span class="pun">.<span class="pln">name <span class="kwd">from<span class="pln"> employee <span class="kwd">as<span class="pln"> e<span class="pun">,<span class="pln"> dept <span class="kwd">as<span class="pln"> d <span class="kwd">where<span class="pln"> e<span class="pun">.<span class="pln">dept <span class="pun">=<span class="pln"> d<span class="pun">.<span class="pln">id<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  4. <span class="pun">--<span class="pln"> <span class="pun">&#x663E;&#x5F0F;</span></span></span>
  5. <span class="kwd">select<span class="pln"> e<span class="pun">.<span class="pln">name<span class="pun">,<span class="pln"> d<span class="pun">.<span class="pln">name <span class="kwd">from<span class="pln"> employee <span class="kwd">as<span class="pln"> e inner join dept <span class="kwd">as<span class="pln"> d on e<span class="pun">.<span class="pln">dept <span class="pun">=<span class="pln"> d<span class="pun">.<span class="pln">id<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

外连接查询

左外连接:
查询左表所有数据,以及两张表交集部分数据
SELECT &#x5B57;&#x6BB5;&#x5217;&#x8868; FROM &#x8868;1 LEFT [ OUTER ] JOIN &#x8868;2 ON &#x6761;&#x4EF6; ...;
相当于查询表1的所有数据,包含表1和表2交集部分数据

右外连接:
查询右表所有数据,以及两张表交集部分数据
SELECT &#x5B57;&#x6BB5;&#x5217;&#x8868; FROM &#x8868;1 RIGHT [ OUTER ] JOIN &#x8868;2 ON &#x6761;&#x4EF6; ...;

例子:

  1. <span class="pun">--<span class="pln"> <span class="pun">&#x5DE6;</span></span></span>
  2. <span class="kwd">select<span class="pln"> e<span class="pun">.*,<span class="pln"> d<span class="pun">.<span class="pln">name <span class="kwd">from<span class="pln"> employee <span class="kwd">as<span class="pln"> e left outer join dept <span class="kwd">as<span class="pln"> d on e<span class="pun">.<span class="pln">dept <span class="pun">=<span class="pln"> d<span class="pun">.<span class="pln">id<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  3. <span class="kwd">select<span class="pln"> d<span class="pun">.<span class="pln">name<span class="pun">,<span class="pln"> e<span class="pun">.*<span class="pln"> <span class="kwd">from<span class="pln"> dept d left outer join emp e on e<span class="pun">.<span class="pln">dept <span class="pun">=<span class="pln"> d<span class="pun">.<span class="pln">id<span class="pun">;<span class="pln"> <span class="pun">--<span class="pln"> <span class="pun">&#x8FD9;&#x6761;&#x8BED;&#x53E5;&#x4E0E;&#x4E0B;&#x9762;&#x7684;&#x8BED;&#x53E5;&#x6548;&#x679C;&#x4E00;&#x6837;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  4. <span class="pun">--<span class="pln"> <span class="pun">&#x53F3;</span></span></span>
  5. <span class="kwd">select<span class="pln"> d<span class="pun">.<span class="pln">name<span class="pun">,<span class="pln"> e<span class="pun">.*<span class="pln"> <span class="kwd">from<span class="pln"> employee <span class="kwd">as<span class="pln"> e right outer join dept <span class="kwd">as<span class="pln"> d on e<span class="pun">.<span class="pln">dept <span class="pun">=<span class="pln"> d<span class="pun">.<span class="pln">id<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

左连接可以查询到没有dept的employee,右连接可以查询到没有employee的dept

自连接查询

当前表与自身的连接查询,自连接必须使用表别名

语法:
SELECT &#x5B57;&#x6BB5;&#x5217;&#x8868; FROM &#x8868;A &#x522B;&#x540D;A JOIN &#x8868;A &#x522B;&#x540D;B ON &#x6761;&#x4EF6; ...;

自连接查询,可以是内连接查询,也可以是外连接查询

例子:

  1. <span class="pun">--<span class="pln"> <span class="pun">&#x67E5;&#x8BE2;&#x5458;&#x5DE5;&#x53CA;&#x5176;&#x6240;&#x5C5E;&#x9886;&#x5BFC;&#x7684;&#x540D;&#x5B57;</span></span></span>
  2. <span class="kwd">select<span class="pln"> a<span class="pun">.<span class="pln">name<span class="pun">,<span class="pln"> b<span class="pun">.<span class="pln">name <span class="kwd">from<span class="pln"> employee a<span class="pun">,<span class="pln"> employee b <span class="kwd">where<span class="pln"> a<span class="pun">.<span class="pln">manager <span class="pun">=<span class="pln"> b<span class="pun">.<span class="pln">id<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  3. <span class="pun">--<span class="pln"> <span class="pun">&#x6CA1;&#x6709;&#x9886;&#x5BFC;&#x7684;&#x4E5F;&#x67E5;&#x8BE2;&#x51FA;&#x6765;</span></span></span>
  4. <span class="kwd">select<span class="pln"> a<span class="pun">.<span class="pln">name<span class="pun">,<span class="pln"> b<span class="pun">.<span class="pln">name <span class="kwd">from<span class="pln"> employee a left join employee b on a<span class="pun">.<span class="pln">manager <span class="pun">=<span class="pln"> b<span class="pun">.<span class="pln">id<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

联合查询 union, union all

把多次查询的结果合并,形成一个新的查询集

语法:

  1. <span class="pln">SELECT <span class="pun">&#x5B57;&#x6BB5;&#x5217;&#x8868;<span class="pln"> FROM <span class="pun">&#x8868;<span class="pln">A <span class="pun">...</span></span></span></span></span></span>
  2. <span class="pln">UNION <span class="pun">[<span class="pln">ALL<span class="pun">]</span></span></span></span>
  3. <span class="pln">SELECT <span class="pun">&#x5B57;&#x6BB5;&#x5217;&#x8868;<span class="pln"> FROM <span class="pun">&#x8868;<span class="pln">B <span class="pun">...</span></span></span></span></span></span>

注意事项

  • UNION ALL 会有重复结果,UNION 不会
  • 联合查询比使用or效率高,不会使索引失效

子查询

SQL语句中嵌套SELECT语句,称谓嵌套查询,又称子查询。
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2);
子查询外部的语句可以是 INSERT / UPDATE / DELETE / SELECT 的任何一个

根据子查询结果可以分为:

  • 标量子查询(子查询结果为单个值)
  • 列子查询(子查询结果为一列)
  • 行子查询(子查询结果为一行)
  • 表子查询(子查询结果为多行多列)

根据子查询位置可分为:

  • WHERE 之后
  • FROM 之后
  • SELECT 之后

标量子查询

子查询返回的结果是单个值(数字、字符串、日期等)。
常用操作符:- < > > >= <

Original: https://www.cnblogs.com/Cxxxd/p/16727741.html
Author: Cxxxd
Title: mysql

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/713909/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球