查询
1 基本查询
# select 字段列表 from 表名
# 基本查询 (*)表示所有
select * from person
SELECT 字段1,字段2... from person
可以用as给字段起别名,as也可以省略。
2 条件查询
# 用where表示查询的条件
SELECT 字段1,字段2,... from 表名 where 字段 BETWEEN 1 and 10 //从1到10
SELECT 字段1,字段2,... from 表名 where 条件1 and 条件2 //and 这里表示并且
SELECT 字段1,字段2,... from 表名 where 条件1 or 条件2 //or 这里表示或者
# %匹配0或多个字符,一般不用左模糊(%放在左边,导致索引失效,降低查询效率)
SELECT 字段1,字段2,... from 表名 where name like '%豪' //name中 豪是最后一个
SELECT 字段1,字段2,... from 表名 where name like '%豪' //name中 豪是第一个
SELECT 字段1,字段2,... from 表名 where name like '%豪%' //name 中有豪
# _代表匹配一个字符
SELECT 字段1,字段2,... from 表名 where name like '_豪' //前面有一个字
3 分页查询
# 语法 limit 起始索引,个数
# 分页查询第m页,每页展示n 条数据 limit (m-1)*n, n
SELECT 字段1,字段2,... from 表名 limit 0,5
SELECT 字段1,字段2,... from 表名 limit 5,5
SELECT 字段1,字段2,... from 表名 limit 10,5
4 排序
# 排序 order by 字段名 (ASC 升序,DESC降序)不加asc默认为升序
SELECT 字段1,字段2,... from 表名 ORDER BY 字段 ASC;
SELECT 字段1,字段2,... from 表名 ORDER BY 字段 DESC;
5 聚合函数
# 聚合函数 count() sum() avg() max() min()
select count(0) from 表名 查询有多少条记录 0会计算null值
select sum(字段) from 表名 查询字段中所有值的和
select avg(字段) from 表名 查询所有值的平均值
select min(字段) from 表名 查询最大值
select max(字段) from 表名 查询最小值
SELECT CAST(avg(字段) as decimal(10,0)) as avg from 表名 //四舍五入 decimal(10,0) 十进制10 代表小数点前的位数 ;0代表小数点后的位数
例:
#所有记录
select count(0) from person
#总和
select sum(age) from person
#平均值
select avg(age) from person
#最大值
select max(age) from person
#最小值
select min(age) from person
#平均值的位数进制(四舍五入)
select cast(avg(age) as decimal(10,0)) as avg from person
6 分组查询
所谓的分组查询,也就是把所有的数据按照条件分成多组,然后分别对每组数据使用组函数进行查询。把数据分成多少组,最终就会得到多少条结果。当需要分组查询时需要使用GROUP BY子句
# 分组查询 group by 字段
SELECT 字段1,avg(字段) from person GROUP BY字段1;
# having条件查询 where分组前,having分组后的条件
SELECT 字段1,avg(字段) from person where 条件 GROUP BY 字段1 having 条件;
例:
- select department,avg(age) from person group by department
- select department,avg(age) from person where age>20 group by department having avg(age)>30
7 子查询
# 把查询到的结果当作另一个查询的条件
SELECT 字段1,字段2,.... from 表1 where 字段 in (SELECT 字段 from 表2 where 条件)
例:
select id,name,age,department from person where department in(select id from dment where name='保安部')
8 内连接
# 笛卡尔积 查询出来的结果没有意义
select * from 表名1,表名2
# 显示内连接 要使用inner join
select * from 表名1 INNER JOIN 表名2 on 表名1.字段=表名2.字段
select * from 表名1 JOIN 表名2 on 表名1.字段=表名2.字段 //inner可以省略
select as.字段1,as.字段2,字段3,as.字段1,as.字段2 from 表名1 as JOIN 表名2 as on 表名1.字段=表名2
# 隐式内连接
select * from 表名1,表名2 where 表名1.字段=表名2.字段
例:
select * from person,dment
select * from person inner join dment on person.department=dment.id
select * from person join dment on person.id=dment.id
// as 可以给字段名另外起个名字 (两个表里的字段一样的情况下)as 也可以用在表名上 (表名有点长,写的麻烦) 这里为表person字段名为p ; dment字段名为d ;
select p.id,p.name,age,d.id,d.name from person p JOIN dment d on p.department=d.id
select * from person,dment where person.department=dment.id
9 外连接
# 左外连接 left [outer] join 查询的是左边表的所有部分和右边表的交集; outer可以省略
- select 字段1,字段2,....,字段1,字段2,..., from 表名1 left outer join 表名2 on
表名1.字段=表名2.字段
- select 字段1,字段2,....,字段1,字段2,..., from 表名1 left join 表名2 on
表名1.字段=表名2.字段
# 右外连接 right [outer] join 查询的是右边表的所有部分和左边表的交集
- select 字段1,字段2,....,字段1,字段2,..., from 表名1 right outer join 表名2 on
表名1.字段=表名2.字段
- select 字段1,字段2,....,字段1,字段2,..., from 表名1 right join 表名2 on
表名1.字段=表名2.字段
例:
#左外连接 outer可以省略
select p.id,p.name,age,department,d.id,d.name from person p left outer join dment d on p.id=d.id
select p.id,p.name,age,department,d.id,d.name from person p left join dment d on p.department=d.id
#右外连接
select p.id,p.name,age,department,d.id,d.name from person p right outer join dment d on p.department=d.id
select p.id,p.name,age,department,d.id,d.name from person p right join dment d on p.department=d.id