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。

DROP, TRUNCATE, DELETE的区别