Sql Server查询语句
来源:互联网 发布:不教翠羽遇萧峰 知乎 编辑:程序博客网 时间:2024/05/17 07:55
一、查询语句格式
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;
- Sql Server 查询语句
- SQL SERVER 查询语句
- SQL server 查询语句
- SQL Server查询语句
- Sql Server查询语句
- sql server 简单查询语句
- SQL Server 语句查询手册
- sql server 查询语句积累
- sql server 查询语句基础
- SQl Server 查询语句总结
- sql server游标查询语句
- SQL server经典查询语句
- sql server 语句查询、函数
- SQL Server查询SQL语句的执行时间
- SQL Server SQL高级查询语句小结
- SQL Server SQL高级查询语句小结
- SQL Server SQL高级查询语句小结
- SQL Server SQL高级查询语句小结
- 混合开启服务
- nyoj 1187 模拟2048
- MySQL命令(详细)
- 501. Find Mode in Binary Search Tree\492. Construct the Rectangle\*486. Predict the Winner\输出一个level
- 操作系统各大知识模块
- Sql Server查询语句
- hduoj-5311【dfs】
- Android异步实现——IntentService
- 3.11考试
- 设计模式:代理模式
- 文章标题
- POJ特殊密码锁
- spring cloud小坑之抽取model
- [unity] 在unity game视窗中光标正常,Build&Run为exe运行后光标消失的解决办法