SQL数据库:数据查询

数据查询

语句格式

在这里插入图片描述

  • SELECT子句:指定要显示的属性列
  • FROM子句:指定查询对象(基本表或视图)
  • WHERE子句:指定查询条件
  • GROUP BY子句:对查询结果按指定序列的值分组(比如说男的一组,女的一组),该属性列值相等的元祖为一个组。通常会在每组中使用聚集函数(比如说对男生一组计数,女生一组计数)
    • HAVING短语:只有满足指定条件的组才予以输出
  • ORDER BY子句:对查询结果表按指定列值的升序或降序排列

功能分解:

在这里插入图片描述

1.SELECT相关用法

[例1]查询全体学生的学号与姓名。

SELECT Sno,Sname   //选择属性  SELECT * 代表所有列
From Student		//指明表的来源
补充SELECT用法:
SELECT Sno,2020-Sage   //可以得到出生年份,可以是表达式	
SELECT LOWER(Sdept)    //将得到的Sdept值全部化为小写
使用列的别名改变查询结果的列标题
SELECT Sname NAME,2020-Sage BIRTHDAY  //定义别名
消除重复的行
  • SELECT默认是不会删除重复的行的,消除重复的行需要使用DISTINCT关键字
SELECT DISTINCT Sno

2.WHERE相关用法

查询条件 谓词
比较 =,>,>=,!=, !>
确定范围 BETWEEN AND , NOT BETWEEN AND
确定集合 IN , NOT IN
字符匹配 LIKE , NOT LIKE
空值 IS NULL , IS NOT NULL
逻辑运算 AND , OR , NOT

比较:
例2.查询计算机科学系 且 年龄小于20岁 的学生名单

SECLECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20;      //注意,这个分号不能少

确定范围:
例3.查询年龄不在20-23岁之间的学生姓名、系别和年龄

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

确定集合:
例4.查询计算机系(CS)、数学系(MA)学生的姓名和性别

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

字符匹配:

  • 语法: 谓词: [NOT] LIKE ‘<匹配串>’ [ESCAPE ‘<换码字符>’]
  • <字符串>可以是一个完整的字符串,也可以含有通配符%和_
    • % 代表人已长度的字符串,a%b,代表以a开头,b结尾的任意长度字符串
    • _ 代表任意单个字符

例5.查询学号为1830130281的学生的详细情况

SELECT *
FROM Student
WHERE Sno LIKE '1830130281'  //<==> WHERE Sno = '1830130281'
  • ESCAPE换码字符的用法
    • 作用:使用换码字符将统配符转义为普通字符。
      例6.查询DB_Design课程的课程号和学分
SELECT Cno , Ccredit
From Course
WHERE Cname LIKE 'DB\_Design'ESCAPE'\';

3.ORDER BY 子句

  • 作用:可以按一个或多个属性列排列
  • 升序:ASC ; 降序:DESC;缺省值为升序

例7.查询结果按分数降序排列,体现ORDER BY子句的用法即可

SELECT .....
FROM ....
WHERE ....
ORDER BY Grade DESC;  

例8.查询结果所在系号升序,年龄降序

SELECT ...
FROM ...
WHERE ...
ORDER BY Sdept ASC , Sage DESC;    //ASC省略也可以

4.聚集函数 (常配合GROUP BY中的HAVING或SELECT一起使用)

  • 只能用于SELECTHAVING
  • 统计元祖个数 :COUNT(*)
  • 统计一列中值得个数:COUNT( [ DISTINCT|ALL ] <列名>)
  • 计算一列总和: SUM(同第二行)
  • 计算一列平均值 : AVG(同第二行)
  • 求一列中的最大值和最小值: MAX(同第二行), MIN(同第二行)
  • 注意: DISTINCT并不是一定要有,它的意思是去重(缺省值是ALL)

例9.查询选修了课程的学生人数。

SELECT COUNT(DISTINCT Sno)
FROM SC;

5.GROUP BY子句分组

  • 按指定的一列或多列值分组,值相等的为一组。
    用法注意:

错误示例:

SELECT Cnpo     //
FROM SC			//
GROUP BY Cno   //

SELECT 后面的表达式必须和GROUP BY 后面的表达式对应。如果GROUP BY y 则 SELECT y ,如果不想对应 则必须SELECT后面跟聚集函数,比如COUNT(Cnpo)

例10.求各个课程号及相应的选课人数。(思路:相同的课程号为一组)

SELECT Cno, COUNT(Sno)
FROM SC
GROUP BY Cno;   //意思是课程号相等的所有列为一组。

查询结果类似下方表格所示:

Cno COUNT(Sno)
1 22
2 34
3 45
4 12

例11.查询选修了3门以上课程的学生学号

SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3;  //HAVING函数是在对每一个组进行操作,某一组列数大于3的输出

例12.查询平均成绩大于等于90分的学生学号和平均成绩

SELECT Sno , AVG(Grade)
FROM SC
GROUP BY Sno   
HAVING AVG(Grade)>=90;  //AVG不能放在WHERE中!!!  

例题13.按系并区分男女统计各系学生的人数,并按照桉降序排序

SELECT Sdept, Ssex , COUNT(Sno)
FROM Student
GROUP BY Sdept , Ssex
ORDER BY COUNT(Sno) DESC;
发布了22 篇原创文章 · 获赞 0 · 访问量 154

猜你喜欢

转载自blog.csdn.net/weixin_42649617/article/details/104834312