java进阶|MySQL数据库系列文章(二)之单表操作SQL语句
文章来源于:https://blog.csdn.net/weixin_43941364/article/details/105318497
一,单表操作的概念
查询只涉及一张表的查询称为单表查询。//select * from student;
二,选择表中的若干列,这里指的是查询表中的某些字段值或者全部字段值
2.1.1,查询指定列,需求查询全体学生的学号与姓名
sql语句:select Sno,Sname from student;
需求:查询全体学生的姓名,学号,所在系
sql语句:select Sname,Sno,Sdept from student;
2.1.2查询全部列
需求:查询全部学生的详细记录
sql语句:select * from student;
注意这个select * from,相信我,这将会是你使用最频繁的SQL语句。
三,select子句的<目标列表达式>不仅可以为表中的属性列,也可以是表达式。
例如:查全体学生的姓名及其出生年份,假设现在为2020年
sql语句:select Sname,2020-Sage from student;
进行比对一下就可以看出来了,
需求:查询全体学生的姓名,出生年份和所在的院系,要求用小写字母表示系名。
sql语句:select Sname,2020-Sage,lower(Sdept) from student;
上面的lower()是一个函数,将所在列的值变为小写。
select查询语句中也常用别名的方式,以便友好的展示数据
sql语句:select Sname as 姓名,Sno as 学号 from student;
四,选择表中的若干元祖
1,消除取值重复的行 如果没有指定distince关键词,则缺省为all
例如:查询选修了课程的学生学号
sql语句:select Sno from sc;等价于select all Sno from student;
指定distince关键字,去掉表中重复的行,distinct是不同的意思
sql语句:select distinct Sno from sc;
五,查询满足条件的元祖
这部分内容是重点中的重点,请大家一定重点掌握。常见的查询条件如图
需求:查询计算机科学系全体学生的名单
sql语句:select * from student where Sdept='CS';
需求:查询所有年龄在20岁以下的学生姓名及其年龄
sql语句:select Sname,Sage from student where Sage<20;
需求:查询考试成绩小于90的学生的学号
sql语句:select distinct Sno from sc where Grade<90;
补充一点:创建一下视图,然后基于视图查询;
创建视图的sql语句:create view selectGrade as select distinct Sno from sc;
根据视图查询的sql语句:select * from selectGrade;
1,确定查询的范围数据使用 between...and ...或者使用 not between...and...
需求:查询年龄在20-30岁(包括20岁和30岁)之间的学生信息
sql语句:select * from student where Sage between 20 and 30;
其实上面的sql语句等价为下面的sql语句。
sql语句:select * from student where Sage>=20 and Sage<=30;
需求:查询年龄不再20~30岁之间的学生信息
sql语句:select * from student where Sage not between 20 and 30;
等价于
select * from student where Sage<20 or Sage>30;
1,确定集合关键字 in,not in的使用
使用谓词:in<值表>,not in<值表> 这些在查询中用的还是比较普遍的
需求:查询计算机科学系(CS),数学系(MA)和信息系(IS)学生d额信息
sql语句:select * from student where Sdept in('CS','MA','IS');
需求:查询既不是计算机科学系,数学系,也不是信息系的学生信息
sql语句:select * from student where Sdept not in('CS','MA','IS');
2,字符匹配 使用谓词[NOT] LIKE '<匹配串>'[ESCAPE '<换码字符>']
<匹配串> 可以是一个完整的字符串,也可以含有通配符%和_
%(百分号) 代表任意长度(长度可以为0)的字符换
例如a%b表示以a开头,以b结尾的任意长度的字符串
_(下横线) 代表任意单个字符
例如 a_b表示以a开头,以b结尾的长度为3的任意字符串
在编程语言中% _ #,一般都为占位符,这里也可以理解为占位符
需求:查询学号为201215121的学生的详细情况
sql语句:select * from student where Sno like '201515121';
需求:查询所有姓刘的学生信息
sql语句:select * from student where Sname like '刘%';
需求:查询姓"欧阳"且全名为三个汉字的信息
sql语句:select * from student where Sname like '欧阳_';
需求:查询名字中第2个字为"阳"字的学生信息
sql语句:select * from student where Sname like '_阳%';
需求:查询所有不姓刘的学生信息
sql语句:select * from student where Sname not like '刘%';
3,涉及空值的查询
在实际的开发环境中,有时候会有很多数据查出来是空的,这对我们来说是没有用处的数据。
我们可以使用SQL语句过滤掉这些数据,使用谓词 is null 或is not null.
注意"is" 不能用"="代替。
需求;某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生信息。
sql语句:select * from sc where Grade is null;
需求:查询学生成绩不为null的信息
sql语句:select * from sc where Grade is not null;
4,多重条件查询,使用逻辑运算符and 和or,可以用括号改变优先级
需求:查询计算机系年龄在20岁一下的学生信息
sql语句:select * from student where Sdept='CS' and Sage<20;
需求:查询计算机系,数学系和信息系学生的信息
sql语句:select * from student where Sdept in('CS','MA','IS');
需求:查询计算机系,数学系和信息系的学生信息
sql语句:select * from student where Sdept='CS' or Sdept='MA' or Sdept='IS';
5,order by子句
order by子句的作用就是字面意思,排序,可以按一个或多个属性列排序,升序:asc;降序:desc;缺省值为升序
需求:查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
sql语句:select Sno,Grade from sc where Cno='3' order by Grade desc;
需求:查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
sql语句:select * from student order by Sdept,Sage desc;
5,聚集函数
聚集函数是啥子?有什么用?其实它就是个函数,方便我们运算。
1),统计元祖个数count(*)
2),统计一列中值的个数count([distinct|all]<列名>)
3),计算一列值的总和(此列必须为数值型) sum([distinct|all]<列名>)
4),计算一列值的平均值(此列必须为数值型) avg([distinct|all]<列名>)
5),求一列中的最大值和最小值
max([distinct|all]<列名>)
min([distinct|all]<列名>)
需求:查询学生总人数
sql语句:select count(*) from student;
需求:查询选修了课程的学生人数
sql语句:select count(distinct Sno) from sc;
需求:计算1号课程的学生平均成绩
sql语句select avg(Grade) from sc where Cno='1';
需求:查询选修1号课程的学生最高分数
sql语句:select max(Grade) from sc where Cno=1;
需求:查询学生201215121选修课程的总学分数.
sql语句:select sum(course.Ccredit) from sc course where Sno='201215121' and sc.Cno=course.Cno;
6,group by子句,它的作用是细化聚集函数的作用对象
如果未对查询结果分组,聚集函数将作用于整个查询结果,对查询结果分组后,聚集函数
将分别作用于每个组,按执行的一列或多列分组,值相等的为一组。
需求:求各个课程号及相应的选课人数。
sql语句: select Cno,count(Sno) from sc group by Cno;
需求:查询选修了2门以上课程的学生学号
sql语句:select Sno from sc group by Sno having count(Sno)>2;
需求:查询平均成绩大于等于80分的学生学号和平均成绩
sql语句:select Sno ,avg(Grade) from sc group by Sno having avg(Grade)>80;
注意:where子句中是不能用聚集函数作为条件表达式
下面我们来看一下having短语与where子句的区别
1),作用对象不同
2),where子句作用于基表或视图,从中选择满足条件的元祖
3),having短语作用于组,从中选择满足条件的组。