数据库简介、Navicat、SQL语句
文章目录
一、数据库简介
1.[了解]数据库介绍和分类
-
数据库
指长期存储在计算机内、有组织的数据集合
简而言之,数据库就是一个存储数据的地方(仓库) -
数据库的分类
(1)关系型数据库(表格方式展示):
Oracle: 在大型项目中使用,例如:银行、电信等项目
MySQL: Web项目中使用最广泛的关系型数据库
Microsoft SQL Server: 在微软的项目中使用
SQLite: 轻量级数据库, 主要应用在移动平台(2)非关系型数据库(以 键-值对 方式展示):redis、mongodb、hbase
2.[知道]关系型数据库核心要素和SQL的分类
-
关系型数据库核心要素
数据行 (相当于excel表格中的一行数据)
数据列 (相当于excel表格中的一列数据)
数据表 (excel表格中某个表)
数据库 (相当于所有表的集合) -
SQL的分类: SQL是一个结构化的查询语言,通过SQL能够对数据库进行相关的操作
(1)DQL(必须掌握):数据查询语言,用于对数据进行查询,例如: selectdata query language
(2)DML:数据操作语言,对数据进行增加、修改、删除,例如: insert、 update、 delete
data manipulation language
(3)TPL: 事务处理语言,对事务进行处理,例如: begin transaction、 commit、 rollback
transaction processing language
(4)DCL:数据控制语言,进行授权与权限回收,例如: grant. revoke
data control language
(5)DDL:数据定义语言,进行数据库、表的管理等,例如: create、 drop
data definition language
(6)CCL:指针控制语言,通过控制指针完成表的操作,例如: declare cursor
cursor control language
3.MySQL
3.1[ 了解] MySQL简介
- mysql是oracle公司的产 品
- 社区版开源免费,商业版本收费
- 特点:可移植性好;支持多操作系统;支持多种编程语言;开源、社区版免费;支持多线程;优化SQL查询算法;多种数据库连接方式;支持多语言编码格式
3.2[知道] MySQL组成和命令连接数据库
- MySQl 组成:
MySQL 服务器:存储数据并解析编译后的SQL语句, 将执行结果返回给客户端。
MySQL客户端:下发用户 要执行的SQL语句,并显示服务器返回的执行结果。
- 命令连接MySQL数据库
前置条件:
确定mysq|数据库的IP地址,可以通过ifconfig来确认
确认mysq|数据库服务是否开启,netstat -anptu| grep 3306 - 连接命令:
1| mysql -h数据库IP -P端口号 -u数据库登陆用户名 -p数据库登陆密码
-h不加时则表示为本机
-P不加时则表示默认3306端口
注:本机连接的时候不需要数据库IP 直接使用数据库登录用户名和登录密码即可
3.3 [重点]工具连接数据库
补充:
二、Navicat操作数据库
1.[操作] 通过navicat操作数据库
-
使用数据库:在navicat窗口中,双击左侧已连接的连接名称即可打开并连接到数据库
-
修改数据库:打开数据库后,右击要修改的数据库名称,选择数据库属性。
-
创建数据库:打开数据库后,右击连接名称,选择“创建数据库“,然后输入对应的数据,点击确定。
-
删除数据库:打开数据库后,右击要删除的数据库名称,选择“删除数据库”
-
新建数据库
- 编辑或修改数据库
2.[操作]通过navicat操作表
- 新建表
右击已打开的数据库中"表"字段名,选择”新建表”
在新建表的窗口中输入字段的名称及选择字段的类型等信息
点击保存,输入对应的表名称,再点击确定,然后关闭新建表窗口即可
-
修改、删除表
(1)修改表:右击表名,选择“设计表", 可以进入到表字段设计的窗口
针对要修改的表可以做增加字段、删除字段、修改字段名称及类型等操作
(2)删除表:右击表名,选择“删除表”即可
3.[操作]通过navicat操作数据
- 新增数据
1、右击表名选择“打开表”
2、点击下方的+号,输入数据
3、点击下方的 √ - 修改数据
1、右击表名选择“打开表”
2、在表中修改对应的数据
3、点击下方的 √ - 删除数据
1、右击表名选择“打开表”
2、在表中选中对应数据行
3、点击下方的 减号-
补充:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lJmIsUcX-1670068883387)(C:\Users\user\AppData\Roaming\Typora\typora-user-images\image-20221122114730698.png)]
4. [重点]数据类型与约束
- 整型: int
有符号范围(-21 47483648 -21 47483647)
无符号范围(0 - 4294967295) - 小数: decimal
示例: decimal(5, 2),表示该字段可以存5
位数,其中小数位数为2。整数几位? 三位 - 字符串: varchar
范围(0~65533)
一个字母或一个中文点一个字符
例如: varchar(3)表示最多存3个字符 - 时间日期: datetime
范围(1000-01 -01 00:00:00 一9999-12- 31 23:59:59)
示例: 2021-01-01 12:29:59’ - 数据约束
- 主键( primary key) : 物理上存储的顺序
当把某个字段设定为主键之后,该字段的值必须唯一,且不能为空
针对主键的字段,可以设定自动自增,自动在原来最大的ID值上加1 - 非空(not null) : 此字段不允许填写空值
空(Null)和 " 空字符是不一样的 - 唯一(unique) : 此字段的值不允许重复
主键只能有1个
唯一的字段可以是多个(字段的内容是不可以重复的,例如title字段的值 可以是 十八, 其余的不能和十八一样) - 默认值( default) :当不填写 此值时会使用默认值,如果填写时以填写为准
- 外键( foreign key):维护两个表之间的关联关系
- 主键( primary key) : 物理上存储的顺序
5. [操作]数据库的备份和还原
- 备份
- 还原
注意:要还原的数据库不存在时,需要先创建数据库。
还原数据库操作:
在navicat中右击要还原的数据库,选择“运行SQL文件”。
在弹出的窗口中选择 备份的SQL文件,点击“开始”
运行完成后,会提示运行成功。再点击“关闭” 即可。
三、命令行客户端
**注意:**此处使用的操作命令后面的封号 ; 不要丢
1.[知道] 命令行操作数据库
- 前置条件:命令行先连接数据库
mysql -uroot -p123456
- 客户端常见数据库操作命令:
(1)查看所有数据库: show databases;
(2)使用数据库: use 数据库名;
(3)查看当前使用数据库: select database();
(4)创建数据库: create database 数据库名 charset=utf8;
(5)删除数据库: drop database 数据库名;
2.[知道] 命令行操作数据库表
- 前置条件:操作数据表之前要选通过use打开对应的数据库
- 常见数据表操作命令:
查看当前数据库所有的表: show tables;
查看表结构: desc 表名;
查看表的创建语句: show create table 表名;
四、SQL语句
1.[知道]数据库表操作
- 创建数据库表语法格式
creat table 表名(
字段名1 类型 约束,
字段名2 类型 约束,
.... .. ..,
)
- 举例:创建学生表,字段要求:姓名(长度为10)、年龄、身高(保留2位小数)
create table students(
id int unsigned primary key auto_increment, --id字段为主键,且值自增
name var char(20),
age int unsigned, --字段类型为无符号的整型
height decimal(5,2)
)
- 删除数据库
drop table 表名;
drop table if exists 表名;
2.数据的增删改查操作
2.1[重点]简单查询
select * from 表名;
2.2 [重点]添加一行数据
--主键自增长,可以用0或null代替
方式一:全部添加
insert into 表名 values(...);
insert into students values(0,'aa',22,170.84);
方式二:部分添加
insert into 表名(字段1,字段2,...) vlaue(值1,值2,...);
insert into students(name) values('哈哈');
2.3[知道]添加多行数据
- 方式一:写多条insert语句,多条语句之间用英文分号分隔
例:
insert into students (id,name) values(0,'张三');
insert into students (id,name) values(0,'bb');
insert into students values(0,'张三',20,180);
- 方式二:通过一条insert语句插入多条数据,数据间用逗号分隔
格式一: insert into 表名 values(...),(...)...
例:insert into students values(0,'aa',23,1667,56),(0,'vvv',22,180.90)
格式二:insert into 表名 (字段名1,...) values (字段值1,字段值2,...),(字段值1,字段值2,...)
例:insert into students (id,name) values(0,'avc'),(0,'rtj'),(null,'ohdf');
2.4[知道]修改数据
- 格式:update 表名 set 字段名1=值1,字段名2=值2… where 条件
例:修改id为5的学生数据,姓名改为狄仁杰,年龄改为20
update students set name='狄仁杰',age=20 where id=5
2.5[知道]删除数据
- 格式:delete from 表名 where 条件(物理删除对应的数据)
delete from students where id=6
-
注意:此方法为物理删除,工作中大部分使用逻辑删除
逻辑删除是指通过设定一个字段来标识当前记录已经删除
is _delete字段来标识,1代表删除,0表示未删除 -
其他删除数据的方式
truncate table 表名 (清除表里面所有的数据,但是表结构会保留,自增长字段的值会从1开始)
例:truncate table students;
drop table 表名 (删除数据表,包括数据和表结构)
例:drop table students;
-
delete:delete可以通过where子句删除部分记录。
delete删除所有数据时,自增长字段不会从1开始。 -
truncate:Truncat删除数据时,表结构会保留,自增长字段从
1开始。执行效率低于drop命令。 -
drop:如果想删除表,建议使用drop,且删除数据效率最高。
3.数据查询操作
31.[知道]查询的基本操作
- 查询部分字段的值
格式:select 字段名1,字段名2.... from 表名 (查询的为一部分的字段的信息)
例: select name,sex,age from students;
- 取别名
1、给表取别名:
select 别名.字段名1,别名.字段名2..... from 表名 as 别名
例: select s.name,s.sex,s.age from students as s;
2、给字段起别名
select 字段名1 as 别名,字段名2 as 别名..... from 表名;
例: select name as 姓名,sex as 性别,age as 年龄 from students;
- 去重
select distinct 字段名1,字段名2...... from 表名;
例: select distinct sex from students;
3.2 [重点]条件查询
- 语法格式
select 字段名1,字段名2.... from 表名 where 条件
例: select * from students where id=5;
3.2.1 [重点]条件查询:比较运算符
- 比较运算符:大于(>)、等于(=)、小于(<)、 大于等于(>=)、小于等于(<=)、不等于(<>或者!=)
-- 条件查询-》比较运算符
-- 例1:查询小乔的年龄
select age from students where name='小乔';
-- 例2:查询20岁以下的学生
select * from students where age<20;
-- 例3:查询家乡不再北京的学生
select * from students where hometown !='北京';
-- 查询学号是' 007的学生的身份证号
select * from students where studentNo=007;
-- 查询'1班'以外的学生信息
select * from students where class !='1班';
-- 查询年龄大于20的学生的姓名和性别
select name,sex from students where age>20;
3.2.2 [重点]条件查询:逻辑运算符
- 逻辑运算符: and(且,同时符合对应的条件),or (或,符合其中的一个条件),not (非,不符合该条件)
-- 查询年龄等于18的女生的记录(and)
select * from students where age=18 and sex='女';
-- 查询出女学生或者是1班的学生
select * from students where sex='女' or class='1班';
-- 查询非天津学生的记录
select * from students where hometown !='天津';
select * from students where not hometown ='天津';
-- 查询河南或河北的学生
select * from students where hometown='河南' or hometown='河北';
-- 查询'1班'的'上海的学生
select * from students where class='1班' and hometown='上海';
-- 查询非20岁的学生
select * from students where not age=20;
3.3.3[重点]条件查询:模糊查询
- 模糊查询: like关键字
- %:匹配任意个字符
- _ :匹配任意单个字符
一般LIKE关键字只用来匹配字段类型为字符串的
-- 例1:查询姓孙的学生
select * from students where name like '孙%';
-- 例2:查询姓孙且名字是一个字的学生
select * from students where name like '孙_';
-- 例3:查询姓名以‘乔'结尾的学生
select * from students where name like '%乔';
-- 例4:查询姓名中包含‘白’的学生
select * from students where name like '%白%';
-- 查询姓名为两个字的学生
select * from students where name like '__';
-- 查询姓'百'且年龄大于20的学生
select * from students where name like '百%' and age > 20;
-- 查询学号以1结尾的学生
select * from students where studentNo like '%1';
3.3.4 [重点]条件查询:范围查询
- in: 查询非连续范围内的数据
-- 例:查询家乡是北京或上海或广东的学生
select * from students where hometown='北京' or hometown='上海' or hometown='广东';
select * from students where hometown in('北京','上海','广东');
-- 查询年龄为18或19或22的女生
select * from students where age in(18,19,22) and sex='女';
- between … and :查询连续范围内的数据(用来数值型字段中)
-- 例:查询年龄为18至20的学生
select * from students where age>=18 AND age <=20;
select * from students where age BETWEEN 18 AND 20;
-- 查询年龄在20到25以外的学生
select * from students where age NOT BETWEEN 20 AND 25;
3.3.5 [重点]条件查询:为空判断
- Mysql中空表示null ,与‘ ’(空)字符串不一样
- 空判断: is null
查询出学生身份证号为空的信息
select * from students where card is null;
- 非空判断:is not null
查询出学生身份证号不为空的信息
select * from students where card is not null;
4. [知道]排序
- 语法格式:
select * from 表名 order by 字段1 asc|desc,字段2 asc|desc......
说明:
将行数据按照字段1进行排序,如果某些字段1的值相同时,则按照字段2排序,以此类推
字段的排序规则默认为升顺排列(从小到大)
asc:表示从小到大排序(升序)
desc:表示从大到小排序(降序)
-- 例1: 查询所有学生信息, 按年龄从小到大排序
select * from students order by age;
-- 例2: 查询所有学生信息, 按年龄从大到小排序, 年龄相同时, 再按学号从小到大排序
select * from students order by age desc,studentNo;
-- 1、 查询所有学生信息, 按班级从小到大排序, 班级相同时,再按学号从小到大排序
select * from students order by class, studentNo;
5.分组和聚合
5.1 [知道]聚合函数介绍
- 使用聚 合函数方便进行数据统计
- 聚合函数不能在where中使用
5.2 [知道] 聚合函数案例
- count(*): 求表的总的记录数
查询学生表的总记录数
select count(*) from students;
- max(字段名):查询对应字段的最大的值
查询女生的最大年龄
select max(age) from students where sex='女';
- min(字段名):查询对应字段的最小的值
查询1班的最小年龄
select min(age) from students where class='1班';
- sum(字段名):查询对应字段的值的总和
查询北京学生的年龄总和
select sum( age) from students where hometown='北京';
- avg(字段名):查询对应字段的值的平均数
查询女生的平均年龄
select avg(age) from students where sex='女';
练习:
-- 查询所有学生的最大年龄、最小年龄、平均年龄
select max(age),min(age),avg(age) from students;
-- 一班共有多少个学生
select count(*) from students where class='1班';
-- 查询3班年龄小于18岁的同学有几个
select count(*) from students where class='3班' and age<18;
5.3 [知道]分组查询
- 分组的目的是对每一组的数据进行统计(使用聚合函数)
语法格式:
select字段名1,字段名2,聚合函数.... from 表名 group by 字段名1,字段名2....
-- 查询各种性别的人数
select sex,count(*) from students group by sex;
-- 查询各种性别年龄最大的
select sex,max(age) from students group by sex;
-- 查询各个班级的人数
select class,count(*) from students group by class;
-- 查询各个班级中不同性别的人数
select class,sex,count(*) from students group by class,sex;
- 分组后的数据筛选:将分组之后的数据当成是一个表数据,然后再通过having条件来对当前的表数据进行筛选。
语法格式:
select字段名1,字段名2,聚合函数.... from 表名 group by 字段名1,字段名2.... having 条件
having条件运算符跟where条件运算符是一样的
在having后面可以使用聚合聚函数
-- 查询男生总人数
select sex,count(*) from students group by sex having sex='男';
-- 查询每个班级男生的总记录数
select class,sex,count(*) from students group by class,sex having sex='男';
-- 查询所有班级中不同性别的记录数大于1的信息
select class,sex,count(*) from students group by class,sex having count(*);
-
having 与 where 对比
where是对from后面指定的表进行數据筛选,属于对原始数据的筛选。
having是对group by的结果进行筛选。
having后面的条件中可以用聚合雨数,where后面不可以。
练习:
-- 查询各个班级学生的平均年龄、最大年龄、最小年龄
select class,avg(age),max(age),min(age) from students group by class;
-- 查询1班除外其他班级学生的平均年龄、最大年龄、最小年龄
select class,avg(age),max(age),min(age) from students group by class having class!='1班';
6.[知道]分页查询
- 语法格式:
select * from 表名 limit start,count;
start表示的是开始的记录,索引是从0开始。0表示第一条记录
count表示的是从start开始,查询多少条记录
-- 查询前3行的学生信息
select * from students limit 0,3;
select * from students limit 3;
-- 查询第4到第6行学生信息
select * from students limit 3,3;
-- 每页显示5条数据,显示每一页的数据
select * from students limit 0,5;
select * from students limit 5,5;
select * from students limit 10,5;
- 分页查询实现
select * from 表名 limit (n-1)*m,m;
n表示的是页数 n=1,2,3,4
m表示的是每页显示的记录数 m=3
(n-1)*m,m是公式,并不是语法格式,不能直接写在SQL语句中,需要替换为具体的数字
7.连接查询
7.1[知道]连接查询概述
- 内连接:连接两个表时,取的是两个表中都存在的数据。(取交集)
- 左连接:连接两个表时,取的是左表中特有的数据,对于右表中不存在的数据,用null来填充。
- 右连接:连接两个表时,取的是右表中特有的数据,对于左表中不存在的数据,用null来填充。
7.2[重点]内连接
- 格式语法
select * from 表名1 inner join 表名2 on 表1.列=表2.列;
另一种写法:
select * from 表1,表2 where 表1.列=表2.列;
查询的是两个表的交集的数据
表1的列与表2的列一定是存在关联关系
内连接连接时可以连接多个表
- 案例
-- 例1: 查询学生信息及学生的成绩
select * from students inner join scores on students.studentNo=scores.studentNo;
-- students起别名为stu, scores起别名为sc
select * from students as stu inner join scores as sc on stu.studentNo=sc.studentNo;
-- 起别名可以不写as
select * from students stu inner join scores sc on stu.studentNo=sc.studentNo;
-- 例2:查询课程信息及课程的成绩
select * from courses cs inner join scores sc on cs.courseNo=sc.courseNo;
-- 例3:查询王昭君的成绩, 要求显示姓名、 课程号、 成绩
select stu.`name`,sc.courseNo,sc.score from students stu inner join scores sc on
stu.studentNo=sc.studentNo where stu.`name`='王昭君';
-- 1、查询学生信息及学生的课程对应的成绩
select * from students
inner join scores on students.studentNo=scores.studentNo
inner join courses on scores.courseNo=courses.courseNo;
-- 2、查询王昭君的数据库成绩,要求显示姓名、课程名、成绩
select students.`name`,courses.`name`,scores.score from students
inner join scores on students.studentNo=scores.studentNo
inner join courses on scores.courseNo=courses.courseNo
where students.`name`='王昭君' and courses.`name`='数据库';
-- 3、查询所有学生的数据库成绩,要求显示姓名、课程名、成绩
select students.`name`,courses.`name`,scores.score from students
inner join scores on students.studentNo=scores.studentNo
inner join courses on scores.courseNo=courses.courseNo;
-- 4、查询男生中最高成绩,要求显示姓名、课程名、成绩
select students.`name`,courses.`name`,scores.score from students
inner join scores on students.studentNo=scores.studentNo
inner join courses on scores.courseNo=courses.courseNo
where students.sex='男' order by scores.score desc limit 0,1;
7.3[知道] 左连接
- 语法格式
select * from 表1 left join 表2 on 表1.列=表2.列;
左连接查询的是左表特有的数据,对于右表中不存在的数据用null来填充
- 案例
-- 例1:查询所有学生的成绩, 包括没有成绩的学生
select * from students left join scores on students.studentNo=scores.studentNo;
-- 例2:查询所有学生的成绩, 包括没有成绩的学生, 需要显示课程名
select * from students
left join scores on students.studentNo=scores.studentNo
left join courses on scores.courseNo=courses.courseNo;
7.4[知道]右连接
- 语法格式
select * from 表1 right join 表2 on 表1.列=表2.列;
右连接查询的是右表特有的数据,对于左表中不存在的数据用null来填充
- 案例
-- 例1:查询所有学生的成绩,包括没有成绩的学生
select * from scores right join students on scores.studentNo=students.studentNo;
-- 例2:查询所有学生的成绩,包括没有成绩的学生,需要显示课程名
select * from courses
right join scores on courses.courseNo=scores.courseNo
right join students on students.studentNo=scores.studentNo;
8.自关联
8.1[知道]自关联介绍
- 自连接的应用场景:省、市、区的信息,一般不会分开放在不同的表里面进行存储,而是放在同一个表当中。
8.2[知道]自关联实现
- 要通过自关联进行查询时,当前自关联的表当中一定会存在两个相关联的字段
- 自关联: inner join 关联同一个表,不同的字段
- 自关联要用别名
- 语法格式
select * from 表名 as 别名1 inner join 表名 as 别名2 on 别名1.列=别名2.列;
- 案例
select * from areas as a1
inner join areas as a2 on a1.aid=a2.pid;
-- 查询出河南省所有的市
select * from areas as a1
inner join areas as a2 on a1.aid=a2.pid
where a1.atitle='河南省';
-- 查询出郑州市所有的区
select * from areas as a1
inner join areas as a2 on a1.aid=a2.pid
where a1.atitle='郑州市';
-- 查询出河南省所有的市区信息
select * from areas as a1
inner join areas as a2 on a1.aid=a2.pid
inner join areas as a3 on a2.aid=a3.pid
where a1.atitle='河南省';
-- 1、 查询河北省所有的市的信息
select * from areas as a1
inner join areas as a2 on a1.aid=a2.pid
where a1.atitle='河北省';
-- 2、查询出洛阳市所有的区的信息
select * from areas as a1
inner join areas as a2 on a1.aid=a2.pid
where a1.atitle='洛阳市';
9.子查询
- 将一条SQL查询的语句嵌入在其他的SQL语句中,被嵌入的SQL语句称之为子查询,其他的SQL称之为主查询
- 子查询select语句辅助主查询,要么是充当条件,要么充当数据源
- 子查询语句是一条完整的、可以单独执行select语句
9.1[知道]子查询—充当条件
-- 例1:查询王昭君的成绩,要求显示成绩(标量子查询);查一个可以使用标量
-- select studentNo from students where name='王昭君'; 子查询
-- 子查询的结果作为主查询的条件
select score from scores where studentNo=(select studentNo from students where name='王昭君');
-- 例2:查询18岁的学生的成绩,要求显示成绩(列子查询)
-- 先找18岁学生的学号,结果为列表
select studentNo from students where age=18;
select score from scores where studentNo in (select studentNo from students where age=18);
-- 例3:查询和王昭君同班、同龄的学生信息(行子查询)
select class,age from students where name='王昭君';
select * from students where (class,age) in (select class,age from students where name='王昭君');
9.2[知道]子查询—充当数据源
例1:查询数据库和系统测试的课程成绩
-
子查询—特定关键字
-
in 范围
格式:主查询 where 条件 in(列子查询);
- all 所有
格式:主查询 where 列=any(列子查询)
- any | some 任意
格式:主查询 where 列 = all(列子查询)
- 案例及练习
例2:查询18岁的学生的成绩,要求显示成绩(列子查询)
=any和in等价
SOME :是ANY的别称,很少用
!=all和 not in等价
1、查询大于平均年龄的学生
2、查询年龄在18-20之间的学生的成绩
- 查询演练
实践练习
-- 1.查询Student表中的所有记录的Sname. Ssex和Class列。
select sname,sex,class from student;
-- 2.查询教师所有的单位即不重复的Depart列。
select distinct depart from teacher;
-- 3.查询Student表的所有记录。
select * from student;
-- 4.查询Score表中成绩在60到80之间的所有记录。
select * from score where degree between 60 and 80;
-- 5.查询Score表中成绩为85, 86或88的记录。
select * from score where degree in(85,86,88);
-- 6.查询Student表中“95031"班或性别为“女"的同学记录。
select * from student where class='95031' or sex='女';
-- 7.以Class降序查询Student表的所有记录。
select * from student order by class desc;
-- 8.以Cno升序、Degree降序查询Score表的所有记录。
select * from score order by cno asc,degree desc;
-- 9.查询“95031"班的学生人数。
select count(*) from student where class='95031';
select class,count(*) from student group by class having class='95031';
-- 10.查询Score表中的最高分的学生学号和课程号。(子查询或者排序)
-- 排序
select sno,cno from score order by degree desc -- 降序
limit 1; -- 取第一个
-- 子查询
select max(degree) from score;
select sno,cno from score where degree=(
select max(degree) from score
);
-- 12.查询每门课的平均成绩。
-- course score 分组
select cno,avg(degree) from score group by cno;
-- 13.查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
-- 分组 组名3开拓的课程 ,同时组>=5人的组平均分
select cno,avg(degree) from score group by cno
having count(*)>=5 and cno like '3%';
-- 14.查询分数大于70,小于90的Sno列。
select sno,degree from score where degree >70 and degree <90;
-- 15.查询所有学生的Sname. Cno和Degree列。
select stu.sname,sc.cno,sc.degree from student as stu
inner join score as sc on stu.sno=sc.sno;
-- 16.查询所有学生的Sno. Cname和Degree列。
select sc.sno,co.cname,sc.degree from score as sc
inner join course as co on sc.cno=sc.cno;
-- 17.查询"95031"班学生的平均分。
select class,avg(degree) from student as stu
inner join score as sc on stu.sno=sc.sno
where class='95031';
-- 18.查询选修“3-105*课程的成绩高于“109"号同学成绩的所有同学的记录。
-- 1.查 109号同学的成绩 有四个,取最大的就行,大于最大的所有都大
select max(degree) from score where sno='109';
-- 2. 3-105成绩》1结果的所有同学信息
select * from student as stu
inner join score as sc on stu.sno=sc.sno
where sc.degree >(
select max(degree) from score where sno='109'
) and sc.cno='3-105';
-- 19.查询成绩高于学号为“109"、课程号为“3-105”的成绩的所有记录。
-- 1.查 109号同学 课程为 3-105 的同学成绩 有两个,取最大的就行,大于最大的所有都大
select max(degree) from score where sno='109' and cno='3-105';
-- 2.学生成绩 >1结果的所有记录
select * from student as stu
inner join score as sc on stu.sno=sc.sno
where sc.degree >(
select max(degree) from score where sno='109' and cno='3-105'
);
tudent as stu
inner join score as sc on stu.sno=sc.sno;
-- 16.查询所有学生的Sno. Cname和Degree列。
select sc.sno,co.cname,sc.degree from score as sc
inner join course as co on sc.cno=sc.cno;
-- 17.查询"95031"班学生的平均分。
select class,avg(degree) from student as stu
inner join score as sc on stu.sno=sc.sno
where class='95031';
-- 18.查询选修“3-105*课程的成绩高于“109"号同学成绩的所有同学的记录。
-- 1.查 109号同学的成绩 有四个,取最大的就行,大于最大的所有都大
select max(degree) from score where sno='109';
-- 2. 3-105成绩》1结果的所有同学信息
select * from student as stu
inner join score as sc on stu.sno=sc.sno
where sc.degree >(
select max(degree) from score where sno='109'
) and sc.cno='3-105';
-- 19.查询成绩高于学号为“109"、课程号为“3-105”的成绩的所有记录。
-- 1.查 109号同学 课程为 3-105 的同学成绩 有两个,取最大的就行,大于最大的所有都大
select max(degree) from score where sno='109' and cno='3-105';
-- 2.学生成绩 >1结果的所有记录
select * from student as stu
inner join score as sc on stu.sno=sc.sno
where sc.degree >(
select max(degree) from score where sno='109' and cno='3-105'
);