本文以单表查询为边界,介绍如何对一张表进行简单查询、限制条件查询、结果排序等内容。每种情况均有例句和补充说明。
如想看更多示例,请移步《SQL基础教程(第二版)》-MICK(如需电子版,可留邮箱)
目录
1.简单查询
简单查询的基础语句是:
SELECT <列名> FROM <表名>;
基础语句的含义是:从<表名>中取出某列数据。
注:SELECT和FROM使用大小写均可,本文讲解中统一使用大写。
1.1查询表中所有数据
SELECT * FROM <表名>;
注释:
- *代表列表中所有列名
- 查询结果为数据表中所有的数据内容。
1.2查询数据表中指定的列
SELECT <列名1> ,<列名2>, <列名3> ,<列名4>
FROM <表名>;
注释:
- 列名之间需要用英文逗号(,)隔开
- 可查询多列数据,按照语句中列的顺序进行展示;
1.3删除列中重复数据
SELECT DISTINCT product_type
FROM Product;
注释:
- 使用 SELECT DISTINCT ,查询结果中仅展示去重后的数据;
- 如果数据中存在空值(null),那么空值也会进行去重,查询结果中展示一个空值;
- SELECT DISTINCT 后可跟多列,如SELECT DISTINCT A,B ,则当多行数据比较中,A字段和B字段的值均一致,才进行去重;
- 引申用法:统计不重复的数据,可用COUNT(DISTINCT A);
1.4为列设置别名
SELECT product_id AS id ,
porduct_name AS name,
porduct_price AS price
FROM product;
注释:
- 设置别名是为了查看查询结果时更清晰;
- 设置英文别名时,直接写别名,不需要使用引号;
- AS可以写,也可以省略;
1.5 对列表中的数据进行计算
SELECT product_name, sale_price,sale_price-purchase_price AS profit
FROM Product;
注释:
- 在SELECT子句中,可使用四则运算符进行数据计算,计算结果作为一列新的数据;
- 四则运算符:加+减-乘*除/
- 括号:在计算时可以使用括号(),标识计算的优先顺序。比如(sale_price-purchase_price)*3
- 计算出的列可赋予一个别名便于理解,如示例中的profit
- NULL:如果数据为空,则对null值进行的任何计算,结果都为null
1.6 常用统计函数
本部分仅介绍常用的统计函数及其用法。
SELECT count(*) FROM Product;
注释:
- 在不使用分组(GROUP BY)的情况下,SELECT后跟统计函数时,不能同时跟其他字段,因为统计函数和一个具体的字段无法对应。
- SELECT后可跟多个统计函数。
常用函数:
-
AVG(表达式)
返回表达式中所有的平均值
。仅用于数字列并自动忽略NULL值。 - COUNT(表达式) 返回表达式中非NULL值的数量。可用于数字和字符列。
- COUNT(*) 返回表中的行数(包括有NULL值的列)。
- MAX(表达式) 返回表达式中的最大值,忽略NULL值。可用于数字、字符和日期时间列。
- MIN(表达式) 返回表达式中的最小值,忽略NULL值。可用于数字、字符和日期时间列。
- SUM(表达式) 返回表达式中所有的总和,忽略NULL值。仅用于数字列
更多函数可参考SQL函数大全及示例汇总
2.限制条件查询
限制条件查询的基础语句是:
SELECT <列名> FROM <表名>
WHERE 条件;
限制条件查询,是在查询时增加过滤条件,查询结果中仅展示符合过滤条件的数据。 在本章节主要介绍如何写WHERE条件。
2.1WHERE子句运算符
在WHERE条件句中,条件的书写需要用到运算符。本处罗列常用运算符,下文会讲解每个运算符的用法。
运算符 | 符号 | 描述 |
比较运算符 | >,<,>=,<=,=,<>,!= | <>,!=均为不等于 |
判断是否为空 | IS NULL,IS NOT NULL | 判断某列内容是否为空 |
逻辑运算符 | AND,OR | 均用于有多个条件时 AND表示条件需要同时满足; OR表示多个条件满足一个即可; |
逻辑运算符 | NOT | 表示“非”,如年纪不大于30,工资不小于10000; |
范围查询 | BETWEEN 最小值 AND 最大值 | 最小值<=结果<=最大值 |
列表范围查询 | IN | 指定查询范围 |
模糊查询 | LIKE | 对指定的字段进行模糊查询 |
2.2条件句中的比较运算
(1)对数字进行比较
SELECT name,price
FROM Product
WHERE price > 500;
注释:
- 在对数字类型的数据进行比较时可用到所有的比较运算符:>,<,>=,<=,=,<>,!=
- 在数据为NULL时,无法判断是否符合条件,因此结果中不会进行展示。
- 在WHERE子句表达式中,可以运用算式,示例如下:
SELECT name,price
FROM Product
WHERE price-purchase_price > 500;
(2)对字符串进行比较
SELECT name,price
FROM Product
WHERE name='百事可乐'
注释:
- 对字符串进行比较,常用“=”
- 字符串的值需要用‘ ’标识
- 判断数据为空,不能用=,需要用IS NULL,下文会提及
(3)BETWEEN AND
SELECT name,price
FROM Product
WHERE price BETWEEN 100 AND 200;
注释:
- 查找处于某个区间的数据时,可以使用BETWEEN AND,小值<=目标值<=大值。
- BETWEEN 小值 AND 大值,其中,小值和大值的位置不可颠倒;
- 可用于日期判断;
2.3条件句中的逻辑运算
(1)判断是否为空
SELECT name,price
FROM Product
WHERE price IS NULL;
注释:
- 查找为空的数据时,使用IS NULL,查找不为空的数据时,使用IS NOT NULL;
(2)NOT运算符
SELECT name,price
FROM Product
WHERE NOT price >100;
注释:
- NOT表示否定条件,直接放在WHERE后使用;
- 不使用NOT也能获得一样的查询结果,比如条件子句WHERE NOT price <=100 替换上例中的子句,能得到一样的效果。
(3)IN
SELECT name,price
FROM Product
WHERE name in ('玩具','薯条','面包');
注释:
- 使用IN查找指定范围内的数据;
- 数据类型如果是字符或者日期,需要用'',数据类型如果是数字,则不需要使用引号;
- 如果想要查询某个数据不在取值范围内,使用WHERE name NOT IN ('玩具','薯条','面包')
- 取值范围中不能有NULL;
(4)模糊查询:LIKE,NOT LIKE
SELECT name,price
FROM Product
WHERE name LIKE '%具';
注释:
- LIKE用于模糊查询;
- LIKE后必须加'',数字及日期的数据进行模糊查询时,LIKE 后均需加'';
- %表示任意类型和长度的字符(0位,1位或多位);
- 下划线_表示1位字符,条件子句可以写为:WHERE name LIKE '_具';
- '%%'代表查询全部;
(5)多条件查询:AND ,OR
SELECT name,price FROM Product
WHERE name LIKE '%具'
AND price>=100;
注释:
- AND相当于‘并且’,OR相当于或者;
- 同时使用多个AND和OR时,AND运算符优先于OR运算符;
- 使用括号:WHERE (name LIKE '%具' OR date>'2012-01-01') AND price>=100;
3.排序
SELECT name,price FROM Product
WHERE name LIKE '%具'
AND price>=100
ORDER BY price;
注释:
- 不使用ORDER BY,展示结果的排序是随机的;
- ORDER BY进行排序时,结果默认由低到高进行排序(升序排序),同ORDER BY XX ASC;
- ORDER BY XX DESC,结果默认由高到低进行排序(降序排序);
- ORDER BY 后可以跟多排序列,默认先按照左边排序列进行排序,数据一致时按照左边第二个排序列排序。(ORDER BY XX,YY)或(ORDER BY XX DESC, YY ASC);
- 对NULL值排序时,由于NULL无法和其他字符、数字比较大小,所以默认展示在最前或最后;
- 别名:在设定排序列时,可以使用列的别名。
- 排序列的范围:(1)可以对表中任意一列进行排序,并不限制SELECT后使用的字段列,(2)使用SELECT后的统计函数列排序,即在使用GROUP BY 进行分组统计时,可按照统计函数值进行排序(后续讲GROUP BY 会再举例)。
4.数据库执行顺序
本文共涉及三个子句,分别是SELECT\FROM\WHERE\ORDER BY,在数据库执行的时候,执行顺序是FROM>WHERE>SELECT>ORDER BY。即:1.先取表里的数据,2.按照条件筛选数据,3.筛选选定的列或者统计的内容,4.对最终结果进行排序。