一.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>
表示首先按第一个表达式的值排序,第一个表达式的值相同的再按第二个表达式的值排序