概览
- 创建
- 排序
ORDER BY
DESC
ASC
- 过滤
WHERE
IS NULL
- 高级过滤
- 操作符
AND
OR
IN
NOT
- 通配符与
LIKE
-
%
-
_
-
- 操作符
创建
本地创建 fake-order.sql 文件后导入 MariaDB。
注:相关sql文件可以在MariaDB Crash Course 下载。
# 登录 MariaDB, root 换成自己设置的用户名
mysql -u root
# source 引用的是本地的sql文件
source ~/Sites/demo/learn-mariadb/fake-order.sql
# 查询, 在此之前可以添加一些假数据,同上的 source xx
# 从 products 中查找所有 prod_id
SELECT prod_id FROM products;
# 返回不同的 prod_id
SELECT DISTINCT prod_id FROM products;
# 查找所有列
SELECT * FROM products;
# 限定结果, 返回5个结果
SELECT prod_name FROM products LIMIT 5;
# 从第3行开始,返回5行, 注意行数索引从0开始,第一行是0
SELECT prod_name FROM products LIMIT 3, 5;
# 和上面同一个意思。
SELECT prod_name FROM products LIMIT 5 OFFSET 3;
# 完全限定名
SELECT products.prod_name FROM products;
SELECT products.prod_name FROM fake_order.products;
# mariaDB 中的三种注释
-- 单行注释
# 单行注释
/*多行
注
释/*
排序
如果没有显式指定排序,不应该认为检索的数据顺序是有意义的。
子句:SQL语句由过个子句组成,有些是必需的,有些是可选的,一个子句通常由关键字和数据组成。
# 显式地对SELECT语句检索出的数据进行排序,可使用 ORDER BY 子句,ORDER BY 后面接一个或多个列名,依此对输出的数据排序。
# 将 prod_name 列以字母顺序对数据进行排序
SELECT prod_name FROM products ORDER BY prod_name;
# 以多列为标准排序, 先价格,再名字
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;
# ORDER BY 后面除了跟列名外,也可以指定顺序编号, 注意:列改变之后很容易出错
SELECT prod_id, prod_price, prod_name FROM products ORDER BY 2, 3;
指定排序方向
默认排序是升序排序(从A到Z),也可以降序,使用关键字 DESC
# 对价格进行降序排序,价格最高的在第一个
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC;
# 多列排序, DESC 只作用于其前面的列名,这里 prod_name 不会按照降序排
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name;
# 多列排序,每一列上都进行降序排序
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name DESC;
# 升序 ASC, 不经常使用,默认就是 ASC
# 大写A和小写a默认是一样的,如果有需要,可以修改列字符集,需要 CONVERT() 函数或联系数据库管理员
过滤数据
WHERE 子句指定搜索条件
# 检索两列,返回 prod_price 值为2.50 的行
# 客户端也可以检索数据,但是不推荐在客户端过滤,因为如果数据在客户端过滤,服务器需要发送不需要的数据,导致网络带宽资源的浪费
SELECT prod_name, prod_price FROM products WHERE prod_price = 2.50;
# 当同时使用 ORDER BY 和 WHERE 子句时,确保 ORDER BY 子句在 WHERE 之后,否则会产生错误
# 相等测试,匹配时不区分大小写
SELECT prod_name, prod_price FROM products WHERE prod_name = 'fuses';
# 列出所有价格低于10的产品
SELECT prod_name, prod_price FROM products WHERE prod_price < 10;
# 检查不匹配
# 列出所有非供应商1003制造的产品:<> (小于或大于)同 !=
SELECT vend_id, prod_name FROM products WHERE vend_id <> 1003;
# 检查区间值
SELECT prod_name, prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;
空值检查
NULL: 空值,不同于可包含0、空字符串或者空格的字段。
为了确定一个值是否是NULL, 不能简单地检查是否“=NULL”,而是, SELECT 语句又一个特殊的 WHERE 子句用于检测列是否有 NULL 值,即 IS NULL 子句。
SELECT cust_id FROM customers WHERE cust_email IS NULL;
当筛选不包含指定值的行时,包含 NULL 值的行不会返回,因为“未知”的含义是数据库并不知道是否匹配。
当过滤数据时,务必验证包含 NULL 列的行是否在返回的数据中
高级筛选组合
为了更好的控制过滤,可以指定多个 WHERE 子句,这些子句可以通过下面两种方式使用: AND子句或OR子句
操作符:在 WHERE 子句中用来连接或者改变子句的关键字,也被成为逻辑操作符
-
AND 对 WHERE 子句添加条件
SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10; # ORDER BY 需要放在 WHERE 后面 SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10 ORDER BY prod_price DESC;
-
OR 操作符:指示 MariaDB 检索匹配其中某个条件的行
计算次序,使用括号进行分组, 括号比 AND 和 OR 有更高的优先级
# 未分组,读取供应商1002生产的产品,而不管其价格是多少,以及任何由供应商1003生产的价格高于或等于10的产品
SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003 AND prod_price >= 10;
# 分组
SELECT prod_name, prod_price FROM products WHERE(vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;
-
IN 操作符:指定一组条件,只要匹配其中任何一个条件即可。IN 用逗号隔开括号中列出的所有合法值。
SELECT prod_name, prod_price -> FROM products -> WHERE vend_id IN (1002, 1003) -> ORDER BY prod_name;
和 OR 的例子效果一样,优点:
- 当使用很长的值列表选项时,IN 操作符语法更清晰易读。
- 使用 IN 操作符更容易管理优先级顺序(由于使用更少的操作符)
- IN 操作符几乎总是比一系列 OR 操作符执行得更快
- IN 操作符最大的优势是可以包含 SELECT 语句,可以让你创建更为动态的 WHERE 子句
-
NOT: 用来否定条件的 WHERE 子句中的一个关键字
SELECT prod_name, prod_price -> FROM products -> WHERE vend_id NOT IN (1002, 1003) -> ORDER BY prod_name;
MariaDB 支持对 IN、BETWEEN、EXISTS 语句使用 NOT
通配符过滤
通配符: 用来匹配值的某个部分的特殊字符。
搜索模式:由纯文本、通配符,或者两者结合构成的匹配条件。
SQL 中使用 LIKE 操作符,进行通配符匹配,而不是纯粹的相等匹配。
-
% : 在字符串中,它表示任何数量的字符。大小写敏感,指% 在匹配模式中指定的位置代表0个、1个或者多个字符。小心结尾的空格!可以始终在结尾加一个%。不能匹配NULL
# 匹配任何以 jet 开头的 prod_name > SELECT prod_id, prod_name -> FROM products -> WHERE prod_name LIKE 'jet%'; +---------+--------------+ | prod_id | prod_name | +---------+--------------+ | JP1000 | JetPack 1000 | | JP2000 | JetPack 2000 | +---------+--------------+ 2 rows in set (0.049 sec) # 匹配任何未知包含文本 anvil 的值,无论其它字符出现在 anvil 之前还是之后 MariaDB [fake_order]> SELECT prod_id, prod_name -> FROM products -> WHERE prod_name LIKE '%anvil%'; +---------+--------------+ | prod_id | prod_name | +---------+--------------+ | ANV01 | .5 ton anvil | | ANV02 | 1 ton anvil | | ANV03 | 2 ton anvil | +---------+--------------+ 3 rows in set (0.011 sec) # 匹配以s开头,以e结尾 MariaDB [fake_order]> SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 's%e'; +---------+-----------+ | prod_id | prod_name | +---------+-----------+ | SAFE | Safe | +---------+-----------+ 1 row in set (0.001 sec)
-
_: 下划线仅匹配一个字符
# _ 通配符 MariaDB [fake_order]> SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '_ ton anvil'; +---------+-------------+ | prod_id | prod_name | +---------+-------------+ | ANV02 | 1 ton anvil | | ANV03 | 2 ton anvil | +---------+-------------+ 2 rows in set (0.001 sec) # % 通配符 MariaDB [fake_order]> SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '% ton anvil'; +---------+--------------+ | prod_id | prod_name | +---------+--------------+ | ANV01 | .5 ton anvil | | ANV02 | 1 ton anvil | | ANV03 | 2 ton anvil | +---------+--------------+ 3 rows in set (0.012 sec)