数据库3.1查询语句

查 询 条 件

谓    词

比    较

=,>,<,>=,<=,!=,<>, NOT+上述比较运算符

确定范围

BETWEEN ANDNOT BETWEEN AND

确定集合

INNOT IN

字符匹配

LIKENOT LIKE

空    值

IS NULLIS NOT NULL

逻辑运算

ANDORNOT

1.向表中插入数据,使用INSERT INTO 表VALUE(值),插入表的值,每行数据用,隔开,最后用;结束。

INSERT INTO Course VALUES ('2','数学',NULL,2),
('6','数据处理',NULL,2),('4','操作系统','6',3),('7','PASCAL语言','6',4),
('5','数据结构','7',4),('1','数据库','5',4),('3','信息系统','1',4);

2.*号代表所有字段,查询语句用SELECT,SELECT后跟要查询的属性,如果跟*代表查询所有信息,FROM后跟从哪个表里查询。

SELECT * FROM Student;  
--等价于:
SELECT Sno,Sname,Ssex,Sage,Sdept 
FROM Student;

3.更改查询结果中的列标题,可以省略AS关键字,更改列标题使用SELECT查询语句,SELECT后跟原列标题空格新列标题,FROM后跟要更改的表名。

SELECT Sno AS 学号,Sname AS 姓名,Ssex AS 性别,Sage AS 年龄,Sdept AS 院系
FROM Student;
--等价于: 
SELECT Sno 学号,Sname 姓名,Ssex 性别,Sage 年龄,Sdept 院系
FROM Student;

4.DISTINCT关键字可用于获得唯一性记录,被DISTINCT限制的既可以是单个属性,也可以是多个属性的组合。DISTINCT放在要查询的属性前,重复的元素只输出一次。

SELECT Sdept FROM Student; 
--等价于SELECT ALL Sdept FROM Student; 
--默认范围ALL,可省略,保留查询结果中取值重复的行
SELECT DISTINCT Sdept FROM Student; 
--DISTINCT保证查询结果中的元组唯一,不可省略

5.查询满足指定条件的元组,可通过使用WHERE子句实现。在Student和SC表中,查询自己相关记录。可以查询SC表中学号为20145的学生的所有信息。

SELECT *
FROM SC
WHERE Sno='20145'; 

6.LIKE谓词用于指出一个字符串是否与指定的字符串相匹配,匹配串可为含通配符的字符串。可搭配使用的通配符有两个:%(百分号)和_(下划线)。%(百分号)代表任意长度(包括0)的字符串。_(下划线)代表任意单个字符。在WHERE限定中的属性后面使用LIKE,可以找不特定元素的信息,%不限定字数,_限定一个字

SELECT Sno,Sname,Sdept,Sage 
FROM Student	
WHERE Sname LIKE '刘%'; 
--查询姓刘的学生信息。
SELECT Sno,Sname,Sdept,Sage 
FROM Student
WHERE Sname LIKE '刘_'; 
--查询姓刘且单名一个字的学生信息。
SELECT Sno,Sname,Sdept,Sage 
FROM Student
WHERE Sname NOT LIKE '刘%'; 
--查询不姓刘的学生信息。

7.谓词BETWEEN AND,BETWEEN AND用以查询确定闭区间范围的值,包括下界值上界值 。

BETWEEN后是范围的下界(即低值),AND后是范围的上界(即高值)。在WHERE限定词中使用BETWEEN和AND

--查询成绩在80到90之间的选修记录。
SELECT * FROM SC
WHERE GRADE BETWEEN 80 AND 90;
--等价于:
SELECT * FROM SC
WHERE GRADE >=80 AND GRADE<=90;

--查询成绩不在80到90之间的选修记录。
SELECT * FROM SC
WHERE GRADE NOT BETWEEN 80 AND 90;
--等价于:
SELECT * FROM SC
WHERE GRADE <80 OR GRADE>90;

8.IN可以用来查询属性值属于指定集合的元组。在WHERE限定的属性后使用IN,

