2.《MySQL必知必会》检索与过滤

来源:互联网 发布:力港网络 知乎 编辑:程序博客网 时间:2024/05/17 04:28

注:博客中总结《MySQL必知必会》中的知识点,第4,5,6,7,8,9章的核心内容;

涉及到的操作符: SELECT,FROM,LIMIT,ORDER BY,WHERE,IN,NOT,LIKE,REGEXP;

书中用到的表的介绍及其脚本文件:《Mysql必知必会》中表的介绍

检索数据

1. 检索单个列

SELECT prod_name FROM products;-- 注:列名不区分大小写;

2. 检索多个列

SELECT prod_id,prod_name,prod_price FROM products;

3. 检索所有列

SELECT * FROM products;

4. 检索不同列

SELECT DISTINCT vend_id FROM products;-- 注:在使用DISTINCT时,如果想每列都唯一,则应该在每一列前面加上DISTINCT;

5. 限制结果

SELECT prod_name FROM productsLIMIT 5;-- 注:LIMIT 5,5表示返回从第5行开始后的5行;

排序检索数据

1. 排序数据

SELECT prod_name FROM productsORDER BY prod_name;

2. 按多个列排序

SELECT prod_id,prod_price,prod_nameFROM productsORDER BY prod_price,prod_name;

3. 指定排序方向

-- 默认是ASC(升序); DESC(降序);SELECT prod_id,prod_price,prod_nameFROM productsORDER BY prod_price DESC;
-- 先按产品价格降序,在按产品名升序;SELECT prod_id,prod_price,prod_nameFROM productsORDER BY prod_price DESC,prod_name;

过滤数据

1. 使用WHERE子句

SELECT prod_name, prod_priceFROM productsWHERE prod_price = 2.50;
SELECT prod_name, prod_priceFROM productsWHERE prod_name = 'fuses';-- 注:‘fuses’默认是不区分大小写的

2. 不匹配查询

-- 使用 <> 或 !=SELECT vend_id, prod_nameFROM productsWHERE vend_id <> 1003;

3. 范围值查询

SELECT prod_name, prod_priceFROM productsWHERE prod_price BETWEEN 5 AND 10;

4. 空值查询

SELECT prod_nameFROM productsWHERE prod_price IS NULL;

数据过滤

1. 组合WHERE子句

1.1 AND操作符

```SQLSELECT prod_id, prod_price, prod_nameFROM productsWHERE vend_id=1003 AND prod_price<=10;```

1.2 OR操作符

```SQLSELECT prod_id, prod_priceFROM productsWHERE vend_id=1002 OR vend_id=1003;```

1.3 计算次序

```SQLSELECT prod_name, prod_priceFROM productsWHERE vend_id=1002 OR vend_id=1003 AND prod_price>=10;```与下面返回的结果不同,AND操作符优先级高;```SQLSELECT prod_name, prod_priceFROM productsWHERE (vend_id=1002 OR vend_id=1003) AND prod_price>=10;```

2. IN操作符

SELECT prod_name, prod_priceFROM productsWHERE vend_id IN (1002, 1003)ORDER BY prod_name;

3. NOT操作符

SELECT prod_name, prod_priceFROM productsWHERE vend_id NOT IN (1002, 1003)ORDER BY prod_name;

用通配符进行过滤

1. LIKE操作符

1.1 百分号(%)通配符

SELECT prod_id,prod_nameFROM productsWHERE prod_name LIKE 'jet%';-- % 表示任意字符出现任意次

1.2 下划线(_)通配符

SELECT prod_id,prod_nameFROM productsWHERE prod_name LIKE '_ ton anvil';-- % 表示任意单个字符

2. 使用通配符的技巧

通配符搜索的处理一般花费时间较长,要避免过度使用;

用正则表达式进行过滤

正则表达式 - 用REGEXP来匹配文本中特殊的串

1. 基本字符匹配

SELECT prod_nameFROM productsWHERE prod_name REGEXP '.000'ORDER BY prod_name;-- . 正则表达式特殊符号,表示匹配任意一个字符;

2. 进行OR匹配

SELECT prod_nameFROM productsWHERE prod_name REGEXP '1000|2000'ORDER BY prod_name;-- | 正则表达式的OR操作符;

3. 匹配几个字符之一

SELECT prod_nameFROM productsWHERE prod_name REGEXP '[123] Ton'ORDER BY prod_name;-- [] 定义一直字符,匹配其中一个;[^123]匹配除123之外的任何字符;

4. 匹配范围

SELECT prod_nameFROM productsWHERE prod_name REGEXP '[1-5] Ton'ORDER BY prod_name;-- [0-9],[a-z]表示范围;

5. 匹配特殊字符

SELECT prod_nameFROM productsWHERE prod_name REGEXP '\\.'ORDER BY prod_name;-- \\ 转义符, \\r 转页,\\n 换行, \\t 制表符;

6. 匹配字符类

[:alnum:] 任意字母和数字,同[a-zA-Z0-9];[:alpha:] 任意字符,同[a-zA-Z];[:blank:] 空格和制表符;......

7. 匹配多个实例

SELECT prod_nameFROM productsWHERE prod_name REGEXP '\\([0-9 sticks?]\\)'ORDER BY prod_name;重复元素符 *   0个或多个匹配; +   1个或多个匹配; ?   0个或1个匹配; {n}  制定数目的匹配; {n,}  不少于制定数目的匹配; {n,m}  匹配数目的范围;

8. 定位符

SELECT prod_nameFROM productsWHERE prod_name REGEXP '^[0-9\\.]'ORDER BY prod_name;定位元字符 ^   文本的开始; $   文本的结尾; [[:<:]]  词的开始; [[:<:]]  词的结尾;
0 0