SQL相关
一、视图
视图:从一个或几个基本表(或视图)导出的表,是要给虚表。数据库中只存放视图的定义,不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以基本表中的数据发生变化,从视图中查询出的数据也随之改变。
建立视图:CREATE VIEW <视图名>(列名,列名) AS <子查询> 【子查询不允许有ORDER BY和DISTINCT】
删除视图:DROP VIEW <视图名> [CASCADE] 【如果该视图上还导出了其他视图,则CASCADE会将该视图和由它导出的所有视图一起删除】
视图的作用:
1)简化用户的操作
2)使用户能以多种角度看待同一数据
3)对重构数据库提供了一定程度的逻辑独立性
4)能对机密数据提供安全保护
5)更清晰的表达查询
二、聚集函数
1)COUNT(*) 统计元组个数
2)COUNT(<列名>) 统计一列中值的个数
3)SUM(<列名>) 计算一列值的总和(数值型)
4)AVG(<列名>) 计算一列值的平均值(数值型)
5)MAX(<列名>) 求一列值中的最大值
6)MIN(<列名>) 求一列值中的最小值
注意:在聚集函数遇到空值时,除COUNT(*)外,都跳过空值而只处理非空值。WHERE子句中是不能用聚集函数作为条件表达式的。
三、GROUP BY子句
将查询结果按某一列或多列的值分组,值相等的为一组。分组后聚集函数将作用于每一个组,即每一个组都有一个函数值。
例1:求各个课程号及响应的选课人数
SELECT Cno, COUNT(Sno) FROM SC GROUP BY Cno
例2:查询选修了3门以上课程的学生学号
SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) > 3
WHERE与HAVING区别:作用对象不同,WHERE作用于基本表或视图,从中选择满足条件的元组;HAVING作用于组,从中选择满足条件的组。
例3:查询三门课程成绩都大于80的学生姓名
select S.name form Student S group by S.name having min(S.score)>=80
或者select distinct A.name from Student A where A.name not in(select distinct S.name from Student S where S.score < 80)
例4:一个表只有一列name,有重复的name,求出前十个name数最大的name
select distinct name, count(name) a from user group by name order by a desc limit 10
四、内外连接
1.内连接(inner join):只显示符合连接条件的记录。
2.左外连接(left join或left outer join):显示左表的全部记录,在右表找不到匹配的用null补齐。
3.右外连接(right join或right outer join):显示右表的全部记录,在左表找不到匹配的用null补齐。
4.全外连接(full join或full outer join):除了显示符合连接条件的记录外,在2个表中的其他记录也显示出来。
ps:内连接效率比左外连接要好。在解析阶段,先进行内连接,再在内连接结果集的基础上加上左外连接的结果集;在编译优化阶段,如果左连接结果集和内连接一致,则左连接会转换成内连接。
求交集:
select * from A inner join B using(c1, c2, c3)等同于select * from A inner join B on A.c1=B.c1 and A.c2=B.c2 and A.c3=B.c3
求差集:
select * from A left join B using(c1, c2, c3) (如果A中有数据B中没有,比如C1中有,则应加上where B.c1 is null)
求出在A中不在B中的数据。
求并集:
用union。