MYSQL 数据查询.多表查询及统计分组

一.SQL语句的执行顺序

 1、from 子句组装来自不同数据源的数据;

2、where 子句基于指定的条件对记录行进行筛选;

3、group by 子句将数据划分为多个分组;

4、使用聚集函数进行计算;

5、使用 having 子句筛选分组;

6、计算所有的表达式;

7、select 的字段;

8、使用 order by 对结果集进行排序。

二.多表查询-外连接

1.左外连接

select 字段列表 from 表1 left [outer] join 表2 on 条件……;

以左表为基表,与另外一张表的每一行进行匹配 如果符合连接条件,则返回两表相对应的行; 如果不符合,则只返回左表的行,右表以null填充

简单来说就是:查询表1(左表)的所有数据包括两表相交的部分数据

2.右外连接同理,不过多阐述

三.简单实例

图书管理数据库有读者reader图书book借阅数据表

读者表reader有读者证号dzzh、姓名xm、性别xb、身份sf、电话号码dhhm字段

图书表book有条形码txm、书名sm、分类号flh,作者zz,出版社cbs,出版日期cbrq,售价sj,典藏类别dclb,在库zk,币种bz字段

借阅表borrow有借阅编号jyid、读者证号dzzh、条形码txm、借阅日期jyrq、还书日期hsrq五个字段。 当读者借阅图书时,在借阅数据表中添加一条记录,还书日期设置为NULL,图书的在库zk字段被设置为0. 当读者归还图书时,将其对应借阅记录的还书日期设置为当天的日期,并修改图书的在库zk字段为1. 

 问题:第一题: 统计每本书借阅的次数,显示书名和借阅次数(借阅次数命名为jycs),按借阅次数降序排列,借阅次数相同的按书名降序排列 (提示:borrow数据表的一条数据对应一次借阅)

第二题: 统计借阅次数在2次以上的图书的借阅的次数,显示书名和借阅次数,按借阅次数降序排列,借阅次数相同的按书名降序排列

第三题 统计每个出版社的图书的借阅次数,显示出版社的名称和借阅次数,按借阅次数降序排列,借阅次数相同的按出版社降序排列

第四题: 统计每位读者借阅的次数,显示姓名和借阅次数,按借阅次数降序排列,借阅次数相同的按姓名降序排列

第五题: 统计研究生读者借阅的次数,显示姓名和借阅次数,按借阅次数降序排列,借阅次数相同的按姓名降序排列

问题分析:五个问题都与数据表borrow有关联,borrow中一条数据对应一次借阅。将borrow表作为左表(即保留borrrow全部数据),与其他表进行连接,再进行查询操作。

 代码:

1.
select sm,count(*)jycs  from borrow left join book on book.txm=borrow.txm 
group by sm 
order by count(*) desc,sm desc;
2.
select sm,count(*)jycs  from borrow left join book on book.txm=borrow.txm 
group by sm having(count(*)>=2)
order by count(*)  desc,sm desc;
3.
select cbs,count(*)jycs from borrow left join book on book.txm=borrow.txm 
group by cbs
order by count(*) desc,cbs desc;
4.
select xm,count(*)jycs from borrow left join reader on borrow.dzzh=reader.dzzh 
group by xm
order by  count(*) desc,xm desc;
5.
select xm,count(*)jycs from borrow left join reader on borrow.dzzh=reader.dzzh 
where sf='研究生'
group by xm
order by count(*) desc,xm desc;

注意:order by <表达式1>,<表达式2>

表示首先按第一个表达式的值排序,第一个表达式的值相同的再按第二个表达式的值排序

猜你喜欢

转载自blog.csdn.net/m0_62428181/article/details/127268688