该文章收集了大部分的表查询语句
文章目录
查看表中的信息
查询所有行和列的信息
SELECT * FROM 表名;
查询对应行的信息
SELECT 字段1, 字段2,字段3 FROM 表名;
有条件查询信息
SELECT * FROM 表名 where 条件;
where 后面不可以使用聚合函数作为条件
查询条件
常用条件
or #或者
and #且
xx in(?1,?2,?3) # xx为?1, ?2 或?3
字段 betweem ?1 and ?2 #等价于 >=?1 and<=?2
union 并查询
intersect 交查询
字段 is null #即字段为空的
字段 is not null # 即字段不为空的
SELECT * FROM score WHERE s_score BETWEEN 80 AND 90;
ANY 任意
SELECT 字段 FROM 表名 where 字段数值 < ANY(SELECT 字段2 FROM 表名)
SELECT null FROM tbl WHERE null < ANY(SELECT null FROM tb2);
ALL 所有
SELECT 字段 FROM 表名 where 字段数值 < ALL(SELECT 字段2 FROM 表名)
exists 存在
SELECT 字段 FROM 表名 where 字段数值 < ANY(SELECT 字段2 FROM 表名)
not exists 不存在
DISTINCT 消重复
SELECT DISTINCT s_name FROM student #消去重复
模糊查询
字段 like ‘%a%’ #字段中存在a的
字段 like ‘a%’ #字段中a开头的的
% #匹配任意长度
_ #匹配一个长度的
a%b a开头 b结尾的任意长度
\ 转义为普通字符 如 \ _(无空隔)
排序查询
SELECT * FROM 表名 order by 字段 asc #从小到大
不写默认从小到大
SELECT * FROM 表名 order by 字段 desc #从大到小
复和查询
SELECT * FROM 表名 where like ‘%a%’ order by 字段 desc #包含a且从大到小排序
SELECT * FROM 表名 order by 字段1 desc , 字段2 ;#字段1从大到小且字段2从小到大
limit 查询 前n条信息
limit 0,10; LIMIT 10;
#查看前10条信息
limit 10;#查看10条后的10条记录
limit 20,10;#查看20条后10条记录
聚合查询
count(*) 统计个数
SELECT count(*) form 表名 #统计所有的
SELECT count(字段) form 表名 #统计字段的
SELECT sum(字段) form 表名#求和
SELECT AVG(字段),MAX(字段),MIN(字段),SUM(字段)/count(*) form 表名 # avg平均值
分组查询
SELECT 字段1,COUNT(*) FROM 表名 GROUP BY 字段1 ;#查出每个部门的人数
SELECT 字段1,COUNT(* ) FROM 表名 GROUP BY 字段1 ORDER BY COUNT(*) DESC;# 查出每个部门的人数 并按照 表名中的字段一的人数从高到低排序
例
我们拥有下面这个 “Orders” 表:
O_Id | OrderDate | OrderPrice | Customer |
---|---|---|---|
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
现在,我们希望查找每个客户的总金额(总订单)。
我们想要使用 GROUP BY 语句对客户进行组合。
我们使用下列 SQL 语句:
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
结果集类似这样:
Customer | SUM(OrderPrice) |
---|---|
Bush | 2000 |
Carter | 1700 |
Adams | 2000 |
很棒吧,对不对?
让我们看一下如果省略 GROUP BY 会出现什么情况:
SELECT Customer,SUM(OrderPrice) FROM Orders
结果集类似这样:
Customer | SUM(OrderPrice) |
---|---|
Bush | 5700 |
Carter | 5700 |
Bush | 5700 |
Bush | 5700 |
Adams | 5700 |
Carter | 5700 |
连接查询
SELECT * FROM 表名1 inner join 表名2 on 表名1(字段)= 表名2(字段);
SELECT * FROM 表名1 inner join 表名2 on 表名1(字段)= 表名2(字段) inner join 表名3 on 表名2(字段2)= 表名3(字段2);
SELECT s.`s_id`,s.`s_name`,s.`s_birth`,s.`s_sex`,(SELECT s_score FROM score WHERE score.`s_id`=s.`s_id`)youscore FROM student s;
SELECT S.`s_id`,s.`s_name`,s.`s_birth`,s.`s_sex`,sc.`c_name`,sc.`s_score`,course.`t_id` FROM student s INNER JOIN score sc ON s.`s_id`=sc.`s_id`INNER JOIN course ON sc.`c_name`=course.`c_name`
LEFT out join 左外连接
合并查询
SELECT * FROM 表名 union SELECT * FROM 表名2
SELECT * FROM 表名 union all SELECT * FROM 表名2
#表一中表二存在的
正则表达式查询
SELECT * FROM 表名 where 字段 regexp ‘条件’;
^X #以X开头
X$ #以X结尾
x.y #x和y之间有一个字符的字符串
. 任意一个 * 任意任意个
having 应用
– 统计每个部门的人数,要人数大于10的信息
SELECT department_id,COUNT() FROM employees
GROUP BY department_id HAVING COUNT()>10;
– where 与 having 的区别
– where 过滤筛选满足条件的记录
– having 对分组后的记录再次过滤筛选
去除重复 distinct
SELECT DISTINCT salary FROM employees ORDER BY salary;
SELECT DISTINCT employee_id,salary FROM employees ORDER BY salary;