MySQL语法与应用

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 后面 按插入数据格式 直接写多条数据
    分隔:以 ','逗号分隔

练习

image-20221111001859102.png
image-20221111002024256.png
image-20221111002047705.png
image-20221111002119924.png
image-20221111002139372.png
image-20221111002228851.png
作业一:

举例:后台注册操作,哪些表有数据变化,具体哪些变化? --增删改查
    --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 相反
image-20221108214948855.png

案例

image-20221108215023018.png

查询结果排序(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 ) ;
 

你可能感兴趣的:(MySQL语法与应用)