数据库服务语句应用

🌟数据库语句应用介绍

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.可以便于进行数据信息检索

整数数据类型

只允许指定数据列,录入的数据信息为正整数或负整数

数据类型占用存储空间数值范围(负数)数值范围(正数)
tinyint1个字节-128~1270~255
smallint2个字节-32768~327670~65536
mediumint3个字节-8388608~83886070~16777216
int4个字节-2147483648~21474836470~4294967295
bigint8个字节±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-变长 (不同字符类型区别:影响数据字符存储数量)

时间数据类型

数据类型占用存储空间数据类型含义
date3个字节日期数据类型,即以此方式存储数据 ‘2008-12-2’
time3个字节时间数据类型,即以此方式存储数据 ‘12:25:36’
datetime8个字节日期时间类型,即以此方式存储数据 ‘2008-12-2 22:06:44’
timestamp4个字节自动存储记录修改时间

枚举数据类型

enum: 一般用于固定字符的输入

📐数据库数据约束属性

通过数据类型设置的约束与属性,可以让数据库服务限制人类录入的数据信息,从而避免录入数据信息混乱的局面;并且,通过数据类型的约束与属性设置,还可以避免数据信息输入的重复与输入数据信息不能为空;

常见的约束定义

序号约束方法解释说明
01PK(primary key)表示主键约束,非空且唯一(表中只能有一个主键)(例如学号)
02UK(unique key)表示唯一约束(例如手机号)
03NN(not null)表示非空约束(例如名字)
04FK(foreign key)表示外键约束,多表之间关联使用(不同关注,应用场景不多)

常见的属性定义

序号属性信息解释说明
01default设定默认数据信息,可以实现自动填充
02auto_increment设定数值信息自增,可以实现数值编号自增填充(一般配合主键使用)
02comment设定数据注释信息
03unsigned设定数值信息非负,可以实现数值信息列不能出现负数信息

🌟数据库语句应用练习

📌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 countrycode

group 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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱包林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值