MySQL备忘之查询篇

最好的教材当然是官方文档:
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值