检索数据
- 检索单个列
SELECT prod_name FROM products;- 使用完全限定的表名,表名也可以通过database.products的方式:
SELECT products.vend_id FROM products;
- 检索多个列
SELECT prod_name,vend_id FROM products; - 检索所有列
SELECT * FROM products; - 检索去重使用distinct:
SELECT DISTINCT vend_id FROM products; - 限制查询行数使用limit
- 返回不多于5行:
SELECT vend_id FROM products LIMIT 5; - 返回第2行开始的3行(初始行为0):
SELECT DISTINCT vend_id FROM products LIMIT 2,3SELECT DISTINCT vend_id FROM products LIMIT 3 OFFSET 2;
- 返回不多于5行:
排序检索
升序ASC(ASC可不用,默认是升序的)
- 单个列排序
SELECT prod_name FROM products ORDER BY prod_name; - 多个列排序,先按名字再按id排序
SELECT prod_name,prod_price,prod_id FROM products ORDER BY prod_name,prod_id;
降序DESC
- 单个列降序
SELECT prod_name,prod_id FROM products ORDER BY prod_id DESC; - 多个列降序DESC关键字只应用到直接位于其前面的列名
SELECT prod_name,prod_id FROM products ORDER BY prod_id DESC,prod_name;
过滤
简单的WHERE过滤
SELECT prod_name,prod_price FROM products WHERE prod_price=2.5;- 不等于
- <>:
SELECT prod_price FROM products WHERE prod_price<>2.5; - !=:
SELECT prod_price FROM products WHERE prod_price!=2.5;
- <>:
- BETWEEN两个值之间
SELECT prod_price FROM products WHERE prod_price BETWEEN 5 AND 10; - IS NULL空值检查
IS NULL:SELECT cust_id FROM customers WHERE cust_email IS NULL;
组合WHERE过滤
- WHERE计算次序:先处理AND再处理OR
- AND
SELECT prod_id,prod_price FROM products WHERE vend_id=1003 AND prod_price<=10; - OR
SELECT prod_id,prod_price FROM products WHERE vend_id=1003 OR prod_price<=10; - IN
SELECT prod_id,prod_price FROM products WHERE prod_price IN (5.99,9.99,10);- IN可以包含其他select语句
- IN操作符比OR操作符清单执行更快
- NOT操作符
SELECT prod_id,prod_price FROM products WHERE prod_price NOT IN (5.99,9.99,10);
通配符过滤LIKE:用操作符替代未知字符查找信息
- %通配符:任何字符出现任意次数,不能匹配NULL
- 以jet开始
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE 'jet%'; - 以jet结尾
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '%jet'; - 以包含jet字段
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '%jet%';
- 以jet开始
- _通配符:单个字符
SELECT prod_name FROM products WHERE prod_name LIKE '_etPack 1000'; - 通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长
正则表达式REGEXP:找出满足某种条件的信息
-
. 匹配任意一个字符
SELECT prod_id,prod_name FROM products WHERE prod_name REGEXP '.etPack 1000'; -
因为REGEXP匹配不区分大小写,如果希望按大小写查找,使用BINARY关键字:
SELECT prod_name FROM products WHERE prod_name REGEXP BINARY '.etPack 1000'; -
|:or 匹配
SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000'; -
匹配几个字符之一
SELECT prod_name FROM products WHERE prod_name REGEXP '[123] Ton'; -
[]中使用^:[^123]匹配除1,2,3外的任何东西
-
匹配范围:
[1-9],[b-h] -
匹配特殊字符如.,_,需要加转义
\\ -
匹配多个实例:重复元字符
元 字 符 说 明 * 0个或多个匹配 + 1个或多个匹配(等于{1,}) ? 0个或1个匹配(等于{0,1}) {n} 指定数目的匹配 {n,} 不少于指定数目的匹配 {n,m} 匹配数目的范围( m不超过255) -
定位符:^:文本的开始,$:文本的结尾
创建计算字段
- 拼接字段,使用concat拼接
SELECT CONCAT (prod_name,'(',prod_id,')') FROM products; - 使用别名做表头,用AS关键字
SELECT CONCAT (prod_name,'(',prod_id,')') AS vend FROM products; - 算术计算,如果需要其他列执行算术计算得到新的列
SELECT quantity*item_price AS vend FROM orderitems;
数据处理函数
- 文本处理函数:
- 删除左右多余的空格: RTrim,LTrim,Trim
- 文本转为大写或小写: Upper,Lower
- 串左边或右边的字符: Left,Right
- 日期处理函数
- 数值处理函数
汇总
- 聚集函数:AVG,COUNT,MAX,MIN,SUM
- 聚集不同值
SELECT AVG(DISTINCT prod_price) AS avg_price FROM products;
分组GROUP BY
- 数据分组
SELECT vend_id,COUNT(*)AS num_prods FROM products GROUP BY vend_id; - 过滤分组 HAVING
SELECT vend_id,COUNT(*)AS num_prods FROM products GROUP BY vend_id HAVING num_prods >0; - SELECT子句顺序 SELECT > FROM > WHERE > GROUP BY > HAVING > ORDER BY > LIMIT