vlambda博客
学习文章列表

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;

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

2.1.2查询全部列需求:查询全部学生的详细记录sql语句:select * from student;

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

注意这个select * from,相信我,这将会是你使用最频繁的SQL语句。

三,select子句的<目标列表达式>不仅可以为表中的属性列,也可以是表达式。

例如:查全体学生的姓名及其出生年份,假设现在为2020年sql语句:select Sname,2020-Sage from student;

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

进行比对一下就可以看出来了,

需求:查询全体学生的姓名,出生年份和所在的院系,要求用小写字母表示系名。sql语句:select Sname,2020-Sage,lower(Sdept) from student;

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

上面的lower()是一个函数,将所在列的值变为小写。

select查询语句中也常用别名的方式,以便友好的展示数据sql语句:select Sname as 姓名,Sno as 学号 from student;

四,选择表中的若干元祖

1,消除取值重复的行 如果没有指定distince关键词,则缺省为all例如:查询选修了课程的学生学号sql语句:select Sno from sc;等价于select all Sno from student;

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

指定distince关键字,去掉表中重复的行,distinct是不同的意思sql语句:select distinct Sno from sc;

五,查询满足条件的元祖

这部分内容是重点中的重点,请大家一定重点掌握。常见的查询条件如图

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

需求:查询计算机科学系全体学生的名单sql语句:select * from student where Sdept='CS';

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

需求:查询所有年龄在20岁以下的学生姓名及其年龄sql语句:select Sname,Sage from student where Sage<20;

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

需求:查询考试成绩小于90的学生的学号sql语句:select distinct Sno from sc where Grade<90;

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

补充一点:创建一下视图,然后基于视图查询;创建视图的sql语句:create view selectGrade as select distinct Sno from sc;根据视图查询的sql语句:select * from selectGrade;

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

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;

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

需求:查询年龄不再20~30岁之间的学生信息sql语句:select * from student where Sage not between 20 and 30;等价于select * from student where Sage<20 or Sage>30;

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

1,确定集合关键字 in,not in的使用使用谓词:in<值表>,not in<值表> 这些在查询中用的还是比较普遍的
需求:查询计算机科学系(CS),数学系(MA)和信息系(IS)学生d额信息sql语句:select * from student where Sdept in('CS','MA','IS');

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

需求:查询既不是计算机科学系,数学系,也不是信息系的学生信息sql语句:select * from student where Sdept not in('CS','MA','IS');

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

2,字符匹配 使用谓词[NOT] LIKE '<匹配串>'[ESCAPE '<换码字符>']<匹配串> 可以是一个完整的字符串,也可以含有通配符%和_%(百分号) 代表任意长度(长度可以为0)的字符换例如a%b表示以a开头,以b结尾的任意长度的字符串_(下横线) 代表任意单个字符例如 a_b表示以a开头,以b结尾的长度为3的任意字符串在编程语言中% _ #,一般都为占位符,这里也可以理解为占位符
需求:查询学号为201215121的学生的详细情况sql语句:select * from student where Sno like '201515121';

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

需求:查询所有姓刘的学生信息sql语句:select * from student where Sname like '刘%';

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

需求:查询姓"欧阳"且全名为三个汉字的信息sql语句:select * from student where Sname like '欧阳_';
需求:查询名字中第2个字为"阳"字的学生信息sql语句:select * from student where Sname like '_阳%';
需求:查询所有不姓刘的学生信息sql语句:select * from student where Sname not like '刘%';

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

3,涉及空值的查询在实际的开发环境中,有时候会有很多数据查出来是空的,这对我们来说是没有用处的数据。我们可以使用SQL语句过滤掉这些数据,使用谓词 is nullis not null.注意"is" 不能用"="代替。
需求;某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生信息。sql语句:select * from sc where Grade is null;
需求:查询学生成绩不为null的信息sql语句:select * from sc where Grade is not null;

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

4,多重条件查询,使用逻辑运算符and 和or,可以用括号改变优先级
需求:查询计算机系年龄在20岁一下的学生信息sql语句:select * from student where Sdept='CS' and Sage<20;

 

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

需求:查询计算机系,数学系和信息系学生的信息sql语句:select * from student where Sdept in('CS','MA','IS');

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

需求:查询计算机系,数学系和信息系的学生信息sql语句:select * from student where Sdept='CS' or Sdept='MA' or Sdept='IS';

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

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;

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

需求:查询选修了课程的学生人数sql语句:select count(distinct Sno) from sc;

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

需求:计算1号课程的学生平均成绩sql语句select avg(Grade) from sc where Cno='1';

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

需求:查询选修1号课程的学生最高分数sql语句:select max(Grade) from sc where Cno=1;

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

需求:查询学生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;

java进阶|MySQL数据库系列文章(二)之单表操作SQL语句

需求:查询选修了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短语作用于组,从中选择满足条件的组。