基操
基本查询
要查询数据表中的数据
SELECT * FROM student;
SELECT可以用于计算,但它并不是SQL的强项. 但是不带FROM的SELECT语句可以有一个有用的用途.就是用来判断当前到数据库的链接是否有效, 许多检测工具都会执行一条 SELECT 1;用来测试数据库链接.
条件查询
有时候并不想获取所有的记录,而是根据调价选择性的获取指定的记录, 例如查询分数在80分以上的学生记录, 在一张表有百万记录的情况下, 获取所有记录不仅费时 ,而且浪费带宽. 获取students表中分数大于等于80的学生.
SELECT * FROM students WHERE score >= 80;
查询分数不低于80且是男生的记录
SELECT * FROM students WHERE score>=80 AND gender='M';
查询分数在80到90之间并且是男生的记录
SELECT * FROM students WHERE (score >=80 AND score <=90) AND gender='M';
SELECT * FROM students WHERE (score BETWEEN 80 AND 90) AND gender='M';
查询(分数在80到90之间的男生) 或者女生.
SELECT * FROM students WHERE (score >=80 AND score <= 90) or gender = 'F';
查询不是女生且分数在80到90之间的人.
SELECT * FROM students WHERE(score>=80 AND score<=90) AND (NOT gender='F')
查询不是一班的人
SELECT * FROM students WHERE(class_id<>1)
SELECT * FROM students WHERE(NOT class_id=1)
查询分数位数是5的记录
SELECT * FROM students WHERE socre LIKE "%5";
投影查询
我们希望只返回我们指定想要的数据,而不是记录中的所有字段, 我们可以用
SELECT 字段1 字段2 字段3 FROM ...
查询分数在90以上记录的name字段.
SELECT name FROM students WHERE score>=90;
排序
查询所有一班同学并且按照成绩排序(倒序)
SELECT id,name,score FROM students WHERE class_id=1 ORDER BY score;
查询所有一班同学并且按照成绩排序(正序)
SELECT id,name,score FROM students WHERE class_id=1 ORDER BY score DESC;
先按照分数正序,如果分数相同,则按照id从大到小排序
SELECT id,name,score,gender FROM students ORDER BY score DESC,id DESC;
分页
当数据量特别大的时候,放在一个页面上面显示是有点智障的, 这个时候应该分页显示.
先将学生成绩从高到低排序, 然后分页. 一页3个 从第0个开始.
SELECT id,name,gender,score FROM students ORDER BY score DESC LIMIT 3 OFFSET 0;
查询第二页的信息.
SELECT id,name,gender,score FROM students ORDER BY score DESC LIMIT 3 OFFSET 3;
聚合查询
如果要统计一张表的数据的量,例如查询students有多少记录的时候,用
SELECT * FROM students;
查出来然后数一数 太沙雕了, 对于统计总数,平均数这一类常用计算 一定是会有聚合函数的, 使用聚合函数进行查询就是聚合查询, 它可以快速获得结果.
SELECT COUNT(*) FROM students;
count(*) 表示查询所有列的行数, 要注意的是虽然得到的结果显示 是一个数字, 但是实际上它还是一个二维表, 并且列名是count(*), 通常使用聚合查询的时候需要给列明设置一个别名,便于进行处理.
SELECT COUNT(*) num FROM students;
聚合查询同样也可以结合条件查询进行操作. 例如: 统计不低于80分的有几个人.
SELECT COUNT(*) num FROM students WHERE score>=80;
除了COUNT之外还有计算总和,平均,最大,最小这些方法.
函数 | 说明 |
---|---|
SUM | 计算某一列合计值,该列必须为数值类型 |
AVG | 计算某一列平均值,该列必须为数值类型 |
MAX | 计算某一列最大值 |
MIN | 计算某一列最小值 |
计算男生的平均成绩 (如果没有找到的话,返回NULL)
SELECT AVG(score) average FROM students WHERE gender='M';
如果要统计表中有多少记录的话 使用COUNT(*),或COUNT(id). 但是如果想使用其他字段的话 如果字段可以为NULL,则统计出来的数据是 表中该字段有多少记录.
分组聚合
如果我们要统计一班学生的数量我们可以 用
SELECT COUNT(*) num FROM students WHERE class_id=1
查询,但是如果查询其他班级的话 每次都要更新SQL语句 就太烦了, 这个时候就用到了分组查询.
SELECT COUNT(*) num FROM students GROUP BY class_id;
查询班级人数,分数(保留两位小数),和班级id. 语句和结果如下
SELECT class_id,COUNT(*) student_num,ROUND(AVG(score),2) avg_score FROM students GROUP BY class_id;
class_id | student_num | avg_score |
---|---|---|
1 | 4 | 86.5 |
2 | 3 | 73.66666666666667 |
3 | 3 | 89.33333333333333 |
查询每个班级的男女生人数
SELECT class_id, gender , count(*) FROM students GROUP BY class_id,gender;
使用一条SQL 查询每个班级的男女平均分,结果集有六条记录.
SELECT class_id,gender,ROUND(AVG(score),2) FROM students GROUP BY class_id,gender;
多表联查
SELECT 查询不仅仅可以从一张表查询数据,还可以从多张表中同事查询数据,查询多张表的语法是
SELECT * FROM <表1> <表2>
此种方法又称为 笛卡尔查询.
SELECT * FROM students,classes;
这种一次查询两个表的数据,查询的结果还是一个二维表,它是 students和classes表的成绩,即students和classes拼接在一起返回的, 要注意的一点是小心记录大爆炸, 如果两个表分别有100条, 则会 返回1w条数据. 如果两个表分别由1w条数据, 则返回1亿条 数据, 这个 东西很智障.
做笛卡尔成绩的时候 最好给输出的字段重命名一下.
SELECT students.id 学号,students.name 姓名,students.gender 性别,students.score 分数,classes.id 课程ID,classes.name 班级名 FROM students,classes;
多表查询的时候,要使用表名.列名这样的方式来应用列和设置别名. 但是,使用这种方法列举两个表的所有列有时候会因为 表名较长而比较麻烦, 这个时候我们可以用同样的方法给 表名起别名.
SELECT s.id 学号,s.name 姓名,s.gender 性别,s.score 分数,c.id 课程编号,c.name 课程名称 FROM students s,classes c;
笛卡尔积查询班级ID为1,且性别为男生的记录.
SELECT s.id 学号,s.name 姓名,s.gender 性别,s.score 分数,c.id 课程编号,c.name 课程名称 FROM students s,classes c WHERE s.gender="M" AND c.id=1;
连接查询
连接查询是另一种类型的多表查询,链接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行为有选择性的链接在主表结果集上. 例如:查询students表中的所有信息.
SELECT s.id, s.name, s.class_id, s.gender, s.score FROM students s;
如果我们想将班级也连接上去 怎么办? 按照以前所学 只能通过笛卡尔积.
SELECT s.id ID,s.class_id 班级编号,s.`name` 姓名,s.gender 性别,s.score 分数,c.id 班级ID,c.name 班级名 FROM students s,classes c WHERE s.class_id=c.id;
但是正如前面所说的 这个太蠢了. 然后试一下现在的 INNER JOIN. 其写法为 :
- 先确认主表 SELECT * FROM <表1>.
- 在确定需要链接的表 INNER JOIN <表2>
- 确认连接条件 ON <条件>. 将c.id = s.class_id的列进行链接.
SELECT s.id ID,s.class_id 班级编号,s.`name` 姓名,s.gender 性别,s.score 分数,c.id 班级ID,c.name 班级名 FROM students s INNER JOIN classes c ON c.id=s.class_id;
有内连接 就有外连接. 外连接会将 四班单独列出, 其他字段为NULL.
SELECT s.id ID,s.class_id 班级编号,s.`name` 姓名,s.gender 性别,s.score 分数,c.id 班级ID,c.name 班级名 FROM students s RIGHT OUTER JOIN classes c ON c.id=s.class_id;
右链接 , 右边是classes 以它为准 ,因为 四班没人 所以单列一个四班 其他字段为空.
SELECT s.id ID,s.class_id 班级编号,s.`name` 姓名,s.gender 性别,s.score 分数,c.id 班级ID,c.name 班级名 FROM students s RIGHT OUTER JOIN classes c ON c.id=s.class_id;
左连接 , 左边是students 以它为准, 所以不列出四班.
SELECT s.id ID,s.class_id 班级编号,s.`name` 姓名,s.gender 性别,s.score 分数,c.id 班级ID,c.name 班级名 FROM students s LEFT OUTER JOIN classes c ON c.id=s.class_id;
全连接 : 左连接代码 UNION 右连接代码 ;
内连接 顾名思义 + 图 : 得到交集.
左外连接
右外连接
全连接