![c0cd06bd2b2c0362f9d4a3a15592e3cf.png](https://img-blog.csdnimg.cn/img_convert/c0cd06bd2b2c0362f9d4a3a15592e3cf.png)
来源:收藏!SQL语法全集合!
出处:PHP开源社区
![d7c948b6f3c42343f2c568c66ea9e28f.png](https://img-blog.csdnimg.cn/img_convert/d7c948b6f3c42343f2c568c66ea9e28f.png)
- 如果一个
JOIN
至少有一个公共字段并且它们之间存在关系,则该JOIN
可以在两个或多个表上工作。 - 连接用于连接多个表,使用
JOIN
关键字,并且条件语句使用ON
而不是WHERE
。 JOIN
保持基表(结构和数据)不变。JOIN
有两种连接类型:内连接和外连接。- 内连接又称等值连接,使用 INNER
JOIN
关键字。在没有条件语句的情况下返回笛卡尔积。- 自连接可以看成内连接的一种,只是连接的表是自身而已。
- 自然连接是把同名列通过 = 测试连接起来的,同名列可以有多个。
- 内连接 vs 自然连接
- 内连接提供连接的列,而自然连接自动连接所有同名列。
- 外连接返回一个表中的所有行,并且仅返回来自次表中满足连接条件的那些行,即两个表中的列是相等的。外连接分为左外连接、右外连接、全外连接(Mysql 不支持)。
- 左外连接就是保留左表没有关联的行。
- 右外连接就是保留右表没有关联的行。
- 连接 vs 子查询
- 连接可以替换子查询,并且比子查询的效率一般会更快。
![af940bbcec021b9e38bcc733a7a23aa8.png](https://img-blog.csdnimg.cn/img_convert/af940bbcec021b9e38bcc733a7a23aa8.png)
内连接(INNER JOIN)
SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;
自连接
SELECT c1.cust_id, c1.cust_name, c1.cust_contact
FROM customers c1, customers c2
WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact = 'Jim Jones';
自然连接(NATURAL JOIN)
SELECT *
FROM Products
NATURAL JOIN Customers;
左连接(LEFT JOIN)
SELECT customers.cust_id, orders.order_num
FROM customers LEFT JOIN orders
ON customers.cust_id = orders.cust_id;
右连接(RIGHT JOIN)
SELECT customers.cust_id, orders.order_num
FROM customers RIGHT JOIN orders
ON customers.cust_id = orders.cust_id;
组合(UNION)
UNION
运算符将两个或更多查询的结果组合起来,并生成一个结果集,其中包含来自UNION
中参与查询的提取行。UNION
基本规则- 所有查询的列数和列顺序必须相同。
- 每个查询中涉及表的列的数据类型必须相同或兼容。
- 通常返回的列名取自第一个查询。
- 默认会去除相同行,如果需要保留相同行,使用
UNION ALL
。 - 只能包含一个
ORDER BY
子句,并且必须位于语句的最后。 - 应用场景
- 在一个查询中从不同的表返回结构数据。
- 对一个表执行多个查询,按一个查询返回数据。
组合查询
SELECT cust_name, cust_contact, cust_email
FROM customers
WHERE cust_state IN ('IL', 'IN', 'MI')
UNION
SELECT cust_name, cust_contact, cust_email
FROM customers
WHERE cust_name = 'Fun4All';
JOIN vs UNION
- JOIN vs UNION
JOIN
中连接表的列可能不同,但在UNION
中,所有查询的列数和列顺序必须相同。UNION
将查询之后的行放在一起(垂直放置),但JOIN
将查询之后的列放在一起(水平放置),即它构成一个笛卡尔积。
![535af44a78abd64397f04f79fd938565.png](https://img-blog.csdnimg.cn/img_convert/535af44a78abd64397f04f79fd938565.png)
![0587a817adddcadc15e7c1acf99fec44.png](https://img-blog.csdnimg.cn/img_convert/0587a817adddcadc15e7c1acf99fec44.png)
其中, SOUNDEX() 可以将一个字符串转换为描述其语音表示的字母数字模式。
SELECT *
FROM mytable
WHERE SOUNDEX(col1) = SOUNDEX('apple')
日期和时间处理
- 日期格式:
YYYY-MM-DD
- 时间格式:
HH:MM:SS
![3183075ddab1cce0512e63f03a8c557c.png](https://img-blog.csdnimg.cn/img_convert/3183075ddab1cce0512e63f03a8c557c.png)
![fd1833a59f9470a4c84fad82b2be2ed9.png](https://img-blog.csdnimg.cn/img_convert/fd1833a59f9470a4c84fad82b2be2ed9.png)
![852ea8ef04398d44606510043f13bf83.png](https://img-blog.csdnimg.cn/img_convert/852ea8ef04398d44606510043f13bf83.png)
使用 DISTINCT 可以让汇总函数值汇总不同的值。
SELECT AVG(DISTINCT col1) AS avg_col
FROM mytable
![427288eb0962867109babccf2a022cf5.png](https://img-blog.csdnimg.cn/img_convert/427288eb0962867109babccf2a022cf5.png)
ORDER BY
ORDER BY
用于对结果集进行排序。ASC
:升序(默认)DESC
:降序
- 可以按多个列进行排序,并且为每个列指定不同的排序方式
指定多个列的排序方向
SELECT * FROM products
ORDER BY prod_price DESC, prod_name ASC;
GROUP BY
GROUP BY
子句将记录分组到汇总行中。GROUP BY
为每个组返回一个记录。GROUP BY
通常还涉及聚合:COUNT,MAX,SUM,AVG 等。GROUP BY
可以按一列或多列进行分组。GROUP BY
按分组字段进行排序后,ORDER BY
可以以汇总字段来进行排序。
分组
SELECT cust_name, COUNT(cust_address) AS addr_num
FROM Customers GROUP BY cust_name;
分组后排序
SELECT cust_name, COUNT(cust_address) AS addr_num
FROM Customers GROUP BY cust_name
ORDER BY cust_name DESC;
HAVING
HAVING
用于对汇总的GROUP BY
结果进行过滤。HAVING
要求存在一个GROUP BY
子句。WHERE
和HAVING
可以在相同的查询中。HAVING
vsWHERE
WHERE
和HAVING
都是用于过滤。HAVING
适用于汇总的组记录;而 WHERE 适用于单个记录。
使用 WHERE 和 HAVING 过滤数据
SELECT cust_name, COUNT(*) AS num
FROM Customers
WHERE cust_email IS NOT NULL
GROUP BY cust_name
HAVING COUNT(*) >= 1;
(以下为 DDL 语句用法)
![461d97e6ab0718307c4b2518ae50d7ec.png](https://img-blog.csdnimg.cn/img_convert/461d97e6ab0718307c4b2518ae50d7ec.png)
数据库(DATABASE)
创建数据库
CREATE DATABASE test;
删除数据库
DROP DATABASE test;
选择数据库
USE test;
数据表(TABLE)
创建数据表
普通创建
CREATE TABLE user (
id int(10) unsigned NOT NULL COMMENT 'Id',
username varchar(64) NOT NULL DEFAULT 'default' COMMENT '用户名',
password varchar(64) NOT NULL DEFAULT 'default' COMMENT '密码',
email varchar(64) NOT NULL DEFAULT 'default' COMMENT '邮箱'
) COMMENT='用户表';
根据已有的表创建新表
CREATE TABLE vip_user AS
SELECT * FROM user;
删除数据表
DROP TABLE user;
修改数据表
添加列
ALTER TABLE user
ADD age int(3);
删除列
ALTER TABLE user
DROP COLUMN age;
修改列
ALTER TABLE `user`
MODIFY COLUMN age tinyint;
添加主键
ALTER TABLE user
ADD PRIMARY KEY (id);
删除主键
ALTER TABLE user
DROP PRIMARY KEY;
视图(VIEW)
![f9847c649d60eb16e3428d156629ca94.png](https://img-blog.csdnimg.cn/img_convert/f9847c649d60eb16e3428d156629ca94.png)
创建视图
CREATE VIEW top_10_user_view AS
SELECT id, username
FROM user
WHERE id < 10;
删除视图
DROP VIEW top_10_user_view;
索引(INDEX)
![cb4b6e485a56d8647809c2e733cc6498.png](https://img-blog.csdnimg.cn/img_convert/cb4b6e485a56d8647809c2e733cc6498.png)
创建索引
CREATE INDEX user_index
ON user (id);
创建唯一索引
CREATE UNIQUE INDEX user_index
ON user (id);
删除索引
ALTER TABLE user
DROP INDEX user_index;
约束
![25b8c48249484a9fb0ef199f23181d70.png](https://img-blog.csdnimg.cn/img_convert/25b8c48249484a9fb0ef199f23181d70.png)
创建表时使用约束条件:
CREATE TABLE Users (
Id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增Id',
Username VARCHAR(64) NOT NULL UNIQUE DEFAULT 'default' COMMENT '用户名',
Password VARCHAR(64) NOT NULL DEFAULT 'default' COMMENT '密码',
Email VARCHAR(64) NOT NULL DEFAULT 'default' COMMENT '邮箱地址',
Enabled TINYINT(4) DEFAULT NULL COMMENT '是否有效',
PRIMARY KEY (Id)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
(以下为 TCL 语句用法)