文章目录
- 🌟数据库语句应用介绍
- 🍀数据库语句分类介绍
- DDL(Data Definition Language)数据定义语言
- DCL(Data Control Language)数据控制语言
- DML(Data Manipulation Language)数据操作语言
- DQL(Data Query Language)数据查询语句
- 🧩数据库数据类型
- 整数数据类型
- 浮点数据类型(小数)
- 字符串数据类型
- 时间数据类型
- 枚举数据类型
- 📐数据库数据约束属性
- 常见的约束定义
- 常见的属性定义
- 🌟数据库语句应用练习
- 📌DDL语句类型练习
- 创建数据库
- 查看数据库
- 修改数据库
- 删除数据库
- 切换数据库信息
- 创建数据表信息
- 查看数据表信息
- 修改数据表信息
- 修改数据表结构信息
- 删除数据表信息
- 📌DML语句类型练习
- 增加数据内容信息(insert)
- 修改数据内容信息(update)
- 删除数据内容信息(delete)
- 🌟DQL语句类型练习
- 🔍查询数据库服务配置
- 🔍查询数据库函数信息
- 🔍查询数据库数据
- 单表数据信息查看
- 多表数据信息查看
🌟数据库语句应用介绍
SQL,英文全称为Structured Query Language,中文意思是结构化查询语言(属于编程语言);
它是一种对关系数据库中的数据进行定义和操作的语言,是大多数关系数据库管理系统所支持的工业标准语言。
在使用SQL语句时,也会用到几种常用的标准:SQL 89 /
SQL 92
/SQL 99 /SQL 03
🍀数据库语句分类介绍
在企业实际应用过程,还会根据SQL语言操作的方式,细化为四种类型:
DDL(Data Definition Language)数据定义语言
- 作用:可以用于管理数据库和数据表,管理数据表中的索引信息
- 命令:create(创建) alter(修改) drop(删除) show(查看)
DCL(Data Control Language)数据控制语言
- 作用:可以管理用户权限信息
- 命令:grant(用户授权) revoke(权限回收) commit(提交) rollback(回滚)
DML(Data Manipulation Language)数据操作语言
- 作用:可以管理数据表中的数据内容
- 命令:insert delete update
DQL(Data Query Language)数据查询语句
- 作用:可以查询调取表中的数据信息
- 命令:select(单表中查询数据 多表查询数据)
🧩数据库数据类型
作用:
1.定义数据表中的数据以什么方式进行存储
2.可以便于进行数据信息检索
整数数据类型
只允许指定数据列,录入的数据信息为正整数或负整数
数据类型 | 占用存储空间 | 数值范围(负数) | 数值范围(正数) |
---|---|---|---|
tinyint | 1个字节 | -128~127 | 0~255 |
smallint | 2个字节 | -32768~32767 | 0~65536 |
mediumint | 3个字节 | -8388608~8388607 | 0~16777216 |
int | 4个字节 | -2147483648~2147483647 | 0~4294967295 |
bigint | 8个字节 | ±9.22*10的18次方 | 0~18446744073709551999 |
浮点数据类型(小数)
数据类型 | 占用存储空间 | 数据类型含义 |
---|---|---|
float(m,d) | 4个字节(32 位)的存储空间 | 单精度浮点型 可以精确到07位小数(08位精度);m总个数,d小数位 |
double(m,d) | 8个字节(64 位)的存储空间 | 双精度浮点型 可以精确到15位小数(16位精度);m总个数,d小数位 |
字符串数据类型
数据类型 | 占用存储空间 | 数据类型含义 |
---|---|---|
char(n) | 根据字符编码情况*字符数量 | 固定长度,最多255个字符 |
varchar(n) | 根据字符编码情况*字符数量 | 可变长度,最多65535个字符 |
tinytext | 可变长度,最多255个字符 | |
text | 可变长度,最多65535个字符 | |
mediumtext | 可变长度,最多2的24次方-1个字符 | |
longtext | 可变长度,最多2的32次方-1个字符 |
char-定长/varchar-变长 (不同字符类型区别:影响数据字符存储数量)
时间数据类型
数据类型 | 占用存储空间 | 数据类型含义 |
---|---|---|
date | 3个字节 | 日期数据类型,即以此方式存储数据 ‘2008-12-2’ |
time | 3个字节 | 时间数据类型,即以此方式存储数据 ‘12:25:36’ |
datetime | 8个字节 | 日期时间类型,即以此方式存储数据 ‘2008-12-2 22:06:44’ |
timestamp | 4个字节 | 自动存储记录修改时间 |
枚举数据类型
enum: 一般用于固定字符的输入
📐数据库数据约束属性
通过数据类型设置的约束与属性,可以让数据库服务限制人类录入的数据信息,从而避免录入数据信息混乱的局面;并且,通过数据类型的约束与属性设置,还可以避免数据信息输入的重复与输入数据信息不能为空;
常见的约束定义
序号 | 约束方法 | 解释说明 |
---|---|---|
01 | PK(primary key) | 表示主键约束,非空且唯一(表中只能有一个主键)(例如学号) |
02 | UK(unique key) | 表示唯一约束(例如手机号) |
03 | NN(not null) | 表示非空约束(例如名字) |
04 | FK(foreign key) | 表示外键约束,多表之间关联使用(不同关注,应用场景不多) |
常见的属性定义
序号 | 属性信息 | 解释说明 |
---|---|---|
01 | default | 设定默认数据信息,可以实现自动填充 |
02 | auto_increment | 设定数值信息自增,可以实现数值编号自增填充(一般配合主键使用) |
02 | comment | 设定数据注释信息 |
03 | unsigned | 设定数值信息非负,可以实现数值信息列不能出现负数信息 |
🌟数据库语句应用练习
📌DDL语句类型练习
创建数据库
#创建新的数据库
mysql > create database test;
mysql > create schema test;#创建新的数据库,并修改调整默认的字符编码
mysql > create database test character set utf8mb4;
mysql > create database test charset utf8 collate utf8_general_mysql500_ci;
查看数据库
#查看所有数据库信息
mysql > show databases;#检索查看指定的数据库信息
mysql > show databases like '%b%';#查看创建库的语句信息,还可以利用此命令完成数据的备份
mysql > show create database test;
修改数据库
#修改数据库服务字符集编码信息与字符编码排序规则信息
mysql > alter database test charset utf8mb4;
mysql > alter database test charset utf8 collate utf8_general_mysql500_ci;
删除数据库
#删除数据库信息(在生产环境一定慎用)
mysql > drop database test;
mysql > drop schema test;
切换数据库信息
#在已有数据库之间进行切换
mysql > use blog
Database changed#查看当前所在数据库信息
mysql > select database();
+--------------+
| database() |
+--------------+
| blog |
+--------------+
1 row in set (0.00 sec)
创建数据表信息
语法结构:
create table 表名 (
字段01名称 数据类型 属性信息/约束信息,
字段02名称 数据类型 属性信息/约束信息,
字段03名称 数据类型 属性信息/约束信息,
约束信息/索引信息
)存储引擎(文件系统) 字符集CREATE TABLE `student` (id int NOT NULL COMMENT '学号信息',name varchar(45) NOT NULL COMMENT '学生名',age tinyint unsigned NOT NULL COMMENT '学生年龄',gender enum('M','F','N') NOT NULL DEFAULT 'N' COMMENT '学生性别',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生表'
查看数据表信息
#切换到指定数据库中
mysql > use mysql;#查看数据库中所有表信息
mysql > show tables;#查看数据库中指定表数据结构信息
mysql > desc stu1;#查看数据库中指定表创建语句信息,可以实现独立表空间迁移
mysql > show create table stu1;
修改数据表信息
#修改数据表名称信息
mysql > rename table stu1 to stu2;
或者
mysql > alter table stu2 rename stu3;#查看表名称信息是否修改
mysql > show tables;#修改表结构中字符集编码信息
mysql > alter table stu1 charset utf8mb4;#查看表字符编码信息情况
mysql > show create table stu1;
修改数据表结构信息
#利用alter在数据表中添加新的表结构字段
mysql > alter table <表名> add column <字段名称> <数据类型> <约束与属性> [comment '注释'] [选项参数];#利用alter在数据表中删除已有表结构字段
mysql > alter table <表名> drop column <字段名称>;#利用alter在数据表中修改已有表结构字段(数据类型 约束与属性)
mysql > alter table <表名> modify column <字段名称> <数据类型> <约束与属性> [comment '注释'] [选项参数];#利用alter在数据表中修改已有表结构字段(字段名称 数据类型 约束与属性)
mysql > alter table <表名> change column <旧字段名称> <新字段名称> <数据类型> <约束与属性> [comment '注释'] [选项参数];#利用alter在数据表中删除已有表结构字段(约束与属性)
mysql > alter table <表名> drop index <字段名称> ;#在学生表中,添加新的表结构字段列(追加字段列-单列操作)
mysql > alter table stu add column telno char(11) not null unique key comment '手机号';#在学生表中,添加新的表结构字段列(插入字段列-单列操作)
mysql > alter table stu add column wechat varchar(64) not null unique key comment '微信号' after age;#在学生表中,添加新的表结构字段列(插入首行列-单列操作)
mysql > alter table stu add column sid int not null unique key comment '微信号' first;#查看表结构字段信息变化
mysql > desc stu;#在学生表中,删除已有表结构字段列(删除指定字段列-单列操作)
mysql > alter table stu drop column sid;#在学生表中,修改已有表结构字段列(修改表结构数据类型)
mysql > alter table stu modify name varchar(64);#在学生表中,修改已有表结构字段列,最后带有保持原有配置的属性信息,否则其他属性信息会被还原为默认
mysql > alter table stu modify name varchar(64) not null comment '学生名';#在学生表中,修改已有表结构字段列(修改表结构字段名称)
mysql > alter table stu change name stuname varchar(64) not null comment '学生名';
或者
mysql > alter table stu change column name stuname varchar(64) not null comment '学生名';#在学生表中,修改已有表结构字段列(修改表结构属性信息)了解即可
mysql > alter table stu modify name varchar(64) not null unique comment '学生名称';#在学生表中,修改已有表结构字段列(删除表结构属性信息)了解即可
mysql > alter table stu drop index `name`;#查看表结构字段信息变化
mysql > desc stu;
删除数据表信息
#数据表删除命令语法
mysql > drop table <表名>;#删除操作过程,会将定义的表结构和表中数据内容一并删除
mysql > drop table stu1;#删除操作过程,只是清空表中数据内容,但保留定义的表结构信息
mysql > truncate table stu1;
📌DML语句类型练习
增加数据内容信息(insert)
- 添加命令语法格式:
#属于表内容信息变更操作,需要按照表结构预先定义好的字段信息插入
mysql> insert into <表名> [( <字段名1>[,..<字段名n > ])] values ( 值1 )[, ( 值n )];
- 实际操作命令演示:
#插入单行信息标准方法(信息输入不要重复,且特定信息不要为空)
mysql> desc stu1;
mysql> insert into stu1(id,name,age,dept) values(1,'zhu',35,'net sec');#插入单行信息标准方法(自增列信息可以填入0或null,表示默认实现自增效果)
mysql> insert into stu1(id,name,age,dept) values(0,'zhu',35,'net sec');
mysql> insert into stu1(id,name,age,dept) values(null,'zhu',35,'net sec');#插入单行信息可以不含有表字段信息
mysql> insert into stu1 values(2,'zhu02',25,'linux');#插入多行信息可以不含有表字段信息
mysql> insert into stu1 values(03,'zhu03',2,'net sec'),(04,'zhu04',1,'Linux');#插入当行信息可以只含部分字段信息,但是省略字段信息必须具有自增特性 或 可以为空 或有默认值输入
mysql> insert into stu1(name,age) values('zhu',35);#插入中文信息
mysql> insert into stu1 values(6,'朱',32,'python,linux,net sec');#检查信息是否插入成功
mysql> select * from stu1;
修改数据内容信息(update)
- 修改命令语法格式:
#属于表内容信息变更操作,需要按照表结构预先定义好的字段信息修改,并且按照条件修改,默认全表修改
mysql> update 表名 set 字段=新值,… where 条件;
- 实际操作命令演示:
#修改表数据内容标准方式,修改时一定要加条件信息(条件信息建议为主键或具有唯一性信息)
mysql> update stu1 set name="zhangsan" where id=6;#检查信息是否修改成功
mysql> select * from stu1;
删除数据内容信息(delete)
- 删除命令语法格式:
#属于表内容信息变更操作,需要按照表结构预先定义好的字段信息删除,并且按照条件删除,默认全表删除
mysql> delete from 表名 where 表达式;
- 实际操作命令演示:
#删除表信息时,如果不加条件会进行逐行删除全表信息(效率比较慢)
mysql> delete from stu1 where id=6;
mysql> delete from stu1 where id<3;
mysql> delete from stu1 where age=2 or age=1;
mysql> delete from stu1;#检查信息是否删除成功
mysql> select * from stu1;
🌟DQL语句类型练习
数据查询语句(DQL),主要用来查询记录过的数据信息,在实际应用过程中也会有多种查询使用方法
🔍查询数据库服务配置
查询命令语法格式
#查询获取信息命令语法
mysql> select @@配置参数信息;
mysql> show variables like '检索的配置信息';
实际操作命令演示:获取系统配置信息
#查询数据库服务端口配置信息
mysql> select @@port;
+-----------+
| @@port |
+-----------+
| 3306 |
+-----------+
1 row in set (0.00 sec)#查询数据库服务套接字文件信息
mysql> select @@socket;
+-----------------+
| @@socket |
+-----------------+
| /tmp/mysql.sock |
+-----------------+
1 row in set (0.00 sec)#查询数据库服务比较长的配置参数信息
mysql> select @@innodb_flush_log_at_trx_commit;
+----------------------------------------------+
| @@innodb_flush_log_at_trx_commit |
+----------------------------------------------+
| 1 |
+----------------------------------------------+
1 row in set (0.00 sec)
0: 每秒刷新一次日志到磁盘,事务提交时不刷新
1: 每次事务提交时都刷新日志到磁盘
2: 每次事务提交时刷新日志到操作系统的缓存,每秒刷新到磁盘#查看数据库服务所有配置参数信息
mysql> show variables;#查看数据库服务配置信息模糊查找(查找po开头的信息)
mysql> show variables like 'po%';#查看数据库服务配置信息模糊查找(查找po结尾的信息)
mysql> show variables like '%po';#查看数据库服务配置信息模糊查找(查找含有po的信息)
mysql> show variables like '%po%';
数据库服务在线调整配置参数方法:
#表示在线临时调整配置参数,并且只是当前会话生效(session是默认方式,不是所有配置都可以调整)
mysql > set session innodb_flush_log_at_trx_commit=1
mysql > set sql_log_bin=0;#表示在线临时调整配置参数,并且将会影响所有连接(global是全局方式,可以进行所有配置调整)
mysql > set global innodb_flush_log_at_trx_commit=1
说明:数据库服务配置参数在线调整参数,只是临时生效,数据库服务重启后配置会失效,想要永久生效需要修改配置文件信息
🔍查询数据库函数信息
利用查询函数信息,主要是解决某些数据开发应用时,可以利用调取函数信息快速获取
#查询数据库服务函数输出信息,获取服务版本信息
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.36 |
+-----------+
1 row in set (0.00 sec)#查询数据库服务函数输出信息,获取当前日期时间
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2025-08-19 21:01:12 |
+---------------------+
1 row in set (0.00 sec)#查询数据库服务函数输出信息,获取拼接函数信息
mysql> select concat(123);
+-------------+
| concat(123) |
+-------------+
| 123 |
+-------------+
1 row in set (0.00 sec)#拼接函数应用演示
mysql> select concat(user,"@","'",host,"'") from mysql.user;
+-------------------------------+
| concat(user,"@","'",host,"'") |
+-------------------------------+
| root@'%' |
| mysql.infoschema@'localhost' |
| mysql.session@'localhost' |
| mysql.sys@'localhost' |
| root@'localhost' |
+-------------------------------+
5 rows in set (0.00 sec)
🔍查询数据库数据
单表数据信息查看
官方数据库测试样例文件下载:https://dev.mysql.com/doc/index-other.html
mysql -uroot -pzhu <world.sql
- 1)利用select+from 查看表中所有数据
查看city表中所有字段数据信息
select * from city;
select name,population from city;
⚠️不要在企业环境中,对大表数据进行全表查看(磁盘-内存-展示 消耗磁盘性能-IO性能)
- 2)利用select+from+where 过滤指定数据信息
#查询中国的所有城市信息
select * from city where countrycode='CHN';#查询人口数量大于100w城市信息
select * from city where population >1000000;
> < <= >= #查询中国城市人口数量,并且将人口数量大于100w城市进行显示
select * from city where countrycode='CHN' and population>1000000;#查询中国城市人口数量,将人口数量大于200w,和小于1w城市信息都进行显示
select * from city where countrycode='CHN' and population >2000000 or countrycode='CHN' and population <10000;
select * from city where countrycode="CHN" and (population<=10000 or Population>=2000000);and:将关联的多个条件进行逐一数据过滤
or: 将关联的多个条件分别进行过滤,将过滤后结果进行整合#查询中国城市信息,将城市名称是a开头城市显示
select * from city where countrycode='CHN' and name like 'a%';#特殊组合信息查询(配合in, not in, between and)
#查询中国和美国的所有城市
select * from city where countrycode='CHN' or countrycode='USA';
select * from city where countrycode in ('CHN','USA');#查询中国人口数量在 50000w~100000w之间城市信息
select * from city where countrycode='CHN' and population>50000 and population<100000;
select * from city where countrycode='CHN' and population between 50000 and 100000;#去重查询数据信息
#统计中国有多少个省份
select distinct District from city where countrycode='CHN';
- 3)select+from+group by 分组查询数据信息
分组查询作用:可以将不同类型的条件信息进行分类,将不同类型中的数据进行统计分析
聚合函数应用:sum()-求和函数 count()-计数函数 max()-最大值函数 min()-最小值函数 avg()-平均值函数
#根据city数据表,求出每个国家的人口总数group by countrycodegroup by语句执行逻辑:
1)根据group by语句后面指定条件列进行排序 group by countrycode
2)根据group by语句后面指定条件列进行合并 group by countrycode chn
3)根据group by语句中应用聚合函数,将不同分组区域数据进行聚合统计sum(population)select countrycode,sum(population) from city group by countrycode;#根据city数据表,查询中国各个省份的城市数量 group by District
#查询需求中只要有:每个/各个 -- 应用分组查询 每个各个关键字后面条件作为分组条件列
select District,count(name) from city where countrycode='chn' group by District;#根据city数据表,查询中国各个省份的城市数量,以及显示每个省份城市信息
select District,count(name),group_concat(name) from city where countrycode='chn' group by District\G#分组查询数据经典报错:
ERROR 1055 (42000):
Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'world.city.Name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
此时输出数据信息,不符合关系型数据库结构 一行对应一行
- 4)select+from+having
having:表示根据条件进行过滤查询(可以将聚合后临时产生的列作为条件列查询)
where: 表示根据条件进行过滤查询(只能根据表中有的条件列进行过滤)#根据city数据表,求出每个国家的人口总数 将人口总数大于1000w国家信息,和人口信息进行输出
select countrycode,sum(population) from city group by countrycode having sum(population)>50000000;
- 5)select+from+order by 做排序
#根据city数据表,求出每个国家的人口总数 将人口总数大于1000w国家信息,并进行国家人口信息排序
mysql> select countrycode,sum(population) from city group by countrycode having sum(population)>50000000 order by sum(population) desc;
+-------------+-----------------+
| countrycode | sum(population) |
+-------------+-----------------+
| CHN | 175953614 |
| IND | 123298526 |
| BRA | 85876862 |
| USA | 78625774 |
| JPN | 77965107 |
| RUS | 69150700 |
| MEX | 59752521 |
+-------------+-----------------+
7 rows in set (0.03 sec)mysql> select countrycode,sum(population) from city group by countrycode having sum(population)>50000000 order by sum(population) desc;
+-------------+-----------------+
| countrycode | sum(population) |
+-------------+-----------------+
| CHN | 175953614 |
| IND | 123298526 |
| BRA | 85876862 |
| USA | 78625774 |
| JPN | 77965107 |
| RUS | 69150700 |
| MEX | 59752521 |
+-------------+-----------------+
7 rows in set (0.03 sec)
- 6)select+from+limit 截取部分信息输出(head)
#根据city数据表,求出每个国家的人口总数 将人口总数大于1000w国家信息,并显示国家人口数量最多的三个国家
mysql> select countrycode,sum(population) from city group by countrycode having sum(population)>50000000 order by sum(population) desc limit 3;
+-------------+-----------------+
| countrycode | sum(population) |
+-------------+-----------------+
| CHN | 175953614 |
| IND | 123298526 |
| BRA | 85876862 |
+-------------+-----------------+
3 rows in set (0.03 sec)select+from+where+group by+having+order by+limit;
多表数据信息查看
创建多表查询所需模拟数据库和数据表信息
CREATE DATABASE school CHARSET utf8;
USE school;CREATE TABLE student (sno INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号',sname VARCHAR(20) NOT NULL COMMENT '姓名',sage TINYINT UNSIGNED NOT NULL COMMENT '年龄',ssex ENUM('f','m') NOT NULL DEFAULT 'm' COMMENT '性别'
) ENGINE=INNODB CHARSET=utf8;CREATE TABLE course (cno INT NOT NULL PRIMARY KEY COMMENT '课程编号',cname VARCHAR(20) NOT NULL COMMENT '课程名字',tno INT NOT NULL COMMENT '教师编号'
) ENGINE=INNODB CHARSET=utf8;CREATE TABLE sc (sno INT NOT NULL COMMENT '学号',cno INT NOT NULL COMMENT '课程编号',score INT NOT NULL DEFAULT 0 COMMENT '成绩'
) ENGINE=INNODB CHARSET=utf8;CREATE TABLE teacher (tno INT NOT NULL PRIMARY KEY COMMENT '教师编号',tname VARCHAR(20) NOT NULL COMMENT '教师名字'
) ENGINE=INNODB CHARSET=utf8;#在数据库与数据表中插入模拟数据
INSERT INTO student(sno,sname,sage,ssex)
VALUES
(1,'zhang3',18,'m'),
(2,'zhang4',18,'m'),
(3,'li4',18,'m'),
(4,'wang5',19,'f'),
(5,'zh4',18,'m'),
(6,'zhao4',18,'m'),
(7,'ma6',19,'f'),
(8,'zhu',20,'m'),
(9,'zhu01',20,'f'),
(10,'zhu02',25,'m');INSERT INTO teacher(tno,tname)
VALUES
(101,'zhu'),
(102,'xiaoQ'),
(103,'xiaoA'),
(104,'xiaoB');INSERT INTO course(cno,cname,tno)
VALUES
(1001,'linux',101),
(1002,'python',102),
(1003,'mysql',103),
(1004,'go',105);INSERT INTO sc(sno,cno,score)
VALUES
(1,1001,80),
(1,1002,59),
(2,1002,90),
(2,1003,100),
(3,1001,99),
(3,1003,40),
(4,1001,79),
(4,1002,61),
(4,1003,99),
(5,1003,40),
(6,1001,89),
(6,1003,77),
(7,1001,67),
(7,1003,82),
(8,1001,70),
(9,1003,80),
(10,1003,96);SELECT * FROM student;
SELECT * FROM teacher;
SELECT * FROM course;
SELECT * FROM sc;
course – 课程表
sc – 成绩表
student-- 学生表
teacher-- 讲师表
- ER模型
- 1)内连接查询数据(将多张表的交集数据进行整合)
SQL 92:select * from A,B where A.id=B.id;
mysql> select * from teacher,course where teacher.tno=course.tno;SQL 99:select * from A join B on A.id=B.id;
mysql> select * from teacher join course on teacher.tno=course.tno;
- 2)外连接查询数据
SQL 99
select * from A left join B on A.id=B.id;
mysql> select * from teacher left join course on teacher.tno=course.tno;select * from A right join B on A.id=B.id;
mysql> select * from teacher right join course on teacher.tno=course.tno;
- 01: 统计zhang3,学习了几门课?
将多张关联的表进行拼接
select * from student join sc
on student.sno=sc.sno
join course
on sc.cno=course.cno;
根据需求查询数据内容
select student.sname,count(course.cname) from student join sc
on student.sno=sc.sno
join course
on sc.cno=course.cno
where student.sname='zhang3';
- 02 查询所有老师所教学生不及格的信息
select student.sname,sc.score,course.cname from student join sc
on student.sno=sc.sno
join course
on sc.cno=course.cno
where sc.score<60;
- 练习01:查询平均成绩大于60分的同学的学号和平均成绩
select student.sno as "学号",avg(sc.score) as "成绩平均分" from student join sc
on student.sno=sc.sno
group by student.sno,student.sname
having avg(sc.score)>60;
- 练习02:查询所有同学的学号,姓名,选课数,总成绩
select student.sno as "学号",student.sname as "姓名",count(sc.cno) as "选课数",sum(sc.score) as "总成绩" from student join sc
on student.sno=sc.sno
group by student.sname,student.sno;
- 练习03:查询各科成绩最高和最低的分,以如下形式显示:课程ID,最高分,最低分
select course.cno as "课程ID",max(sc.score) as "最高分",min(sc.score) as "最低分" from course join sc
on course.cno=sc.cno
group by course.cno;
- 练习04:统计各位老师,所教课程的及格数
select teacher.tname as "老师",course.cname as "课程",count(sc.score) as "及格数" from course join sc
on course.cno=sc.cno
join teacher
on course.tno=teacher.tno
where sc.score>60
group by tname,cname;
- 练习05:查询每门课程被选修的学生数
select course.cname as "课程名",count(sc.cno) as "及格数" from course join sc
on course.cno=sc.cno
group by cname;
- 练习06:查询出只选修了一门课程的全部学生的学号和姓名
select student.sno as "学号",student.sname as "姓名" from student join sc
on student.sno=sc.sno
group by student.sno
having count(sc.cno)=1;
- 练习07:查询选修课程门数超过1门的学生信息
select student.sno as "学号",student.sname "姓名" from student join sc
on student.sno=sc.sno
group by student.sno
having count(sc.cno)>1;
- 练习08:统计每门课程:优秀(85分以上),良好(70-85),一般(60-70),不及格(小于60)
select course.cname as 课程名,
group_concat(case when sc.score>85 then student.sname end) as 优秀,
group_concat(case when sc.score>=70 and sc.score<85 then student.sname end) as 良好,
group_concat(case when sc.score>=60 and sc.score<70 then student.sname end) as 一般,
group_concat(case when sc.score<60 then student.sname end) as 不及格
from student
join sc on student.sno=sc.sno
join course on sc.cno=course.cno
group by course.cno;
- 练习09:查询平均成绩大于85的所有学生的学号、姓名和平均成绩
select student.sno as "学号",student.sname as "姓名",avg(sc.score) as "平均分" from student join sc
on student.sno=sc.sno
group by student.sno
having avg(sc.score)>85;