SQL Server2017(二)数据查询

数据查询

请首先导入下面的数据
Student

INSERT
INTO Student
VALUES('201215121','李勇','男',20,'CS');
INSERT
INTO Student
VALUES('201215122','刘晨','女',19,'CS');
INSERT
INTO Student
VALUES('201215123','王敏','女',18,'MA');
INSERT
INTO Student
VALUES('201215125','张力','男',19,'IS');

Course

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

UPDATE Course
SET Cpno = 5
WHERE Cno = 1;
UPDATE Course
SET Cpno = 1
WHERE Cno = 3;
UPDATE Course
SET Cpno = 6
WHERE Cno = 4;
UPDATE Course
SET Cpno = 7
WHERE Cno = 5;
UPDATE Course
SET Cpno = 6
WHERE Cno = 7;

SC

INSERT
INTO SC
VALUES('201215121','1',92);
INSERT
INTO SC
VALUES('201215121','2',85);
INSERT
INTO SC
VALUES('201215121','3',88);
INSERT
INTO SC
VALUES('201215122','2',90);
INSERT
INTO SC
VALUES('201215122','3',80);

一、单表查询

1.选择表中的若干列
(1)查询指定列
例1

SELECT Sno,Sname
FROM Student;

例2

SELECT Sname,Sno,Sdept
FROM Student;

(2)查询全部列

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

(3)查询经过计算的值
例1:查询全体学生的姓名及出生年份

SELECT Sname,2019-Sage
FROM Student;(无列名)

<目标列表达式>不仅可以是算数表达式,还可以是字符串常量、函数等。
例2:查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示系名

SELECT Sname,'Year of Birth:',2014-Sage,LOWER(Sdept)
FROM Student;

可以通过指定别名来改变查询结果的列标题

SELECT Sname NAME,'Year of Birth:' BIRTH,2014-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
FROM Student;

2.选择表中的若干元组
(1)消除取值重复的行
两个本来不完全相同的元组在投影到指定的某些列上后,可能变成相同的行,可以用DISTINCT消除他们

    SELECT Sno
    FROM SC;
等价于
 SELECT ALL Sno
    FROM SC;

指定DISTINCT关键词去掉重复的行

  SELECT DISTINCT Sno
    FROM SC;

(2)查询满足条件的元组
WHERE子句常用的查询条件
①比较大小
=,>,<,>=,<=,!=或<>,!>,!<
例1:查询计算机科学系全体学生名单

SELECT Sname
FROM Student
WHERE Sdept='CS';

例2:查询考试成绩不合格的学生学号

SELECT DISTINCT Sno
FROM SC
WHERE Grade<60;

例3:查询所有年龄在20岁以下的学生姓名及年龄

SELECT Sname,Sage
FROM Student
WHERE Sage<20;

②确定范围
谓词:BETWEENI……AND……和NOT BETWEEN……AND……
例1:查询年龄在20-23岁(包括20和23)之间的学生姓名、系别和年龄

SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;

例2:查询年龄不在20-23岁之间的学生姓名、系别和年龄

SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;

③确定集合
谓词:IN、NOT IN
例1:查询计算机科学系、数学系和信息系学生的姓名和性别

SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('CS','MA','IS');

例2:查询既不是计算机科学系、数学系,也不是信息系学生的姓名和性别

SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN('CS','MA','IS');

④字符匹配
谓词:LIKE
其一般语法格式为:

[NOT] LIKE'<匹配串>' [ESCAPE'<换码字符>']

其含义是查找指定的属性列值与<匹配串>相匹配的元组,<匹配串>可以是完整的字符串,也可以含有通配符%和_。
%: 代表任意长度的字符串(长度可以为0),例如a%b表示以a开头以b结尾的任意长度的字符串。
_: 代表任意单个字符
例如a_b表示以a开头以b结尾的长度为3的任意字符串。
例1:查询学号为201215121的学生的详细情况

SELECT *
FROM Student
WHERE Sno LIKE '201215121';
等价于
SELECT *
FROM Student
WHERE Sno = '201215121';

如果LIKE后面的匹配串不含通配符,可以用=运算符取代LIKE谓词,可以用!=或<>运算符取代NOT LIKE谓词
例2:查询所有姓刘的学生姓名、学号、性别

SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE '刘%';

例3:查询姓欧阳且全名为三个汉字的学生姓名

SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳_';

注意:数据库字符集为ASCII时一个汉字需要两个_;当字符集为GBK时一个汉字需要一个_。
例4:查询名字中第二个字为阳的学生姓名

SELECT Sname
FROM Student
WHERE Sname LIKE '_阳%';

例5:查询所有不姓刘的学生姓名

SELECT Sname
FROM Student
WHERE Sname NOT LIKE '刘%';

如果要查询的字符串本身就含有%或_,这时要使用ESCAPE ‘<换码字符>’ 短语对通配符进行转义
例:查询DB_Design课程的课程号和学分

SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE '\';

查询以“DB_”开头,且倒数第三个字符为i的课程的详细情况

SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%i__' ESCAPE '\';

⑤涉及空值的查询
例1:查询缺少成绩的学生学号和相应课程号

SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;(注意这里的IS不能用=代替)

例2:查询所有有成绩的学生学号和课程号

SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;

⑥多重条件查询
逻辑运算符:AND和OR可以用来连接多个查询条件。AND的优先级高于OR,但可以用括号改变优先级
例1:查询计算机科学系年龄在二十岁以下的学生姓名

SELECT Sname
FROM Student
WHERE Sage<20 AND Sdept LIKE 'CS';

例2:查询计算机科学系、数学系和信息系学生的姓名和性别

SELECT Sname,Ssex
FROM Student
WHERE Sdept='CS' OR Sdept = 'MA' OR Sdept = 'IS';

3.ORDER BY 子句
可以用ORDER BY子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,默认值为升序。
例1:查询选修了3号课程的学生学号和成绩,查询结果按照分数降序排列

SELECT Sno,Grade
FROM SC
WHERE Cno = '3'
ORDER BY Grade DESC;

例2:查询全体学生情况,查询结果按照所在系系号升序排列,同一系按照年龄降序排列

SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;

4.聚集函数
为了方便用户,增强检索功能,SQL提供了很多聚集函数,主要有:

COUNT(*)					统计元组个数
COUNT([DISTINCT|ALL]<列名>)	统计一列中值的个数
SUM([DISTINCT|ALL]<列名>)	计算一列值的总和(此列必须是数值型)
AVG([DISTINCT|ALL]<列名>)	计算一列值的平均值(此列必须是数值型)
MAX([DISTINCT|ALL]<列名>)	求一列值中的最大值
MIN([DISTINCT|ALL]<列名>)	求一列值中的最小值

如果指定DISTINCT短语,则表示在计算时要取消指定列中的重复值,如果不指定DISTINCT短语或指定ALL短语,则表示不取消重复值
例1:查询学生总人数

SELECT COUNT(*)
FROM Student;

例2:查询选修了课程的学生人数

SELECT COUNT(DISTINCT Sno)
FROM SC;(为避免重复计算学生人数,必须在COUNT函数中用DISTINCT短语

例3:

SELECT AVG(Grade)
FROM SC
WHERE Cno='1';

例4:

SELECT MAX(Grade)
FROM SC
WHERE Cno='1';

例5:

SELECT SUM(Ccredit)
FROM SC,Course
WHERE Sno='201215012' AND SC.Cno=Course.Cno;

5.GROUP BY子句
例1:

SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;

例2:

SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3;

此博客中的热门博文

Rational Rose 2007破解版下载、安装教程

SQL概述

1.25USD,V2Ray搭建,让你奔向自由!