- 一般查询
- 查询所有字段
select * from 表名;
- 查询指定字段
select 列1,列2,... from 表名;
- 使用 as 给字段起别名
select 字段 as 别名 ... from 表名;
- 使用 as 给表起别名
select 别名.字段 .... from 表名 as 别名;
在当前的sql 语句中 临时的给students 起了一个别名叫做s
错误: select students.name, students.gender, students.age from students as s;
select s.name, s.gender, s.age from students as s; # 临时的给students 起了一个别名叫做s
- sql语句完全的形式
只有正在使用当前数据库, 并且查找的数据表就在当前数据库中,才可以省略数据库名
数据表名什么时候不可以省略: 当一个sql语句中出现了多个数据表, 并且查询的字段在多个表中并且字段名相同, 此时表名不能够省略
例如查询 classes 表和 students 表中的name:
错误: select name,name from classes,students;
select students.name,classes.name from classes,students;
- 消除重复行
distinct 字段, 修饰所有需要查询的字段
select distinct 字段 from 表名;
- 条件查询
- 比较运算符
">" : 查询年龄大于 18 的信息
select * from 表名 where age > 18;
"<"
">="
"<="
"=":注意 SQL 中等于就是 "=",不是 "=="
"!=" 或 "<>"
- 逻辑运算符
"and":18 岁以上的女性
select * from 表名 where age > 18 and gender = "女";
"or":18 岁以上或者为女性
select * from 表名 where age > 18 or gender = "女";
"not":年龄不是 18 岁的信息
select * from students where age != 18;
select * from students where not age = 18;
- 模糊查询
"like"
% 表示任意字符可有可无
查询姓名中有'黄'的名字
select * from students where name like "%黄%";
_ 表示任意一个字符
查询有2个字的名字
select * from students where name like "__";
"rlike":正则
查询以黄开始的姓名
select * from students where name rlike "^黄.*";
- 范围查询
"in":表示在一个非连续的范围内
查询年龄为 18 和 34 的学生
select * from students where age = 18 or age = 34;
select * from students where age in (18,18,34);
"not in":表示不再连续的范围内
查询年龄不是 18 和 34 的学生
select * from students where age not in (18,34);
"between ... and ...":表示在一个连续的范围内,两边都会包含,是闭区间.
查询年龄在 18 到 34 之间的信息
select * from students where age between 18 and 34;
"not between ... and ...":表示不再一个连续的范围内
```
- 空判断 null, 不能使用比较运算符
```
select * from 表名 where 字段 is NULL;
select * from 表名 where 字段 is not NULL;
注意不能使用 not is
- 排序
order by 字段 asc(升序)|desc(降序) 默认就是升序排序 asc 可以省略
- 降序 desc
查询年龄在18到34岁之间的女性,身高从高到矮排序
select * from students where age between 18 and 34 and gender = 2 order by height desc;
order by 多个字段 order by age asc, height desc
查询年龄在18到34岁之间的女性,身高从高到矮排序, 如果身高相同的情况下按照年龄从小到大排序
select * from students where age between 18 and 34 and gender = 2 order by height desc, age desc;
- 聚合函数
count(*) 以行单位来进行统计个数
count(*) 效率更高, 效率略差:count(height)--> 获取对应的行--> 获取该行对应字段是否为NULL
select count(*) from students; # 以行为统计单位
select count(height) from students; # 以不为空的height字段对应的值作为统计单位
```
- 最大值
```
max()
```
- 最小值
```
min()
```
- 求和
```
sum()
```
- 平均值
```
avg()
```
- 四舍五入
```
round()
计算所有人的平均年龄,保留2位小数
select round(avg(age),2) from students;
- 分组
分组的目的就是为了更加精细的做聚合统计操作
group by 字段1,字段2
查看有哪几种性别
select distinct gender from students;
select gender from students group by gender; # 将分组之后的标签查询出来
查询分组数据中的人的姓名
select gender, group_concat(name) from students group by gender;
查询同种性别中的姓名和身高
select gender,group_concat(name,":",height) from students group by gender;
查询平均年龄超过30岁的性别,以及姓名
select gender,group_concat(name) from students group by gender having avg(age) > 30;
having 和 where 的区别
where: 对源数据做条件筛选
having: 是对分组之后的数据做进一步的筛选操作, 有having就一定有group by, 有 group by 不一定有having
- 分页
limit start, count
start: 表示从哪里开始查询, start 默认值为0, 可以省略, 跳过多少条数据
count: 查询多少条
第1页
select * from students limit 0,4;
第2页
select * from students limit 4,4;
第3页
select * from students limit 8,4;
每页显示5个,显示第3页的信息, 按照年龄从小到大排序 start = (pagenum - 1) * count
错误: select * from students limit 10,5 order by age asc;
正确: select * from students order by age asc limit 10,5;
- 连接查询
-- 连接查询 将两个表中的数据按照设置的连接条件进行筛选, 符合连接条件的数据才能够被筛选出来
table1 inner join table2 on 设置内连接条件 --> 内连接查询
select * from students inner join classes on students.cls_id = classes.id;
-- 按照分组的方式显示班级的学生
select classes.name,group_concat(students.name) from students inner join classes on students.cls_id = classes.id group by classes.name;
select c.name,group_concat(s.name) from students as s inner join classes as c on s.cls_id = c.id group by c.name;
-- 外连接查询: left join + right join
left join 左外连接查询
-- 查询每位学生对应的班级信息,不满足连接条件的数据会以NULL填充
select * from students left join classes on students.cls_id = classes.id;