Database数据库
一、课程目录
理解数据库和表的概念
掌握创建数据库和表的SQL命令
数据库表字段类型、主键、备注/ not null
掌握忘表插入数据的SQL命令 --- insert
掌握修改表数据的SQL命令--- update
掌握删除数据库、表、数据的SQL命令 --- drop、delete
数据库和表的概念
思考:
物业网站展示的信息 是存放在哪里?
数据库的概念:
存储数据的容器( 可以理解为 仓库 )
表的概念:
一对多的关系,一个库里通常维护多个表(货架)
一个数据库服务器下面,多个库
创建数据库
语法:
create database 数据库名称
例如:创建数据库
create database test_db ;
创建表
思考:如何将 Excel表的数据 保存到 数据库中的某个表里面
分析:为了将数据放在表里,需要创建的表,必须跟Excel的数据库结果一样
语法
create table 表名 ( 字段名1 类型1,字段名2 类型2 ... ) Default CharSet=utf8 ;
解释
字段名:用来标识表的一列
字段类型:用来声明每一个字段存储数据的类型,因为在mysql中,数据有类型(整数、小数、字符、时间 ... )
字符集:UTF8,用来指定表支持中文数据存储
例如:创建 student表的SQL
create table student(
id int not null Primary key auto_increment,
name varchar(12),
sex varchar(12),
class_id int(11),
address varchar(12),
create_date datetime,
update_date datetime
) Default Charset=utf8 ;
常见字段类型
每种字段都有自己的类型,如:整数型、字符型、时间类型、日期类型、浮点型 等
常用的数据类型:
1)整型 -- 整数
tinyint:占1个字节,取值范围: -128 ~ 127
int :占4个字节,取值范围: -214748364 ~ 2147483647
2)字符串型
char(n): n个字符,最多 255 个字符,固定长度
varchar(n):n个字符,最多 65535个字符,可变长度
3)时间和日期
date: 日期,格式(yyy-mm-dd,例如: 2016-08-22)
time: 时间,格式(hh:mm:ss ,例如: 18:40:37 )
datetime: 日期时间,格式(yyy-mm-dd hh:mm:ss,例如:2016-08-22 18:41:27)
4) 浮点型(小数)
float(m,d): 单精度浮点型,32bit,m代表总位数,d小数位;如99.9声明类型为:float(4,2)
double(m,d):双精度浮点型,64bit,m代表总位数,d小数位
decimal(m,d):m代表总数位,d小数位;decimal数据类型用于精度要求非常高的计算中,
比如语句 decimal(7,3) 规定存储的数值不能超过7位数字,并且小数点后不能超过3位
主键
主键是什么? 它有什么特征
主键字段存储的数值不能重复,因此 主键可以唯一标识一行数据
一个表只有一个主键
主键是非必需的,也就是说一个表可以不声明主键字段
语法
<字段名><类型> primary key ;
思考: 上面 student 表那个字段适合做主键
主键数值 生成策略
自动增长 auto_increment
备注 comment '性别,1-男,2-女,3-其他'
小结
1、创建表声明字段时候,字段之间以什么符号分隔?符号用中文的可以吗? 英文输入法 -- 英文符号 ; 不能
2、建表声明字段的时候,最后一个字段后面需注意什么?
不能留 "," 逗号
3、主键的特征是什么?
唯一性、非空性 ; primary key 声明;
4、如果表需要支持中文数据存储,需要怎么做?
Default Charset=utf8 ; 设置字符集
5、创建表了,发现表没有出现,可以刷新一下表。F5刷新
6、Navicat 里 SQL写完丢失了,其实是因为没有保存。Ctrl+S 保存
7、学会分析错误:near附近+line行数 排查问题
插入表数据(insert)
插入一条数据,对所有字段都赋值
语法
1)insert into <表名> values ( 数值A,数值B ... );
2)insert into <表名>( 字段1,字段2 ...) values( 数值A,数值B ... );
例如:
1)insert into t_user values( 1,'tommy','123','男');
2)insert into tb_user(id,name,age,sex,tel,score) values(1,'zsf',18,'1','17722857587',90);
插入一条数据,并且对一部分字段赋值
语法
insert into <表名>(字段A,字段B ...) values ( 值A,值B ...);
例如
insert into t_user( user_name,Pwd,Phone,Type) values( 'nick','123','苹果',5 );
总结
如果插入数据时,只对部分字段进行初始化,则需声明要插入的字段
插入表数据( insert )
批量插入,一次插入多条数据
语法
insert into <表名> values ( 值1,值2 ... ),( 值1,值2 ... );
例如:
insert into t_user (user_name,Pwd,Phone,Type)
values ( 'nick','123','苹果',5 ),
( 'nick','456','vivo',8 ),
( 'nick','789','华为',5 );
修改表数据(update)
语法
update 表名 set 字段名1 = 新值1,字段名2 = 新值2 ...
例如:将用户表(t_user) 里所有用户类型的type修改为4
update t_user set type = 4 ;
修改一个表里满足某些条件的那一部分数据
语法
update 表名 set 字段名1 = 新值1,字段名2 = 新值2 ... where 条件表达式1 and(or) 条件表达式2 ... ;
例如:
将用户表(t_user)里的 'nick'用户的type修改为 4
update t_user set type = 4 where user_name = 'nick';
总结:
如果要更新一个表满足某个条件的数据,需用到关键字 where 来进行过滤找出 那一部分数据。然后针对这一部分数据做更新操作
删除数据库 或 表( drop )
删除数据库
语法
drop database 数据库名称 ;
例如:删除数据库 test_db
drop database test_db ;
删除数据表
语法
drop table 表名 ;
例如:删除表 test_table
drop table test_table ;
总结
drop database A ;会把数据库A删除,因此库里的所有表和数据全部删除
drop table B ;会把表B删除,因此表B的数据也会删除
drop 作为一种删除命令,它不仅仅删除数据结果(库/表),并且删除数据
简单来讲:drop 删除结构和数据,所有这两个命令要慎用
删除表数据(delete)
删掉表里所有数据
语法
delete from 表名 ;
例如:删除用户表里所有数据
delete from t_user ;
删除一个表里满足条件的数据
语法
delete from 表名 where 条件1 and(or) 条件2 ... ;
例如:删除会员表名为 'tommy'的数据
delete from user where user_name = 'tommy' ;
总结:
1)如果要删除某个满足某条件的数据,需要用到关键字 where来进行过滤找出那一部分数据
2)delete 也是一种删除命令,但是与drop命令不同的是,delete只会删除表里面的数据,不会删除表和库。简单来说,delete删除数据不删结果
小结
1、插入数据时,只初始化部分字段与初始化所有字段时 SQL的不同体现在哪里?
声明字段
2、赋值时,对于varchar类型的字段,赋值时应注意什么?
加引号
3、字段声明了 长度,赋值时应该注意什么?插入数据的长度 超长了有问题吗?
报错 / 截断
4、插入一条数据和多条数据的语法有区别是? 多条数据时,中间以什么符号分隔?
1)插入单条数据
insert into persons
(id_p, lastname , firstName, city )
values
(204,'haha' , 'deng' , 'shenzhen');
2)插入多条数据
insert into persons
(id_p, lastname , firstName, city )
values
(200,'haha' , 'deng' , 'shenzhen'),
(201,'haha2' , 'deng' , 'GD'),
(202,'haha3' , 'deng' , 'Beijing');
区别:values 后面 按插入数据格式 直接写多条数据
分隔:以 ','逗号分隔
练习
作业一:
举例:后台注册操作,哪些表有数据变化,具体哪些变化? --增删改查
--t_user表会新增一条数据,且type为0
1、后台添加业主信息,哪些表有数据变化,具体哪些变化?
--t_owner表新增一条数据,status 为 2
2、后台添加单元信息,哪些表有数据变化,具体哪些变化?
--t_unit表新增一条记录
3、完善代理商角色的账号信息,哪些表有数据变化,具体哪些变化?
--t_user表的 type为2
--merchant表新增一条数据,且merchant_type为2
4、后台添加一个小区,且审核通过了,哪些表有数据变化,具体哪些变化?
--t_community新增一条数据,审核通过后修改state为1
5、绑定业主,哪些表有数据变化,具体哪些变化?
--t_owner_user新增一条数据
--t_user 新增一条数据,且 type 为 5
新增次数 和 获取短信验证码次数有关
作业二:
id | user_name | pwd | phone | type | reg_time |
---|---|---|---|---|---|
1001 | Jack | 123456 | 78813989123 | 1 | 2017-01-01 13:07:08 |
1002 | Rose | 123456 | 78813989123 | 1 | 2017-01-01 13:07:08 |
1103 | Tommy | 123456 | 78813989123 | 1 | 2017-01-01 13:07:08 |
1004 | Nick | 123456 | 78813989123 | 1 | 2017-01-01 13:07:08 |
1005 | Peter | 123456 | 78813989123 | 1 | 2017-01-01 13:07:08 |
1、新增用户表(t_user)数据,按照截图里给出的对应的表数据,使用insert语句往对应的表里插入对应的数据
#单行插入
#insert into t_user values ( 1001,'Jack','123456','78813989123', '1', '2017-01-01 13:07:08') ;
#多行插入
insert into t_user values ( 1002,'Rose','123456','78813989123', '1', '2017-01-01 13:07:08') ,
( 1003,'Tommy','123456','78813989123', '1', '2017-01-01 13:07:08'),
( 1004,'Nick','123456','78813989123', '1', '2017-01-01 13:07:08') ,
( 1005,'Peter','123456','78813989123', '1', '2017-01-01 13:07:08') ;
2、使用insert语句在楼栋表(t_building)中新增两条楼栋信息,要求:
-- 新增一个楼栋id为2001,楼栋编号为567,楼名称为"德智楼",建筑面试10000,小区id为9527,创建时间为2021年1月1日的数据
-- 新增一个楼栋id为3001,楼栋编号为456,楼名称为"体美楼",建筑面试345.67,小区id为9527,创建时间为2021年1月1日的数据
1)单行插入
insert into t_building( building_id,building_num,building_name,floorage,community_id,create_time)
values( 2001 ,'567','德智楼',10000, 9527, '2021-01-01' );
2)多行插入
insert into t_building( building_id,building_num,building_name,floorage,community_id,create_time)
values( 2002 ,'567','德智楼',10000, 9527, '2021-01-01' ) , ( 3001 ,'456','体美楼',345.67, 9527, '2021-01-01' );
3、SQL更新用户Nick的手机号为 13112341234
update t_user set phone='13112341234' where user_name='Nick' ;
4、使用SQL删除用户表(t_user) Peter 的会员信息
delete from t_user where user_name='Peter';
二、本课目标
掌握数据库查询的SQL命令 select
单表查询
多表查询
左右连接查询
单表查询
不加条件的查询
1)查询特定字段,语法
select <字段1,字段2 ... > from < 表名 > ;
例如:查看会员表的所有用户的手机号码和用户类型
select phone,type from t_user ;
2)查看所有字段,语法
select * from < 表名 > ;
例如:查看会员表的所有用户信息
select * from t_user ;
单表查询
按条件进行查询
1)多个条件需同时成立,语法
select ... from <表名> where 表达式Aand 表达式B and ... 表达式N ;
例如:查看会员表中类型为:物业、且注册时间大于 2021年4月21日
select * from t_user where type=3 and reg_time > '2021-04-21';
2)多个条件不需同时成立,只需满足其中一个或多个,语法
select ... from 表名 where 字段a = 值a or 字段b = 值b or 字段c = 值c ;
例如:查看会员表中用户ID为1或ID为2或用户名为 Nick 的用户信息
select * from t_user where id = 1 or id = 2 or user_name = 'Nick' ;
多表查询
问题一
1、对于不同类型的信息怎么存储?是放一个表 还是不同类型数据放在 不同表
2、放在一个表的缺点
字段过多
难以维护
表数据庞大
数据冗余,重复数据过多
问题二
1、既然不同类型的数据放在不同表,那原来有关联的数据怎么保持原有的关系呢?
解决方案:
设计表的时候两个表之间维持一个关联即可。
---建表,设立关联字段(id)
t_user表中 id 字段 与 t_merchant 表 的用户编号 userid 构成一个关联:
t_user.id = t_merchant.user_id
多表查询
语法
select 要查询字段 from 表1,表2 ... where 关联条件和过滤条件
例如:
查询 id为12的用户名、手机号、创建时间、该用户商户编号、商户名称、成立日期
分析:
涉及表:用户表 t_user、商户表t_merchant
查询字段:
会员表(user_name,phone,reg_time),商户表(id,merchant_name,establish_data)
关联关系:
t_user.id = t_merchant.user_id
过滤条件:
t_user.id = 12
连接查询
语法 | ||
---|---|---|
Inner Join | 内连接 | 又称为 等值连接,获取两个表中字段匹配关系的记录 |
Left Join | 左连接 | 读取左边表的全部数据,即使右边表没有关联数据,左连接会从左表产生一套完整的记录,和右表匹配记录。如果右表每一匹配记录,则右表结果集字段为 null |
Right Join | 右连接 | 以右表为基础,与 Left Join 相反 |
案例
查询结果排序(order by)
对结果集进行排序
语法:
select ... from ... order by 字段A asc( desc );
select ... from ... order by 字段A asc( desc ),字段A desc ;
例如:查询用户表所有普通用户信息,按可用余额升序、降序排列
select * from t_user where type = 1 order by reg_time ;
select * from t_user where type = 1 order by reg_time desc ;
注意:
如果不写排序 规则,默认排序为 asc ;
1、升序 asc
2、降序 desc
练习
1、建表与数据
为管理业务培训信息,建立3个表
1、S( S# , SN ,SD,sA )S#,SN, SD,SA分别代表学号,学员姓名,所属单位,学员年龄
2、C( C# , CN )C#,CN 分别代表课程编号,课程名称
3、SCC( S# , C# , G )S#,C#,G分别代表学号,所选的课程编号,学习成绩
-- ----------------------------
-- Table structure for `S`
-- ----------------------------
CREATE TABLE `S` (
`S#` varchar(255) DEFAULT NULL,
`SN` varchar(255) DEFAULT NULL,
`SD` varchar(255) DEFAULT NULL,
`SA` varchar(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of S
-- ----------------------------
INSERT INTO `S` VALUES ('1', '张三', '销售部', '24');
INSERT INTO `S` VALUES ('2', '李四', '销售部', '30');
INSERT INTO `S` VALUES ('3', '王五', '运营部', '28');
INSERT INTO `S` VALUES ('4', '赵六', '运营部', '27');
INSERT INTO `S` VALUES ('5', '孙七', '运营部', '23');
INSERT INTO `S` VALUES ('6', '周八', '开发部', '33');
INSERT INTO `S` VALUES ('7', '吴九', '开发部', '29');
-- ----------------------------
-- Table structure for `C`
-- ----------------------------
CREATE TABLE `C` (
`C#` varchar(255) DEFAULT NULL,
`CN` varchar(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of C
-- ----------------------------
INSERT INTO `C` VALUES ('C1', '税收基础');
INSERT INTO `C` VALUES ('C2', '开发大全');
INSERT INTO `C` VALUES ('C3', '运营之道');
INSERT INTO `C` VALUES ('C4', '销售之王');
-- ----------------------------
-- Table structure for `SCC`
-- ----------------------------
CREATE TABLE `SCC` (
`S#` varchar(255) DEFAULT NULL,
`C#` varchar(255) DEFAULT NULL,
`G` varchar(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of SCC
-- ----------------------------
INSERT INTO `SCC` VALUES ('1', 'C4', '80');
INSERT INTO `SCC` VALUES ('2', 'C4', '70');
INSERT INTO `SCC` VALUES ('3', 'C1', '90');
INSERT INTO `SCC` VALUES ('4', 'C3', '66');
INSERT INTO `SCC` VALUES ('5', 'C3', '81');
INSERT INTO `SCC` VALUES ('6', 'C2', '91');
INSERT INTO `SCC` VALUES ('7', 'C2', '56');
1.查询选修课程名称为'税收基础'的学员学号和姓名?
分析:
1、学员学号和姓名 --S 、课程名称 --C
2、多表 ---关联条件: S.S# and C.C# = SCC.C#
3、过滤条件 C.CN = '税收基础'
4、查询字段写完整
1)where查询
select S.`S#`,S.SN from S,C,SCC where SCC.`S#` = S.`S#` and C.`C#` = SCC.`C#` and C.CN = '税收基础';
2)联合查询
select S.`S#`,S.SN from S where S.`S#` = ( SELECT SCC.`S#` from SCC INNER JOIN C where C.CN='税收基础' and SCC.`C#`=C.`C#` ) ;
2.查询选修课程编号为'C2'的学员姓名和所属单位?
分析:
1、姓名和所属单位 --S 、课程编号 --SCC
2、两表关联条件 S.S# = SCC.S#
3、过滤条件 SCC.C# = 'C2'
4、补齐查询字段
1)子查询
select S.SN,S.SD from S,SCC where S.`S#` = SCC.`S#` and SCC.`C#` = 'C2' ;
三、本节课目标
掌握 in 的用法
掌握模糊查询 like 的用法
掌握统计 count() 的用法
掌握分组 group by 的用法
掌握去重 distinct 的用法
掌握 between 的用法
掌握 mysql 的分页
掌握 mysql 常用函数
查询 in 用法
使用场景:查询时候,条件字段的值存在于某个数据集
语法:
select ... from 表名 where 条件字段 in (数据集)
数据集可以是具体的某个值:值a,值b,值n;也可以是通过一个子查询得到的数据集
例如:
查询用户 id 为 1,2, 3 的用户信息
select * from t_user where id in (1,2,3);
拓展
not in 的用法:条件字段的值不存在于某个数据集
查询用户 id 不为 1,2,3的用户
select * from t_user where id not in (1,2,3);
模糊查询 - like
使用场景:查询的时候,条件字段的值不完整的情况
语法:
%百分号来匹配任意长度的字符串,而且%出现的位置不同所代表的意义不同
条件字段的值 以任意字符串开头,以 xx 结尾的值
select <字段1,字段2, ... > from <表名> where <条件字段> like 'xx%' ;
条件字段的值 包含 xx
select <字段1,字段2, ... > from < 表名 > where <条件字段 > like '%xx%' ;
分组 - group by
使用场景:
group by 顾名思义就是按照某一个,或 多个 字段来分组。一般通过 "聚合函数" 配合使用,使用时 至少需要一个分组字段。某某信息来进行分组
语法
select 查询字段,聚合函数 from 查询涉及的表 group by 分组字段 having 过滤条件 ;
语法解析
1)聚合函数:对一组数值执行计算并返回的函数。聚合函数经常与 select 语句 的 group by 子句 一同使用,常见聚合函数有: sum()、count()、avg()、min()、max() 等
2)having: 在分组以后如果想在这个分组结果的基础上继续过滤的话,必须把过滤条件写到 having后面
例如:
请按小区分组,统计楼栋表中 各个小区的 楼栋数
select community_id ,count( building_id ) '楼栋编号' from t_building group by community_id ;
数值相关函数
1、求字段A的最小值: min(字段A)
2、求字段A的最大值: max(字段A)
3、求字段A的平均值: avg(字段A)
4、求字段A的和: sum(字段A)
1)日期函数
获取系统当前日期时间: sysdate()
获取系统当前日期: curdate()
获取系统当前时间: curtime()
获取给定日期的年份:year(date)
获取给定日期的月份:month(date)
为指定日期增加一个时间间隔的函数:date_add( date,interval expr unit )
2)字符串函数:
字符串拼接函数: concat( 字段A,字段B )
字符串截取函数: substr( 字段A,截取开始位置 position,截取字符串个数 )
获取字符串的函数:length(字段A)
大小写字母转换的函数: lower()、upper()
查询 -between
使用场景
条件字段的取值处于两个字段范围内的情况
语法
select ... from 表名 where 条件字段 between 数值A and 数值B ;
例如:
找出用户表里 注册时间为 2021年4月10号至 20号的注册用户信息( 包含边界值 )
select * from t_user where reg_time between '2021-04-01 00:00:00' and '2021-04-20 23:59:09' ;
查询 - 去重(distinct)
使用场景:
去除 查询结果中的重复数据
语法
select distinct 字段1 from 表名 ;
例如:
查询所有注册的账户角色
select distinct type from t_user ;
查询 - 分页( limit )
使用场景
取查结果的前 n 条记录
语法
select ... from 表名 limit m,n ;
m:指的索引值是从m开始 ; n: 表述每页要去多少条数据
m = ( 第几页的页数 - 1) * 每页条数 ; n = 每页条数
例如:
每页取 10 条记录
第一页: limit 0 ,10 表示 索引从 0 开始 取 10条记录
第一页: limit 10,10 表示 索引从 10 开始 取 10条记录
第一页: limit 20,10 表示 索引从 20 开始 取 10条记录
...
思考:
1)如每页展示 x 条数据,取第 y页时,分页语句中的
m = ( y - 1 ) * x 和 n = x 值分别为多少?
2)请用SQL将 t_user 表数据按照 id 降序排列后取 前 3 条数据
select 语句查询结构
select
...
from
...
[where]
...
[group by]
...
[having]
...
[order by]
...
[limit]
...
注意:
进行查询数据时,过滤条件(关键词) 是有顺序的
练习
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `authors`
-- ----------------------------
DROP TABLE IF EXISTS `authors`;
CREATE TABLE `authors` (
`authorId` int(11) NOT NULL,
`authorName` varchar(50) default NULL,
`sex` varchar(2) default NULL,
`age` int(11) default NULL,
`city` varchar(50) default NULL,
`telephone` varchar(11) default NULL,
`sales` int(11) default NULL,
`isbn` datetime default NULL,
`create_date` datetime default NULL,
`update_date` datetime default NULL,
PRIMARY KEY (`authorId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of authors
-- ----------------------------
INSERT INTO `authors` VALUES ('1', '小赵', '男', '18', '西安', '18829346424', '34', '2016-01-09 10:22:37', '2016-10-09 10:22:37', '2016-10-09 10:22:37');
INSERT INTO `authors` VALUES ('2', '小钱', '女', '19', '重庆', '18329346888', '35', '2016-02-09 10:22:37', '2016-10-09 10:22:37', '2016-10-09 10:22:37');
INSERT INTO `authors` VALUES ('3', '小孙', '男', '20', '上海', '15882328888', '36', '2015-03-09 10:22:37', '2016-10-09 10:22:37', '2016-10-09 10:22:37');
INSERT INTO `authors` VALUES ('4', '张力', '男', '51', '四川', '13459346424', '38', '2017-04-09 10:22:37', '2016-10-09 10:22:37', '2016-10-09 10:22:37');
INSERT INTO `authors` VALUES ('5', '小李', '男', '25', '西安', '18929346424', '39', '2016-05-09 10:22:37', '2016-10-09 10:22:37', '2016-10-09 10:22:37');
INSERT INTO `authors` VALUES ('6', '小周', '女', '36', '怀化', '15537458345', '34', '2016-06-09 10:22:37', '2016-10-09 10:22:37', '2016-10-09 10:22:37');
INSERT INTO `authors` VALUES ('7', '小吴', '女', '58', '合阳', '17323456394', '35', '2017-07-09 10:22:37', '2016-10-09 10:22:37', '2016-10-09 10:22:37');
INSERT INTO `authors` VALUES ('8', '小王', '女', '48', '珠海', '18829346424', '37', '2016-08-09 10:22:37', '2016-10-09 10:22:37', '2016-10-09 10:22:37');
作者表 : authors
作者编号: authorId int(11)
作者姓名: authorName varchar(50)
性别: sex varchar(2)
年龄: age int
居住城市: city varchar(50)
联系电话: telephone varchar(11)
销量: sales int(11)
最新出版日期:isbn datetime
1)查询 姓 张 的作者信息
select * from authors where authorName like '张%%' ;
2)查询联系电话第三位为8或9并以888结尾的作者信息
select * from authors where substr(telephone,3,1) in ('8','9') and telephone like '%888' ;
3)查询显示作者的姓名,销量,并按销量降序排列
select authorName,sales from authors order by sales desc ;
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `course`
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`cid` int(11) NOT NULL,
`cname` varchar(12) default NULL,
`tid` int(11) NOT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES ('1', '语文', '1001');
INSERT INTO `course` VALUES ('2', '数学', '1002');
INSERT INTO `course` VALUES ('3', '外语', '1003');
-- ----------------------------
-- Table structure for `sc`
-- ----------------------------
DROP TABLE IF EXISTS `sc`;
CREATE TABLE `sc` (
`sid` int(11) default NULL,
`cid` int(11) default NULL,
`score` int(11) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of sc
-- ----------------------------
INSERT INTO `sc` VALUES ('16001', '1', '55');
INSERT INTO `sc` VALUES ('16001', '2', '40');
INSERT INTO `sc` VALUES ('16002', '1', '51');
INSERT INTO `sc` VALUES ('16002', '3', '80');
INSERT INTO `sc` VALUES ('16003', '1', '40');
INSERT INTO `sc` VALUES ('16003', '2', '55');
INSERT INTO `sc` VALUES ('16003', '3', '50');
INSERT INTO `sc` VALUES ('16004', '1', '99');
-- ----------------------------
-- Table structure for `student`
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`sid` int(11) NOT NULL,
`sname` varchar(10) default NULL,
`sage` int(11) default NULL,
`ssex` varchar(10) default NULL,
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('16001', '张三', '21', '男');
INSERT INTO `student` VALUES ('16002', '李四', '21', '男');
INSERT INTO `student` VALUES ('16003', '王五', '21', '男');
INSERT INTO `student` VALUES ('16004', '赵六', '22', '男');
-- ----------------------------
-- Table structure for `teacher`
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
`tid` int(11) default NULL,
`tname` varchar(10) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES ('1001', '李家俊');
INSERT INTO `teacher` VALUES ('1002', '徐根宝');
INSERT INTO `teacher` VALUES ('1003', '叶平');
student表(sid,sname,sage,ssex)--学号,姓名,学生年龄,性别
course表(cid,cname,tid)--课程代码,课程名称,老师工号
sc表(sid,cid,score)--学号,课程代码,分数
teacher表(tid,tname)--老师工号,老师姓名
1)查询平均成绩大于60分的学生学号和平均成绩。
select sid'学生学号',avg(score)'平均成绩' from sc group by sid having avg(score) > 60 ;
2)查询所有学生的学号,姓名,选课数,总成绩。
SELECT student.sid'学号' , student.sname'姓名', COUNT( student.sid )'选课数', SUM( sc.score )'总成绩'
FROM student INNER JOIN sc ON student.sid = sc.sid
GROUP BY student.sid, student.sname ;
3)查询没有学过叶平老师课程的学生的姓名和学号。
select student.sid,student.sname from student where student.sid
not in
(
select sc.sid from sc inner join course on sc.cid=course.cid
inner join teacher on course.tid = teacher.tid where teacher.tname = '叶平'
) ;
4)查询所有课程成绩都小于60分的学生姓名和学号。
select sid,sname from student where sid in( select distinct sid from sc where not score > 60 ) ;