--查询1号、5号、6号课程的选修记录。
SELECT * FROM SC
WHERE Cno IN('1','5','6');
--等价于:
SELECT * FROM SC
WHERE Cno ='1' OR Cno ='5' OR Cno ='6';
--查询1号、5号、6号以外课程的选修记录。
SELECT * FROM SC
WHERE Cno NOT IN('1','5','6');
--等价于:
SELECT * FROM SC
WHERE Cno <>'1' AND Cno<>'5'  AND Cno<>'6';
SELECT  Sno FROM SC
WHERE Cno ='1' 
and sno in
(select sno from sc
where cno='5'
)

在查询同时选了两门课学生的信息时,在WHERE中使用一个嵌套语句而不是直接使用and

9.用户可以用ORDER BY(排序)子句对查询结果按照一个或多个属性的升序(ASC)或降序(DESC)排列,默认为升序。在WHERE限定词后跟排序order by语句,order by后跟排序的属性,DESC为降序。

--查询1号课程的选修记录,并按成绩降序排列。
SELECT Sno,Grade FROM SC
WHERE Cno='1'
ORDER BY Grade DESC;

--查询所有学生记录
--查询结果按所在院系升序排列
--同一院系的学生按年龄降序排列
SELECT * FROM Student
ORDER BY Sdept,Sage DESC;

10.将查询结果按指定的一列或多列值分组,值相等的为一组。

细化聚集函数的作用对象:如果未对查询结果分组,聚集函数将作用于整个查询结果对查询结果分组后,聚集函数将分别作用于每个组,即每组都有一个函数值。

如果分组后还要求按一定的条件对这些进行筛选,最终只输出满足条件的组,则可以使用HAVING短语指定筛选条件。查询的属性后直接跟汉字则查询后的这一列前会出现此汉字,可以用GROUP BY将他们放在同一个组中,having可以限定条件

--查询学生学号及其选修的课程数
SELECT Sno 学号,Count(*) 课程数
FROM SC
GROUP BY Sno;
--查询至少选修了三门课的学生学号和选修的课程数
SELECT Sno 学号,Count(*) 课程数
FROM SC
GROUP BY Sno
HAVING Count(*)>=3;

11.笛卡尔积CROSS JOIN可省略,从连个表中查询就默认将这两个表连接起来

SELECT *
FROM Student,SC;
--无条件连接,即笛卡尔积
SELECT *
FROM Student CROSS JOIN SC;
--交叉连接,即笛卡尔积
以上两种写法功能相同,均可以实现Student和SC的笛卡尔积。

12.等值连接

INNER JOIN...ON可省略,直接在FROM中用两个中相同的属性将表连接起来即可

SELECT *
FROM Student,SC
WHERE Student.Sno=SC.Sno;
--等值连接
SELECT *
FROM Student INNER JOIN SC
ON Student.Sno=SC.Sno;
--内连接,INNER可省
以上两种写法功能相同,均可以实现Student和SC的等值连接。

13.自然连接

SELECT Student.*,Cno,Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno;  
--自然连接
SELECT Student.*,Cno,Grade
FROM Student JOIN SC
ON Student.Sno=SC.Sno;  
--内连接,INNER可省
以上两种写法功能相同,均可以实现Student和SC的自然连接。

14.统计选修了两门课的学生学号,成绩的平均分,最高分、最低分;,avg代表平均分,max代表最大值,将要平均的属性卸载括号里,在SELECT中使用这个函数

SELECT Sno 学号
,AVG(sc.grade)'平均分'
,max(sc.grade)'最高分'
,min(sc.grade)'最低分'
FROM SC
GROUP BY Sno
HAVING Count(*)=2;

15.统计学生学号、考试通过的课程数、获得的总学分,并将查询结果按学生获得的总学分降序排列。考试成绩60分以下不能获得相应的课程学分。

SELECT Sno 学号,Count(*) 考核通过的课程数,
sum(credits)  获得的总学分
FROM SC,course
where sc.cno=course.cno
and sc.grade>=60 
GROUP BY Sno
ORDER BY sum(Credits) DESC;

你可能感兴趣的:(数据库系统,sql,数据库,database)