查询操作是SQL语言中很重要的操作,我们今天就来详细的学习一下。
一、数据查询的语句格式
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式> ....] --可以选择多个列FROM <表名或视图名>[, <表名或视图名> ....]--可以选择多个表或视图[ WHERE <条件表达式> ] --查询什么条件的数据[ GROUP BY <列名1> [ HAVING <条件表达式> ] ] --按什么条件分组[ ORDER BY <列名2> [ ASC|DESC ] ];--按什么条件排序
SELECT子句:指定要显示的属性列FROM子句:指定查询对象(基本表或视图)WHERE子句:指定查询条件GROUP BY子句:
细化聚集函数的作用对象 未对查询结果分组,聚集函数将作用于整个查询结果对查询结果分组后,聚集函数将分别作用于每个组作用对象是查询的中间结果表按指定的一列或多列值分组,值相等的为一组
合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句。
例子:
BILL表
执行SELECT Customer ,SUM(Quantity) FROM BILL GROUP BY Customer
我们会得到如下表
如果我们不加GROUP BY 会得到这样一个表
当然GROUP BY也可以按多个列分组,即两个都想同时才会被分到一个组
还是对BILL表操作SELECT Customer ,SUM(Quantity) FROM BILL GROUP BY Customer,Date
我们会得到如下表
HAVING短语:
筛选出只有满足指定条件的组
例子:
BILL表
我们查询购买总量小于30的Customer
SELECT Customer,SUM(Quantity) From BILL GROUP BY CustomerHAVING SUM(Quantity)>30
我们会得到如下:
ORDER BY子句:对查询结果表按指定列值的升序或降序排序
还是对BILL表操作
我们想按照购买总数量排列查询结果
SELECT Customer ,SUM(Quantity) FROM BILL GROUP BY CustomerORDER BY SUM(Quantity) ASC
我们会得到如下表
ORDER BY子句
可以按一个或多个属性列排序升序:ASC;降序:DESC;缺省值为升序当排序列含空值时ASC:排序列为空值的元组最后显示DESC:排序列为空值的元组最先显示
二、单表查询
刚才在介绍那几个保留字的时候,我们简单的举了几个查询的例子,现在我们详细系统的介绍一下,有点重复,但是比较基础,加深印象。
1.选择表中的若干列查询
选择某几列查询:
SELECT <列1>,<列2>......FROM <数据表>;
选择全部列查询:
当然我们可以,把所有的列一一列举,我们也可以使用SELECT *
SELECT *FROM <数据表>;
举例:
还是BILL表
SELECT Customer From BILL
得到如下表
执行:
SELECT Customer ,Quantity,Date FROM BILL--或者SELECT * FROM BILL
得到如下结果
2.查询经过计算的值
之前我们给出了SELECT标准格式:
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式> ....] --可以选择多个列FROM <表名或视图名>[, <表名或视图名> ....]--可以选择多个表或视图[ WHERE <条件表达式> ] --查询什么条件的数据[ GROUP BY <列名1> [ HAVING <条件表达式> ] ] --按什么条件分组[ ORDER BY <列名2> [ ASC|DESC ] ];--按什么条件排序
其中目标表达式可以为:
算术表达式字符串常量函数列别名
例子:
Students表
我们查询每个人的年龄:
SELECT NAME,-Birth FROM Student;
得道如下的查询结果:
在查询中添加新的字符串列
例子
SELECT Name,'Birth is:',BirthFROM Students ;
结果:
查询中显示列别名
例子
Students表
SELECT Name 姓名, Birth 生日FROM Students ;
结果
3.选择表中的若干元组(行)
元组(tuple)是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,每列就是一个属性。 在二维表里,元组也称为行。
DISTINCT 语句:
指定DISTINCT关键词,去掉表中重复的行
例子:
BILL表
我们执行以下语句查看区别:
SELECT DISTINCT Customer FROM BILL
如果不加DISTINCT,结果如下:
作用显而易见
查询满足条件的元组:
这次我们多举几个例子:
Student表
以下所有查询的基本表都默认为Student表
例一:查询计算机科学系全体学生的名单
SELECT SnameFROM StudentWHERE Sdept='C.S.';
结果:
例二:查询所有年龄在18岁以上的学生姓名及其年龄。
SELECT Sname,Sage FROM Student WHERE Sage>18;
结果
BETWEEN…AND…语句
例三:查询年龄在18~20岁(包括18岁和20岁)之间的学生的姓名、系别和年龄
SELECT Sname,Sage,SdeptFROMStudentWHERE Sage BETWEEN 18 AND 20;
结果
例四:查询年龄不在18~20岁(包括18岁和20岁)之间的学生的姓名、系别和年龄
SELECT Sname,Sage,SdeptFROMStudentWHERE Sage NOT BETWEEN 18 AND 20;
结果
IN/NOT IN语句
例四:查询年龄为17 和 20岁的学生姓名,年龄及专业
SELECT Sname,Sage,SdeptFROMStudentWHERE Sage IN (17,20);
结果
例五:查询年龄不为17 和 20岁的学生姓名,年龄及专业
SELECT Sname,Sage,SdeptFROMStudentWHERE Sage NOT IN (17,20);
字符串匹配:
语法格式:
谓词:
[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
<匹配串>:指定匹配模板
匹配模板:固定字符串或含通配符的字符串
当匹配模板为固定字符串时,
可以用 = 运算符取代 LIKE 谓词
用 != 或 < >运算符取代 NOT LIKE 谓词
通配符:
例:
a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串
a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串
ESCAPE 短语:
当用户要查询的字符串本身就含有 % 或 _ 时,要使用ESCAPE ‘<换码字符>’ 短语对通配符进行转义。
类型1:匹配串为固定字符串
查询学号为200215121的学生的详细情况。
SELECT * FROM Student WHERE Sno LIKE ‘200215121';
等价于:
SELECT * FROM Student WHERE Sno = ' 200215121 ';
类型2:匹配串为含通配符的字符串
查询所有姓刘学生的姓名、学号和性别。
SELECT Sname,Sno,SsexFROM StudentWHERE Sname LIKE ‘刘%’;
查询姓"欧阳"且全名为三个汉字的学生的姓名。
SELECT SnameFROM StudentWHERE Sname LIKE '欧阳__';
查询名字中第2个字为"阳"字的学生的姓名和学号。
SELECT Sname,SnoFROM StudentWHERE Sname LIKE ‘__阳%’;
查询所有不姓刘的学生姓名。
SELECT Sname,Sno,SsexFROM StudentWHERE Sname NOT LIKE '刘%';
类型3:使用换码字符将通配符转义为普通字符
查询DB_Design课程的课程号和学分。
SELECT Cno,CcreditFROM CourseWHERE Cname LIKE 'DB\_Design' ESCAPE '\‘;
查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。
SELECT *FROM CourseWHERE Cname LIKE 'DB\_%i_ _' ESCAPE ' \ ‘;
ESCAPE ‘\’ 表示“ \” 为换码字符
学过C++的大家都知道\n代表换行,\为转义字符。这里是说,我们通过ESCAPE语句将\定义为换码字符(可以理解为转义字符)
类型4:涉及空值的查询
谓词:IS NULL 或 IS NOT NULL 而且 “IS” 不能用 “=” 代替。
如果某些同学的信息不完整,比如在某个表中手机号未填写,那这位同学的元组中的手机号这一属性为NULL;
要想查出这类同学的姓名我们可以执行以下操作
Student表
SELECT Sname,Spho From StudentWHERE Spho IS NULL;
类型5:多重条件查询
逻辑运算符:
AND:且 连接前后两个条件都成立时表达式为真
OR:或 连接前后表达式有一个为真时表达式为真
AND优先级大于OR,可以加括号进行复合运算,进而改变优先级。
可以连接上面表中的所有运算符,只要保证最后得到表达可以分辨真假有意义即可。
这个比较简单我们举一个例子:
查询18岁的学生且属于计算机科学专业的姓名,年龄,专业
SELECT Sname,Sage,Sdept FROM StudentsWHERE Sage=18 AND Sdept='C.S.';
4.聚集函数
计数
SQL COUNT(column_name) 语法
COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):
SELECT COUNT(column_name) FROM table_name
SQL COUNT(*) 语法
COUNT(*) 函数返回表中的记录数:
SELECT COUNT(*) FROM table_name
SQL COUNT(DISTINCT column_name) 语法
COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:
SELECT COUNT(DISTINCT column_name) FROM table_name
例:
查询学生总人数。
SELECT COUNT(*)FROM Student;
查询选修了课程的学生人数。
SELECT COUNT(DISTINCT Sno)FROM SC
计算总和
SQL SUM() 语法
SELECT SUM(column_name) FROM table_name
开头举过例子,这里就不再重复赘述。
计算平均值
AVG 函数返回数值列的平均值。NULL 值不包括在计算中。
SQL AVG() 语法
SELECT AVG(column_name) FROM table_name
例
计算1号课程的学生平均成绩。
SELECT AVG(Grade)FROM SCWHERE Cno= ‘ 1 ’;
最大最小值
MAX() 函数和MIN()函数
MAX 函数返回一列中的最大值,MIN 函数返回一列中的最小值。NULL 值不包括在计算中。
SQL中的语法
SELECT MAX(column_name) FROM table_nameSELECT MIN(column_name) FROM table_name
MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。
例:
查询选修1号课程的学生最高分数。
SELECT MAX(Grade)FROM SCWHERE Cno= ‘ 1 ’;
如果觉得《学数据库还不会Select SQL Select详解 单表查询完全解析?》对你有帮助,请点赞、收藏,并留下你的观点哦!