<center>show相关语句
#显示当前可用数据库
SHOW DATABASES;
#显示当前数据库中的表
SHOW TABLES;
#显示当前表中的字段
SHOW COLUMNS FROM customers;
#显示服务器状态
SHOW STATUS;
#显示创建数据库或表的相关语句
SHOW CREATE DATABASE;
SHOW CREATE TABLE;
#显示用户的安全权限
SHOW GRANTS;
#显示当前服务器errors和warnings
SHOW ERRORS;
SHOW WARNINGS;
<center>检索数据
如果没有明确排序查询结果,输出的数据顺序和书上的可能不同,只要返回的数据行数相同就行
检索单个列
SELECT cust_name FROM customers;
检索多个列
SELECT cust_name, cust_city FROM customers;
检索所有列
SELECT * FROM customers;
检索某列,并排除重复项
SELECT DISTINCT vend_id FROM products;
使用limit限制显示哪些行
#limit第一行索引是0,不是1
SELECT cust_id FROM customers LIMIT 4 #显示前4行
SELECT cust_id FROM customers LIMIT 3,4 #从第3行开始的4行,不够就停止
SELECT cust_id FROM customers LIMIT 4 OFFSET 3 #同上
使用完全限定的表明、数据库名,这是为了后续某些场景准备的,防止混淆
SELECT products.prod_id FROM crashcourse.`products`
<center>排序检索数据</center>
order by排序,默认升序
SELECT prod_name FROM products ORDER BY prod_name;
SELECT prod_name FROM products ORDER BY prod_name ASC; #同上
多列检索,并排序
SELECT prod_id, prod_name, prod_name FROM products ORDER BY prod_id, prod_name;
#先按prod_id排序,若两个prod_id相同再按prod_name排序
指定排序方向
SELECT prod_id, prod_name, prod_name FROM products ORDER BY prod_id DESC, prod_name;
#只指定了prod_id为降序,prod_name还是默认升序
order by 和 limit结合,显示字段的最大、最小值
SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1; #limit只显示1行
<center>过滤数据</center>
使用WHERE子句
SELECT prod_name, prod_price FROM products WHERE prod_price=2.5;
#where和order by同时存在时,where在前,否则将产生错误
#where子句操作符:=, <>, !=, <, <=, >, >=, between and
检查单个值
SELECT prod_name, prod_price FROM products WHERE prod_name='fuses';#不区分大小写
SELECT prod_name, prod_price FROM products WHERE prod_price<10;
SELECT prod_name, prod_price FROM products WHERE prod_price<=10;
#可以看到,有时使用引号,有时不使用。如果将值和串类型的列进行比较,需要限定引号,用来和数值比较的值不用加引号
不匹配检查
#检索不是由供应商1003制造的产品
SELECT vend_id, prod_name FROM products WHERE vend_id<>1003;
范围值检查
#BETWEEN AND检索价格在5到10之间的所有产品,数值包含开头和结尾
SELECT prod_name,prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;
空值检查
#检索商品价格为空的产品信息
SELECT * FROM products WHERE prod_price IS NULL;#表中没有这样的数据,所以没有返回内容
#但是customers表中有这样的数据,检索消费者邮箱为空的消费者信息
SELECT * FROM customers WHERE cust_email IS NULL;
null和不匹配
在通过过滤选择出不具有特定值的行时,有可能希望返回具有null值得行,但这是行不通的,因为当值为null时,一般有时特殊含义,数据库不知道它们是否匹配,所以在匹配过滤或不匹配过滤的时候,不返回它们。
因此在过滤数据时,一定要验证返回数据中确实给出了被过滤列中具有null的行。
解释:

43931efa-b512-495b-8ba1-172022cabf9f.png
使用AND OR 组合WHERE子句
#检索供应商为1003生产的,且价格小于10的产品信息
SELECT * FROM products WHERE prod_price<10 AND vend_id=1003;
#检索供应商为1003生产的产品,或者价格小于10的产品,的信息
SELECT * FROM products WHERE prod_price<10 OR vend_id=1003;
#计算次序:多个and和or时,使用次序容易混乱,最好使用()强制标定计算顺序
#查询价格大于等于10,且由1002,1003制造的所有产品
SELECT * FROM products WHERE prod_price>=10 AND (vend_id=1002 OR vend_id=1003);
IN操作符
用来指定条件范围,功能与OR相同,优点是在多个条件下表达更简洁,执行速度更快;
更大的优点是可以包含其他SELECT语句
SELECT prod_name, prod_price FROM products WHERE (vend_id=1002 OR vend_id=1003) ORDER BY prod_name;
SELECT prod_name, prod_price FROM products WHERE vend_id IN (1002,1003) ORDER BY prod_name;#结果同上
NOT操作符
功能是否定后面跟的所有条件
NOT IN功能和AND相同
#列出除1002,1003之外的所有供应商制造的商品
SELECT prod_name, prod_price FROM products WHERE vend_id NOT IN (1002,1003);
SELECT prod_name, prod_price, vend_id FROM products WHERE (vend_id<>1002 AND vend_id<>1003);
用通配符进行过滤
LIKE操作符
当需要搜索产品名中包含anvil的茶品信息时,前面的查询就不适用了,这个时候就需要使用通配符。通配符可以创建特定数据的搜索模式。
'%'通配符:表示任何字符出现任意次数,包括0次
SELECT prod_name FROM products WHERE prod_name LIKE 'jet%';#哪些产品名以jet开头
#通配符可以在搜索模式中的任意位置使用,并且可以使用多个通配符
SELECT prod_name FROM products WHERE prod_name LIKE '%anvil%';#哪些产品名包含anvil
#通配符也可以在搜索模式的中间使用
SELECT prod_name FROM products WHERE prod_name LIKE 's%e';#以s开头,e结尾的产品名
末尾空格会干扰通配符匹配。例如在保存次anvil时,后面多保存了一个空格,那么语句prod_name LIKE '%anvil'就会不匹配。解决这个问题的办法是,在搜索模式末尾再添加一个%。更好的办法是使用函数去掉末尾空格,后面会接触到。
'_'通配符
下划线的用途和%类似,但是只匹配一个字符,不能多也不能少
SELECT prod_name FROM products WHERE prod_name LIKE '_ ton anvil';
SELECT prod_name FROM products WHERE prod_name LIKE '% ton anvil';
注意:
通配符很有用,但和其他过滤条件相比也更慢,没有必要不要使用;
通配符位于搜索模式开头是最慢的,除非绝对必要,不要用在开头;
注意通配符位置,如果错误,可能不会返回想要的数据;
