单表查询
选择表中的若干列
查询指定列
查询全体学生的学号和姓名
Select SNAME,SNO FROM STUDENT
查询结果。
查询全部列
查询 全体学生的详细记录
Select * FROM STUDENT
等价于
Select Sno,Sname,ssex,sage,sdept FROM STUDENT
但也有一定的区别,在第二种语句里,可以改变内容显示的顺序。
比如Select Sno,ssex,sage,sdept,sname FROM STUDENT
此时名字就被放到了最后面。
查询经过计算的值
查询全体学生的姓名以及其出生年份
Select子句的目标表达式不仅可以是表中的属性列,也可以是表达式。
Select Sname,2021-SAGE FROM STUDENT
查询全体学生的姓名,出生年份和所在院系,用小写字母表示系名
Select Sname,'出生年份',2021-sage,LOWER(Sdept) FROM STUDENT
如果要求大写,则使用UPPER()函数
同时 列标题也可以进行编辑。
Select Sname '姓名','出生年份'Birth,2021-sage 年龄,LOWER(Sdept) 专业 FROM STUDENT
这里可以注意到 在写列名时 有无引号影响都不大
选择表中的若干元组
消除取值重复的行
Select 2021-sage FROM STUDENT
若不加DISTINCT关键字 会出现一些重复的行
Select DISTINCT 2021-sage FROM STUDENT
当不指定DISTINCT关键字 就会默认为ALL
本质上
Select 2021-sage FROM STUDENT
和
Select ALL 2021-sage FROM STUDENT
是等价的。
查询满足条件的元组
通过where子句来实现
1》 比较大小
进行比较的运算符一般包括 = > < >= <= != <>(不等于) !> !<
查询is系全体学生的名单
Select Sname from Student where Sdept ='is';
查询所有年龄在20岁以下的学生姓名及其年龄
Select Sname,Sage from Student where sAGE<20;
2>> 确定范围
谓词BETWEEN…AND 和NOT BETWEEN…AND可以用来查找属性值在(或不在)指定范围内的元组,其中BETWEEN 后是范围的下限 AND后是上限
查询年龄在18-20岁之间的学生的姓名 专业和年龄
Select Sname,SDEPT,SAGE from Student where Sage Between 18 And 20;
3》 确定集合
查询CS MA 还有IS 系学生的姓名和性别
Select Sname,Ssex from Student where Sdept IN ('CS','ma','is');
4》 字符匹配
谓词LIKE 可以用来进行字符串的匹配,其一般语法格式如下:
[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘<转码字符>’]
其含义是查找指定的属性列值与<匹配串>相匹配的元组,<匹配出>可以是一个字符串,也可以含有通配符%和_。在其中:
- % 代表任意长度(可以为0)的字符串,例如a%b表示以b结尾的任意长度的字符串 比如acb addb
- _ 代表任意单个字符 例如a_b代表以a开头 以b结尾的长度为3的任意字符串 比如acb adb
当Like 后面的匹配串不包含通配符的时候,可以用= != <> 来取代LIKE或者是NOT LIKE
查询所有名字里有“坤”的学生的姓名 学号和性别
Select Sname,Ssex ,Sno from Student where Sname like '%坤';
查询姓蔡 且全名是三个字的同学的姓名
Select Sname from Student where Sname like '蔡__';
注意:当字符集为ASCLL的时候 一个汉字需两个_ 当字符集是GBK的时候只需要一个_;
查询所有不姓蔡的同学的姓名学号和性别
Select Sname,sno,ssex from Student where Sname NOT like '蔡%';
但如果要查询的字符串里本身包含通配符%或者_ 就需要用ESCAPE ‘<换码字符>’ 短语对通配符进行转意
例如 查询DB_Design 课程的课程号
select cno from Course where cname like 'DB\_Design' Escape '\';
试着查询一下 王_开头的人的名字
select Sno,Sname from Student where Sname like '王\_%' Escape '\';
5》 涉及空值的查询
查询年龄信息为空的学生的所有信息:
select * from Student Where Sage is NULL;
查询所有有年龄的学生的信息
select * from Student Where Sage is NOT NULL;
6》多重条件查询
逻辑运算符AND 和 OR 可以连接多个查询条件,AND优先级高于OR 括号可以改变优先级
查询计算机科学系年龄20岁下的学生姓名
select Sname from Student Where Sdept='cs' And sage < 20;
事实上 之前的语句
Select Sname,Ssex from Student where Sdept IN ('CS','ma','is');
也可以用 来替代(注 数据不一样的原因是因为后半部分是我离开教室后写的)
Select Sname,Ssex from Student where Sdept ='CS'or Sdept ='ma'or Sdept ='is';
ORDER BY
在order by 子句对查询结果按照一个或者多个属性列的升序ASC或降序DESC排列 默认为升序
查询专业是性别是男的学生的姓名和专业,查询结果按照年龄降序
Select Sname,Sdept from Student where Ssex='男'
Order by Sage DESC;
查询全体学生情况,查询结果按所在系的小升序排列,同一系中的学生按年龄降序排列
Select * from Student
Order by Sdept,Sage DESC;
聚集函数:
- 统计元组个数 COUNT(*) 统计一列中值的个数
- COUNT([DISTINCT|ALL] <列名>) 计算一列值的总和SUM([DISTINCT|ALL] <列名>) 计算一列值的平均值 AVG([DISTINCT|ALL] <列名>) 求一列中的最大值和最小值 MAX([DISTINCT|ALL] <列名>) MIN([DISTINCT|ALL] <列名>)
查询学生总人数:
Select Count(*) From Student;
查询计算机科学专业的学生的平均年龄
Select AVG(SAGE) From Student where Sdept='cs';
查询信息安全专业学生的最大年龄
Select MAX(SAGE) From Student where Sdept='IS';
查询计算机科学专业学生的年龄总和
Select SUM(SAGE) From Student where Sdept='CS';
GROUP BY 子句
GROUP BY 子句查询结果按某一列或者多列的值分组,值相等的为一组
求各个课程号及相应的选课人数
Select CNO,COUNT(SNO)
FROM SC
GROUP BY CNO;
如果分组后还要按一定的要求对这些组进行筛选,最终只输出满足指定条件的组,则可以使用HAVING短语进行筛选
Select CNO,COUNT(SNO)
FROM SC
GROUP BY CNO
HAVING COUNT(*) >=2;
查询平均分大于90的学生的学号和平时成绩:
Select CNO,AVG(GRADE)
FROM SC
GROUP BY CNO
HAVING AVG(GRADE)>=90;
不可以用
Where 来进行筛选
因为二者作用对象不同
Where 作用于基本表或视图,从中筛选满足元素的组,
而having短语作用于组 从中筛选满足条件的组
这学期第一次上课就坐到前面,听的尤其认真比起往年上课 希望以后也可以继续保持下去吧。
【HBU】数据库第四周 单表查询
- Author -
1ngram4un声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@