最好的教材当然是官方文档:
https://dev.mysql.com/doc/refman/5.7/en/
作为一个至今依然被选修英文的英文盲觉得文档写得还是很通俗易懂,只要你够耐心。
参考:《MySQL必知必会》
distinct
DISTINCT关键字应用于所有列而不仅仅是它的前置列。
SELECT DISTINCT vend_id,prod_price from product.products
# 返回vend_id,prod_price组合不同的值
SELECT DISTINCT vend_id,DISTINCT prod_price from product.products
# 错误的语法,也是不符合逻辑的,比如对于(‘aa’,1),(‘aa’,2),'('bb',1),(‘bb’,2)倘若该句得以执行的话,那么('aa',1),('bb',2)或(‘aa’,2),(‘bb’,1),那就具有二义性了
limit
限定返回的结果的数目
limit n 返回前n行
limit m,n 返回从行m开始的n行数据
limit n offset m 返回从行m开始的n行数据
desc
如果想在多个列上均进行降序排列,对每列都需要指定DESC。
SELECT * FROM products ORDER BY prod_price DESC,prod_name
# 返回结果按照按prod_price降序排列,prod_price相同时按prod_name升序(默认是ASC)排列
SELECT * FROM products ORDER BY prod_price DESC,prod_name DESC
# 返回结果按照按prod_price降序排列,prod_price相同时按prod_name降序排列
where
where子句操作符
=, <>/!=, <, <=, >, >=, between……and……,IS NULL
组合where子句
AND, OR, IN, NOT
select * from products where vend_id != 1003;
# select * from products where vend_id != '1003';
# 单引号用来限定字符串。如果将值与串类型的列进行比较,则需要限定引号。
select * from products where vend_id != 1003 and prod_name='fuse';
in嵌套子查询
select cust_name,cust_contact from customers where cust_id IN (select cust_id
from orders
where order_num IN (select order_num
from orderitems
where prod_id
='TNT2'));
tips
复杂性随着嵌套程度的深入而增加,因此:
首先,建立和测试內层查询
然后,用硬编码数据建立和测试外层查询
接着,确认正确后嵌入子查询中仔测试这个嵌套子查询正确性
最后,每增加一个子查询都重复上述步骤直到构建完毕。
NULL
- null查询是 IS NULL,而不是=NULL或=’NULL’
- 因为NULL具有特殊含义,数据库不知道它们是否匹配(比如,where,通配符”%”),所以在匹配过滤或不匹配过滤时不返回它们。
因此,在过滤数据时,一定要验证返回数据中确实给出了被过滤列具有NULL的行。 - 如果分组(group by)列中具有NULL值,则将NULL值作为一个分组返回。如果表中具有多行NULL值,将它们分为一组。
like vs. regexp
products表
- like匹配整个列,regexp在列值内匹配
select * from products where prod_name like '1000';
#没有返回结果
select * from products where prod_name REGEXP '1000';
#返回结果见下图
- regexp可以匹配列值,使用^和$定位符即可
select * from products where prod_name REGEXP '1000$';
select * from products where prod_name LIKE '%1000';
#返回结果同样
select * from products where prod_name REGEXP '^1000';
select * from products where prod_name LIKE '1000%';
#返回结果同样
- 不要过度使用like或者regexp
- 如果其他操作符能够达到相同的目的,应该使用其他操作符
- 不要将其置于搜索模式的开始处,会降低搜索速度
union 组合查询
规则
- union中每个查询必须包含相同的列,表达式或聚集函数,各个列不需要以相同的顺序出现
- 列数据类型必须兼容,类型不必完全相同,但必须是DBMS能够隐含地转换的类型
select子句的顺序
子句 | 说明 | 是否必须使用 |
---|---|---|
select | 返回的列或者表达式 | Yes |
from | 检索的表 | 仅从表选择数据时使用 |
where | 行级过滤 | No |
group by | 分组 | No |
having | 组级过滤 | No |
order by | 排序顺序 | No |
Limit | 限制检索的行数 | No |