SQL基础之数据的查询
Posted chenloveslife
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL基础之数据的查询相关的知识,希望对你有一定的参考价值。
一、数据查询的一般格式:
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
[INTO 新表名]
FROM <表名或视图名>[, <表名或视图名> ] …
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
二、单表查询
1. 查询指定列与计算的值
(1) 查询指定列:只需在SELECT子句中加入要查询指定列字段即可,有时会根据题意要求去从,那么得在字段前添加DISTINCT关键字。
SELECT DISTINCT Sno
FROM SC;
(2) 查询经过计算的值:在SELECT子句中的目标列表达式可以为如下:
-
算术表达式
-
字符串常量
-
函数
-
列的别名
SELECT Sname,2009-Sage --查询算术表达式结果
FROM Student;
SELECT Sname,‘Year of Birth:‘ --查询字符串常量
FROM Student;
SELECT Sname,LOWER(Sdept) --查询经过函数处理的字段信息结果
FROM Student;
--查询结果为列的信息,不过视图上列名为别名
SELECT Sname AS NAME,’Year of Birth: ’ AS BIRTH
FROM Student;
2. 查询满足条件的元组
(1) 比较大小
查询谓词:=,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符
SELECT COUNT(Jno) AS ‘项目总数‘ FROM SPJ WHERE Sno = ‘S1‘;
(2) 确认范围:
查询谓词:BETWEEN AND,NOT BETWEEN AND
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
(3) 确认集合:
查询谓词:IN , NOT IN
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( ‘IS‘,‘MA‘,‘CS‘ );
(4) 字符匹配
查询谓词:[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
匹配串为含通配符的字符串
%:代表任意长度(长度可以为0)的字符串
_:代表单个字符
--查询所有姓刘学生的姓名、学号和性别。
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE ‘刘%‘;
--查询姓"欧阳"且全名为三个汉字的学生的姓名。
SELECT Sname
FROM Student
WHERE Sname LIKE ‘欧阳_‘;
使用换码字符ESCAPE将通配符转义为普通字符
--查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。
SELECT *
FROM Course
WHERE Cname LIKE ‘DB\\_%i_ _‘
ESCAPE ‘ \\ ‘;
(5) 空值查询
查询谓词:IS NULL 或 IS NOT NULL
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;
(6) 多重条件查询
查询谓词:AND和OR来联结多个查询条件,其中查询条件又可包含上述的查询条件。
SELECT Sname
FROM Student
WHERE Sdept= ‘CS‘ AND Sage<20;
3. ORDER BY ... DESC/ASC (缺省值为升序)
表示对查询结果的升降序显示,ASC为升序,DESC为降序。
SELECT Sno,Grade
FROM SC
WHERE Cno= ‘ 3 ‘
ORDER BY Grade DESC;
注意:
当排序列含空值时,ASC:排序列为空值的元组最后显示,DESC:排序列为空值的元组最先显示。
ORDER BY 不能在子查询中使用,由于ORDER BY是对查询结果的排序。
4. GROUP BY ... HAVING ...
其作用对象是查询的中间结果表,最终结果表为按指定条件对查询结果的分组结果。
GROUP BY后为分组依据(字段名),被指定的一列或多列值分组,值相等的为一组;HAVING后多为聚合函数满足条件,聚合函数将会分别作用于前面根据分组依据分完组的每个组。
/*查询供应了3个以上项目的供应商代码和供应的项目总数。*/
SELECT Sno, COUNT(DISTINCT Jno) AS ‘项目总数‘
FROM SPJ
GROUP BY Sno
HAVING COUNT(DISTINCT Jno) > 3;
注意:
使用Group By子句后,Select子句的字段列表达式只能是分组依据和聚集函数
HAVING短语与WHERE子句的主要区别是作用对象不同,其中WHERE子句作用于基表或视图,从中选择满足条件的元组,而HAVING短语作用于组,从中选择满足条件的组
5. 聚合函数
计数:
COUNT([DISTINCT|ALL] *)
COUNT([DISTINCT|ALL] <列名>)
计算总和:
SUM([DISTINCT|ALL] <列名>)
计算平均值:
AVG([DISTINCT|ALL] <列名>)
最大最小值:
MAX([DISTINCT|ALL] <列名>)
MIN([DISTINCT|ALL] <列名>)
SELECT COUNT(Jno) AS ‘项目总数‘
FROM SPJ
WHERE Sno = ‘S1‘;
注意:只能在SELECT子句中或HAVING后使用。
三、连接查询
连接查询为多表查询,即把要查询的记录在两个表中,那么就要连接两表来查询。其中包含连接谓词:用来连接两个表的条件,必须要求连接字段数据类型是可比的,
例如:SELECT SUM(Ccredit) FROM SC, Course WHERE Sno=‘200215122‘ AND SC.Cno=Course.Cno。
3种类型的连接查询执行过程:
嵌套循环法(NESTED-LOOP)
排序合并法(SORT-MERGE)
常用于=连接索引连接(INDEX-JOIN)
1. 等值与非等值查询
等值连接运算符:=
非等值连接运算符:!=
SELECT *
FROM Student,SC
WHERE Student.Sno = SC.Sno;
SELECT *
FROM Student,SC
WHERE Student.Sno != SC.Sno;
自然连接则为在等值连接的基础上消除重复的列
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno = SC.Sno;
SELECT Student.Sno,sc.sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno != SC.Sno;
2. 自身连接
一个表和其自身表连接,注意必须给表起别名加以区分不同表的属性,否则sql引擎识别不出你要指定的属性,会报错。
--查询每门课程的有先修课程的课程名
SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno = SECOND.Cno;
3. 外连接
这里根据内连接与外连接的区别来讲解外连接:
(1) 内联接:(典型的联接运算,使用像 = 或 <> 之类的比较运算符)。包括相等联接和自然联接。
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。
(2) 外联接:外联接可以是左向外联接、右向外联接或完整外部联接。
在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:
1)LEFT JOIN或LEFT OUTER JOIN
左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
2)RIGHT JOIN 或 RIGHT OUTER JOIN
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
3)FULL JOIN 或 FULL OUTER JOIN
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
/*查询每个学生及其选修课程的情况*/
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student INNER JOIN SC
ON Student.Sno=SC.Sno;
--结果集合种不包括未选修课的学生
/*查询所有学生的选修课程的情况*/
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM Student LEFT OUTER JOIN SC
ON Student.Sno=SC.Sno;
--结果集种没有选课的学生也包含在内,Cno和Grade字段显示为null
4. 多表查询
/*查询每个学生的学号、姓名、选修的课程名及成绩*/
SELECT Student.Sno,Sname,Cname,Grade
FROM Student,SC,Course
WHERE Student.Sno = SC.Sno
AND SC.Cno = Course.Cno;
四、嵌套查询
以上是关于SQL基础之数据的查询的主要内容,如果未能解决你的问题,请参考以下文章