Sql Server查询语句
一、查询语句格式
SELECT \[ALL|DISTINCT\] \[表名.\]\{\*|列名|表达式\[AS 新列名\]\}
\[INTO :主变量\[,:主变量\]…\]
FROM 表名\[表别名\], …
\[WHERE 条件表达式|子查询\]
\[GROUP BY 列名, …
\[HAVING 分组表达式\]\]
\[\{UNION|INTERSECT |EXCEPT\}SELECT…FROM…\]
\[ORDER BY 列名|列序号\[ASC|DESC\], …\];
二、单表查询
Where 子句——运算符
比较:<、<=、>、>=、=、<>、not \+ ~
确定范围:
Between A and B、Not Between A and B
确定集合:IN、NOT IN
字符匹配:LIKE,NOT LIKE
空值:IS NULL、IS NOT NULL
多重条件:AND、OR、NOT
1----
SELECT Sname NAME, 'Year of Birth:' BIRTH,
2003\-sage BIRTHDAY, LOWER(Sdept) DEPARTMENT
FROM Student;
2--- 选择表中的行
消除重复行: DISTINCT (缺省为ALL)
SELECT DISTINCT Sno FROM student
3--- BETWEEN AND
求年龄在~ (含, 22)之间的学生名及年龄(或不在~之间)
SELECT Sname, Sage FROM Student
WHERE Sage BETWEEN 18 AND 22; (WHERE Sage>=18 AND Sage<=22);
4--- IN or NOT IN
SELECT \* FROM Student
WHERE Sdept IN (‘IE’, ‘CS’, ‘MA’);(WHERE Sdept=‘IE’OR Sdept=‘CS’OR Sdept=‘MA’)
5--- Like
格式:
\[NOT\] LIKE ‘匹配串’\[ESCAPE ‘换码字符’\]
%: 表示任意长度(≥)的任意字符
\_: 表示单个的任意字符
ESCAPE ‘换码字符’: 匹配串中‘换码字符’(转义符)之后的字(%,\_\_),被定义为普通字符(不作通配符用)
列出课程名称中带有‘\_’的课号及课名:
Select cno ,cnameFrom Course Where cname LIKE ‘%"\_%’escape ‘"’
求以‘DATA\_BASE’开头且倒数第五个字符为’S’的课程名
SELECT Cname FROM Course WHERE Cname LIKE ‘DATA"\_BASE%S\_ \_ \_ \_’ESCAPE’"’;
6--- NULL
SELECT Sno, Cno FROM SC WHERE Grade IS NULL;
7--- 分组与组函数
只有出现在Group By子句中的属性,才可出现在Select子句中
组函数的使用:
COUNT(\[DISTINCT|ALL\] \*|列名)
SUM(\[DISTINCT|ALL\] 列名)
AVG(\[DISTINCT|ALL\] 列名)
MAX(\[DISTINCT|ALL\] 列名)
MIN(\[DISTINCT|ALL\] 列名)
组函数可用于SELECT子句中的目标列表中,或在HAVING子句的分组表达式中用作条件。
对分出的每一组用HAVING进行筛选,筛选条件要用到组函数。
Having 与Where的区别:
Where 决定哪些元组被选择参加运算,作用于关系中的元组
Having 决定哪些分组符合要求,作用于分组
例:统计各系学生的人数。
Select sdept,count(\*) as stu\_count
From Student
Group By sdept
例:求选修了课程的学生人数
SELECT COUNT(DISTINCT Sno) FROM SC;
例:求选修各门课的人数及平均成绩
SELECT Cno, COUNT(Sno), AVG(GR) FROM SC GROUP BY Cno;
例:求选修课程在2门以上且都及格的学生号及总平均分
SELECT Sno, AVG(Grade) FROM SC GROUP BY Sno HAVING COUNT(Cno)>2 AND MIN(Grade)>=60;
8--- 排序
用ORDER BY子句对查询结果按照一个或多个列的值进行升/降排列输出,升序为ASC;降序为DESC,空值将作为最大值排序
连接查询
多表连接查询、单表连接查询(自连接)、外连接查询、复合条件连接查询.
示例数据表:
学生信息表Student; 课程信息表Course; 选课情况表SC,教师信息表teacher
1--- 单表连接(自连接)
用表别名把一个表定义为两个不同的表进行连接。
2--- 左连接、右连接、全外连接
求各部门名及职工名,要求输出无职工的部门(职工以空值出现)
SELECT DNAME,TNAME FROM department D,teacher T
WHERE D.DNO = T.DNO(\*);(有\*则,别表示该列可以为空 Left join )
求各部门名及职工名,要求输出无职工的部门和未分配部门的职工
SELECT DNAME,TNAME FROM department D,teacher T
WHERE D.DNO (\*) = T.DNO(\*);(Full join )
3--- 复合条件连接
嵌套查询
在SELECT …FROM …WHERE语句结构的;
WHERE子句中可嵌入一个SELECT语句块;
其上层查询称为外层查询或父查询;
其下层查询称为内层查询或子查询;
SQL语言允许使用多重嵌套查询;
在子查询中不允许使用ORDER BY子句;
嵌套查询的实现一般是从里到外,即先进行;
子查询,再把其结果用于父查询作为条件。
1--- 返回一组值得子查询
求选修‘C6‘课程且成绩超过分的学生
SELECT \* FROM student
WHERE sno IN ( SELECT sno FROM SC WHERE Cno='C6' AND Grade>);
求比计算机系中某一学生年龄小的其他系的学生
SELECT \* FROM student
WHERE sdept!=’CS’AND sage <ANY( SELECT Sage FROM Student WHERE Sdept=‘CS’);
带有EXISTS的相关子查询
不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询。
相关子查询:子查询的查询条件依赖于外层父
查询的某个属性值的称为相关子查询(Correlated Subquery),带EXISTS的子查询就是相关子查询
EXISTS表示存在量词,带有EXISTS的子查询不返回任何记录的数据,只返回逻辑值‘True ’或‘False ’
例:求所有选修了‘C1’课程的学生名。
不相关子查询
SELECT Sname FROM student
WHERE sno IN ( SELECT sno FROM SC WHERE Cno = 'C1' );
相关子查询
SELECT Sname FROM student
WHERE EXISTS
(
SELECT \* FROM SC
WHERE student.sno=SC.sno AND Cno='C1'
);
先在外层查询中取student表的第一个元组(记录),用该记录的
相关的属性值(在内层WHERE子句中给定的)处理内层查询,若
外层的WHERE子句返回‘TRUE’值,则此元组送入结果的表中。然
后再取下一个元组;重复上述过程直到外层表的记录全部遍历一次为止。
不关心子查询的具体内容,因此用SELECT \*, Exists \+ 子查询用来判断该子查询是否返回元组
当子查询的结果集非空时,Exists为'True'; 当子查询的结果集为空时,Exists为'False'
NOT EXISTS :若子查询结果为空,返回‘TRUE’值,否则返回‘FALSE’
例:列出没有选C1课程的学生的学号、姓名
SELECT Sname FROM student
WHERE NOT EXISTS
(
SELECT \* FROM Course
WHERE student.sno=SC.sno AND Cno='C1'
);
例:查询选修了所有课程的学生的姓名
SELECT Sname FROM student
WHERE NOT EXISTS
(
SELECT \* FROM Course
WHERE NOT EXISTS
(
SELECT \* FROM SC
WHERE student.sno=SC.sno AND Course.Cno=SC.Cno
)
); /\*该学生不存在于 所有课都选的学生的集合之中\*/
例:名查询至少选修了S1所选的全部课程的学生
SELECT Sname FROM student
WHERE NOT EXISTS
(
SELECT \* FROM SC SCX
WHERE SCX.sno='s1' AND NOT EXISTS
(
SELECT \* FROM SCSCY
WHERE student.sno=SCY.sno AND SCX.Cno=SCY.Cno
)
); /\*该学生不存在于 S1所有课都选的学生的集合之中\*/
注意细节
在FROM语句中使用子查询,对查询结果定义表名及列名
SELECTSno, AVG\_G
FROM (
SELECTSno,AVG(Grade) FROM SC
GROUP BY Sno
) AS RA(Sno,AVG\_G)
WHERE AVG\_G>80;
还没有评论,来说两句吧...