数据库(三)
条件判断语句:
在mysql中,允许根据查询结果值的不同,返回不同的内容。
双分支语句:相当于三目运算符,条件满足,返回一个结果;条件不满足,返回另一个结果。
-- 显示所有学生,并且显示该学生的成绩是否合格
SELECT s.*,**IF(s_grade>=60,'合格','不合格')** grade FROM t_student s;
多分支语句:相当于 if …… else if ……
查询:
-- 查询所有学生,并且显示该学生的等级(优良中差)
SELECT s. ***,** (**CASE WHEN** s_grade IS NULL **THEN** '缺考' **WHEN** s_grade>=90 **THEN** '优' **WHEN** s_grade>=80 **THEN** '良' **WHEN** s_grade>=60 **THEN** '中' **ELSE** '差' **END** ) grade FROM t_student s;
修改:
-- 药品类商品上涨5元,食品类商品上涨2元,酒类商品上涨10元
UPDATE t_product **SET t_price=t_price+** (
CASE **WHEN** t_productType='药品类' **THEN 5** **WHEN** t_productType='食品类' THEN 2 ELSE 10 END);
聚合函数:
count
统计行的数量。
1、count(*) :统计所有符合条件的记录
-- 统计有几种商品
SELECT **COUNT(*)** FROM t_product;
-- 统计食品类商品有几个
SELECT **COUNT(*)** FROM t_product **WHERE** t_productType='食品类';
2、count(列名) :只统计非空列
-- 统计非null厂家记录
SELECT **COUNT(t_factory)** FROM t_product;
3、count(distinct 列名) :只统计非空、不重复的列
-- 统计有几类商品
SELECT **COUNT(DISTINCT t_productType)** FROM t_product;
sum
统计某个列的总和。
-- 统计商品的总价格
SELECT SUM(t_price) FROM t_product;
avg
统计某个列的平均值,只统计非空列;而sum/count统计所有列。
-- 统计商品的平均价格
SELECT **AVG(t_price)** ,**SUM(t_price)/COUNT(*)** FROM t_product;
max
统计某个列的最大值。
min
统计某个列的最小值,不统计空值。
-- 统计商品价格最大值和最小值
SELECT MAX(t_price),MIN(t_price) FROM t_product;
分组查询:
group By:
分组就是将指定规则中相同的数据进行”小区域(组)”的划分,然后针对若干个“小区域”进行数据处理。
分组执行在where以后,是对where条件筛选的结果进行分组。
-- 统计每一类商品的数量
SELECT t_productType,COUNT(*) FROM t_product **GROUP BY** t_productType;
-- 统计价格在50元以上,每类商品数量
SELECT t_productType,COUNT(*) FROM t_product **WHERE** t_price>=50 **GROUP BY** t_productType;
注意:分组后,查询列只能出现分组列和聚合函数。
多列分组:
在group By 后面可以跟多个列,多个列的值完全相同算一个组。
-- 统计每个厂家生产不同类别商品的数量,厂家和类别都相同为一个组
SELECT **t_factory,t_productType**,COUNT(*) FROM t_product GROUP BY **t_factory,t_productType**;
Having:
having 是对分组以后的结果进行筛选,执行在分组之后。
-- 查询商品类别数量在3个以上的类别
SELECT t_productType,COUNT( *) FROM t_product GROUP BY t_productType **HAVING** COUNT(* )>3;
Where 和 Having 的区别:
Where 执行在分组之前,不能跟聚合函数;
Having 执行在分组之后,是对分组结果进行筛选,一般使用聚合函数进行筛选。
SQL执行顺序:
后执行的子句,可以使用前执行子句中的计算结果、定义的别名等。
执行顺序:(除select外)
1、执行 from
2、执行 where 进行条件筛选
3、执行 group by 分组
4、执行 select 查询列
5、执行 having 对分组结果进行筛选
6、执行 order by 排序
7、执行 limit 返回限定行
子查询:
在一个查询语句中在嵌套一个查询语句,称为子查询。
-- 查询比绿豆糕价格更高的商品
SELECT * FROM t_product WHERE t_price> **(SELECT t_price FROM t_product WHERE t_productName='绿豆糕')** ;
-- 查询所有员工的姓名,以及该员工所处的部门名称
SELECT e_name,(SELECT d_name FROM t_dept WHERE pk_deptId=fk_deptId) deptName FROM t_employee;
1、子查询嵌在 from 之后,相当于临时表。也就是将子查询查询的结果当作表来用。
注意:子查询的结果必须加别名。
-- 查询张勇是做什么工作
SELECT * FROM **(SELECT e_name,(SELECT d_info FROM t_dept WHERE pk_deptId=fk_deptId)
info FROM t_employee) eminfo** WHERE e_name='张勇';
2、在 where 后嵌入子查询。如果子查询的结果是单行单列(查询结果只有一个值),外查询才可以使用 =、!=、 >、>=、 <、 <=。
-- 查询和钱二同一个部门的员工 SELECT * FROM t_employee WHERE fk_deptId=(SELECT fk_deptId FROM t_employee WHERE e_name='钱二');
注意:如果子查询返回的结果是多行多列,外查询只能用 in 或 not in。
-- 查询和张勇、周军同一个部门的员工
SELECT * FROM t_employee WHERE fk_deptId **IN**
(SELECT fk_deptId FROM t_employee WHERE e_name **IN**('张勇','周军'));
All:
和子查询的结果逐一比较,必须全部满足时表达式的值才为真。
-- 查询所有比食品类商品价格更高的商品
SELECT * FROM t_product WHERE t_price >ALL(SELECT t_price FROM t_product WHERE t_productType='食品类');
SELECT * FROM t_product WHERE t_price >(SELECT MAX(t_price) FROM t_product WHERE t_productType='食品类');
Any:
和子查询的结果逐一比较,其中一条记录满足条件则表达式的值就为真。
-- 查询比任意食品类商品价格高的商品
SELECT * FROM t_product WHERE t_price >ANY
(SELECT t_price FROM t_product WHERE t_productType='食品类');
exists:
判断子查询是否存在数据,如果存在则表达式为真,反之为假;not exists 相反。