- 一般查询
- 查询所有字段
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;