(三)数据结构化查询语言(高级用法)
1.排序查询Order By子句
语法:select ...from t2 [where子句][order by 子句]
格式: order by 列名 asc|desc
asc:升序排列 默认就是升序 所以可以省略
desc:降序排列
永远sql语句的最后
2.distinct 去除重复
只能指定一个字段,指定多个字段是distinct无效,必须在selcet后。
无效:SELECT DISTINCT price,name FROM t2 ORDER BY price
有效:SELECT DISTINCT price FROM t2 ORDER BY price
3.分组查询Group By子句
我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;
另外聚合函数会忽略空值。因此,有时候需要使用函数:ifnull(字段1,vlaue)(如果字段1对应的值不是null,就使用原来的值;否则,就使用value值)
语法:select ... from name [where 条件] [group by 子句] [order by子句]
格式: group by 字段1,字段2;
五个聚合函数
count:统计指定列不为NULL的记录行数;
sum:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
max:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
min:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
例:
查询以部门ID为分组员工的平均工资
select deptid,avg(mony) as av from t2 group by deptid;
4.分组查询添加条件Having子句
在分组查询时,可能需要使用条件进行过滤,having子句可以使用在聚合函数后。
例:
查询以部门ID为分组员工的平均工资并且大于4000的部门
select deptid,avg(mony) as av from t2
group by deptid having avg(mony)>4000;
基本查询总结
基本查询子句有:select子句,from子句,where子句,group by子句,having子句,order by子句
完整的查询语句
select...from...[wher...][group by...][having...][order by...]
执行顺序
from子句--where子句--group by子句--having子句--select子句--order by子句
高级关联查询
有的时候,我们要查询的数据, 一个简单的查询语句满足不了,并且我们使用的数据,表中不能直观体现出来。
而是预先经过一次查询才会有所体现。那么先执行的查询,我们称之子查询。被子查询嵌入的查询语句称之为父查询。
子查询返回的数据特点:
(1) 可能是单行单列的数据。
(2) 可能是多行单列的数据
(3) 可能是单行多列的数据
(4) 可能是多行多列的数据
子查询可以在where,from,having,select子句中,在select中相当外连接的另一种写法吧!
例:
查询表中各部门人员中大于部门平均工资的人
select name,mony,a.deptid,b.av
from t2 a,
(select deptid,avg(ifnull(mony,0)) as av from t2 group by deptid)
where a.deptid=b.deptid and a.mony>b.av
order by deptid ASC;
其他例子:
如果时间的类型是date,则使用符号比较大小
SELECT empno,ename,hiredate FROM emp
WHERE hiredate > '1981-02-01' AND hiredate < '1987-05-01';
查询结果是表达式(运算查询):将所有商品的价格+10元进行显示
select pname,price+10 from product;
商品没有分类的商品
SELECT * FROM product WHERE category_id IS NULL;
查询有分类的商品
SELECT * FROM product WHERE category_id IS NOT NULL;
感谢大家,点赞,收藏,关注,评论!