今天因为有点原因所以课程有点少,主要内容是查询语句
1.1. DISTINCT
语法
SELECT [DISTINCT] 列名[, 列名]... FROM 表名
注意事项
*可以替代列名, 表示所有列, 但是通常我们为了提高代码的可读性, 不使用*
DISTINCT为过滤重复记录
如果DISTINCT后面跟多列, 是过滤掉多列合并之后的重复
练习
查询employee表中所有记录
select id,username,gender,birthday,position,salary,resume from user;
查询employee表中所有人的薪水
select username,salary from user;
查询employee表中包含哪些岗位
1.2. 列名表达式
语法
SELECT 列名|表达式[,列名|表达式]... FROM 表名
注意事项
表达式只是显示时起作用, 不会改变数据库中的值
练习
导入student.sql
source .....
查询所有学生的总分
select name,chinese+math+english from student;
查询employee表, 将所有员工薪水*2显示
select username,salary*2 from user;
1.3. AS
SELECT 列名 AS 别名 FROM 表名
注意事项
起别名时AS可以省略
不会改变数据库中的值
练习
查询所有学生总分, 别名为总分
select name '姓名',chinese+math+english '总分' from student;
1.4. WHERE
语法
SELECT 列名 FROM 表名 [WHERE 条件语句]
WHERE子句中的运算符
比较运算符 | >, <, >=, <=, =, <> | 注意不等于和Java中不同, 是<> |
BETWEEN ... AND ... | 某一区间内的值, 从 ... 到 ... | |
IN(列表) | 在列表之中, 例: in(1,2,3) 代表1或2或3 | |
LIKE(表达式) | 模糊查询, %代表多个字符, _代表单个字符 | |
IS NULL | 判断是否为NULL | |
逻辑运算符 | AND && | 与, 两边都为TRUE结果为TRUE |
OR || | 或, 一边为TRUE结果就为TRUE | |
NOT ! | 非, 将表达式结果取反 |
练习
查询英语分数在80-90分之间的
select name,english from student where english>=80 and english<=90;
查询语文分数为81,82,83的学生
select name,english from student where english in(80,90,82);
查询所有姓张的学生的成绩
select name,english,math,chinese from student where name like '张%';
查询除了姓张和姓李的学生总分
select name,english,math,chinese
from student
where name not like '张%'
and name not like '李%';
select name,english,math,chinese
from student
where name like '张%'
or name like '李%';
1.5. ORDER BY
语法
SELECT 列名 FROM 表名 ORDER BY 列名 ASC|DESC;
注意事项
ORDER BY 指定排序的列名可以是表中的列名, 也可以是SELECT语句后面起的别名
ASC为升序, DESC为降序
ORDER BY应在查询语句的结尾
练习
对数学成绩排序后输出
select name,math from student order by math;
查询总分, 从高到低显示
select name '姓名',chinese+math+english '总分' from student order by 总分 desc;
选择所有姓张的学生的英语成绩, 并从高到低排序
select name,english from student where name like '张%' order by english desc;
查询学生成绩, 按照语文从高到低排序, 如果语文相同, 按照英语从高到低排序
select * from student order by chinese desc,english desc;
1.6. COUNT函数
语法
SELECT COUNT(*)|COUNT(列名) from 表名 [WHERE 条件语句]
注意事项
COUNT(列名)的方式是统计指定列中有多少条记录, 不包括值为NULL的
COUNT(*)则是统计表中有多少条数据
COUNT(DISTINCT 列名) 统计不重复的记录数
如果加上WHERE子句, 则是统计满足条件的记录
练习
统计student表中有多少条记录
select count(*) from student;
统计学生语文成绩大于80的有多少人
select count(*) from student where chinese>80;
统计总分大于250的有多少人
select count(*) from student where english+math+chinese>250;
统计参加英语考试的有多少人
select count(english) from student;
1.7. SUM函数
语法
SELECT SUM(列名) FROM 表名 [WHERE 条件语句];
注意事项
计算指定列中所有记录的和, 如果有WHERE子句则计算满足条件的记录
练习
计算所有学生的数学成绩总和
select sum(math) from student;
显示所有学生的语文成绩总和, 数学成绩总和, 英语成绩总和
select sum(chinese),sum(math),sum(english) from student;
计算所有学生的分数总和
select sum(chinese)+sum(math)+sum(english) from student;
统计英语平均分
select sum(english)/count(*) from student;
select sum(english)/count(english) from student;
1.8. AVG函数
语法
SELECT AVG(列名) FROM 表名 [WHERE 条件语句];
注意事项
计算指定列的平均值, 如果有WHERE子句, 则计算满足条件的记录
AVG()统计平均数不包含NULL值
练习
计算英语平均分
select avg(english) from student;
计算总分平均分, MySQL不支持组函数嵌套使用.
select sum(english+math+chinese)/count(*) from student;
1.9. MAX / MIN函数
语法
SELECT MAX(列名) FROM 表名 [WHERE 条件语句];
SELECT MIN(列名) FROM 表名 [WHERE 条件语句];
注意事项
获取指定列最高/最低值, NULL不参与统计
练习
统计总分最高分和最低分
select max(english+math+chinese),min(english+math+chinese) from student;
1.10. GROUP BY(重点)
语法
SELECT 列名 FROM 表名 GROUP BY 列名 [HAVING 条件语句]
注意事项
按照某列归类
HAVING和WHERE类似, 但HAVING是作用于组, 其中可以使用组函数
SELECT列表中未包含在组函数中的列名, 只能是GROUP BY中的列名
HAVING中可以使用组函数, WHERE不能.
练习
导入order.sql
对订单表归类, 显示购买过哪些商品
select product from orders group by product;
select distinct product from orders;
对订单表归类, 显示购买过哪些商品, 并显示每种购买了几个, 以及总价
select product,count(product),sum(price) from orders group by product;
查询总价大于5000的商品有哪几类
select product,count(product),sum(price) sum_price from orders group by product having sum_price>5000;