SQL 语法
转载自:https://github.com/CyC2018/cs-notes
一、基础
数据库创建与使用:
1 | CREATE DATABASE test; |
- 库级操作:需要带上 DATABASE 字段,再写库名
- 表级操作:需要带上 TABLE 字段,再写表名
- 行级操作:只需写表名
二、创建表
1 | CREATE TABLE mytable ( |
四、插入
普通插入
1 | INSERT INTO mytable(col1, col2) |
五、更新
1 | UPDATE mytable |
六、删除
1 | DELETE FROM mytable |
七、查询
DISTINCT
相同值只会出现一次。它作用于所有列,也就是说所有列的值都相同才算相同。
1 | SELECT DISTINCT col1, col2 |
LIMIT
限制返回的行数。可以有两个参数,第一个参数为偏移(即跳过多少行);第二个参数为返回的总行数。
返回前 5 行:
1 | SELECT * |
1 | SELECT * |
返回第 3 ~ 5 行:
1 | SELECT * |
十、通配符
通配符也是用在过滤语句中,但它只能用于文本字段。
- % 匹配 >=0 个任意字符;
- _ 匹配 ==1 个任意字符;
- [ ] 可以匹配集合内的字符,例如 [ab] 将匹配字符 a 或者 b。用脱字符 ^ 可以对其进行否定,也就是不匹配集合内的字符。
使用 Like 来进行通配符匹配。
1 | SELECT * |
通配符位于开头处匹配会非常慢。
十二、函数
各个 DBMS 的函数都是不相同的,因此不可移植,以下主要是 MySQL 的函数。
汇总
函 数 | 说 明 |
---|---|
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值之和 |
AVG() 会忽略 NULL 行。
使用 DISTINCT 可以汇总不同的值。
1 | SELECT AVG(DISTINCT col1) AS avg_col |
十五、连接
连接用于连接多个表,使用 JOIN 关键字,并且条件语句使用 ON 而不是 WHERE。
连接可以替换子查询,并且比子查询的效率一般会更快。
可以用 AS 给列名、计算字段和表名取别名,给表名取别名是为了简化 SQL 语句以及连接相同表。
内连接
内连接又称等值连接,使用 INNER JOIN 关键字。
1 | SELECT A.value, B.value |
可以不明确使用 INNER JOIN,而使用普通查询并在 WHERE 中将两个表中要连接的列用等值方法连接起来。
1 | SELECT A.value, B.value |
自连接
自连接可以看成内连接的一种,只是连接的表是自身而已。
一张员工表,包含员工姓名和员工所属部门,要找出与 Jim 处在同一部门的所有员工姓名。
1 | SELECT e1.name |
自然连接
自然连接是把同名列通过等值测试连接起来的,同名列可以有多个。
内连接和自然连接的区别:内连接提供连接的列,而自然连接自动连接所有同名列。
1 | SELECT A.value, B.value |
外连接
外连接保留了没有关联的那些行。分为左外连接,右外连接以及全外连接,左外连接就是保留左表没有关联的行。
检索所有顾客的订单信息,包括还没有订单信息的顾客。
1 | SELECT Customers.cust_id, Customer.cust_name, Orders.order_id |
customers 表:
cust_id | cust_name |
---|---|
1 | a |
2 | b |
3 | c |
orders 表:
order_id | cust_id |
---|---|
1 | 1 |
2 | 1 |
3 | 3 |
4 | 3 |
结果:
cust_id | cust_name | order_id |
---|---|---|
1 | a | 1 |
1 | a | 2 |
3 | c | 3 |
3 | c | 4 |
2 | b | Null |