前言: 大数据技术专业学生 刚入门MySQL的一些学习笔记 如有错误欢迎指正也很乐意一起讨论一起学习MySQL 后续会慢慢更新内容。需要MySQL安装教程可以私信我。
以图书馆数据库为例
一,基本查询语句
基本书写规则
关于MySQL的一些基本书写规则(除中文输入外 SQL语句书写都是用输入法切换为英文输入)
1.SQL语句以分号(;)结尾
2.字符串和日期常数需要用单引号(')括起来,数字直接书写。
3.单词之间需要用英文半角空格或者换行进行分割。
列出所有列
关键语句:select * from ... 显示列表所有数据
二,单表查询语句
列出指定列
关键语句:select <列名> from <表名>
例:查阅所有读者的姓名
select readername from reader;
查询所有读者的姓名以及学院
select readername,schoolname from reader,school;
where查询条件
实际查询数据中往往有许多限制条件以便于查找精确的数据,where用于限制条件
关键语句:select <列名> from <表名> where <条件表达式>(where一定在from后)
· 例:查询价格为38元的图书以及出版社
select bookname,publishname from book where price=38;
where语句的使用
比较运算
例:查询价格为38元的图书以及出版社
select bookname,publishname from book where price=38;
运用like进行模式匹配
例:显示book表中作者姓曹的信息,要求显示书名和作者名。
select bookname,author from book where author like '曹%';
显示book表中作者第二个字为正的信息,要求显示书名和作者名。
select bookname,author from book where author like '_正%';
范围比较
用于范围比较的有 between,in。
关键语句: 表达式 (not) between 表达式1 and 表达式2。
表达式 in (表达式1,..n)
更推荐第二种
空值确认
表达式 is (not)null;
易错点: 空值确认用‘is’ 不用‘=’号,‘=’在这里是赋值符号 后面用于给表内赋空值NULL。
复合查询条件
'and'是且的关系,‘or’是或的关系,在于不在‘in’或者‘not in’。
例:从book表中找到价格为38且出版社为‘长江出版社’的书籍。
select * from book where price=38 and publishname='长江出版社‘;
查询书籍编号’b004','b007','b013'的信息
select * from book where bookno='b004' or bookno='b007' or bookno='b013';
用in表示
select * from book where bookno in(’b004','b007','b013');
between and的使用
用and
select bookname,author from book where price>=20 and price<=30;
用between and
select bookname,author from book where price between 20 and 30;
删除重复行(distinct)
改变结果列名
想要改变数据表的列名可以用 表名 as 改后名或者,表名 改后名。
例:查询书籍表中显示book表中作者姓曹的信息,要求显示书名和作者名,并将其改名为书名和作者名。
select bookname 书名,author 作者 from book like '%曹%';
等价于
select bookname as 书名,author as 作者 from book like '%曹%';
聚合函数与计算问题
在SQL语句中 数据库的列值与列值之间同样可以进行计算,而聚合函数对一组值执行计算,并且返回单个值。
列值之间计算有+ - * /
聚合函数之间有max(最大值),min(最小值),avg(平均值),sum(求和),count(种数)
例1:求每一类图书的总价值,显示书名,单价,存量和总价值
select bookname 书名,price 单价,number 存量,price*number 总价值 from book;
例2:查询最贵的书和最便宜的书分别是平均价格多少倍。
select max(price)/avg(price),avg(price)/min(price) from book;
使用 ‘group by’ 进行分组和计算
‘group by‘按条件进行分组。
例:将出版社相同的图书分一组(统计每个出版社出版图书数目)
select publishname,count(*) from book group by publishname。
关键语句:select from where group by(顺序不能变)
技巧1:当where 与group by一起用时,where可以对指定的条件进行过滤
例:统计清华大学出版社出版的图书(指定条件为清华大学出版社 利用where过滤掉其他出版社)
select publishname,count(*) from book where publishname='清华大学出版社' group by publishname;
技巧2:统计类别字段一定放在select呈现
统计每个出版社出版图书的总价值
select publishname,sum(price*number) from book group by publishname;
技巧3:凡是在select语句中出现聚合函数,一般来说聚合函数以外的字段都要放在group by的分类中
按出版社名称、作者统计每一类出版图书的总价值
select publishname,author,sum(price*number) from book group by publishname,author;
技巧4:distinct 和 group by可以实现相同的功能:删除后续列中重复的数据
想要删除选择结果中的重复记录用 distinct,想要计算聚合结果用 group by
关于group by的易错点
1.group by子句中不能使用 select语句中列的别名
2.group by聚合结果是无序的
3.where子句中不能使用聚合函数,只有select子句或者having以及order by子句中
为聚合结果指定条件(having子句的使用)
:当我们使用count函数等聚合函数对表中数据进行聚合时,为其指定条件的不是where子句,而需要having子句,且不是聚合条件的在having子句中不能使用。(where子句用来指定数据行的条件,having子句用来指定分组的条件)
语句顺序:select from where group by having
例:显示每个出版社出版图书的总价值大于100的情况
select publishname,sum(price*number) from book group by publishname having sum(price*number)>100;(用聚合函数当条件限制用having)
显示每个出版社出版图书单价大于50的图书总价值
select publishname,sum(price*number) from book where price>50 group by publishname;
对查询结果进行排序(order by)
语句顺序:select from where group by having order by。
使用order by 子句对查询结果进行排序,在列名后面加上asc进行升序(系统默认升序排序所以当要升序排序可不加asc),desc为降序排序。
单个字段排序
例:统计下每个出版社出版图书的数目,按出版社名称降序排序
selectpublishname,count(publishname) from book group by publishname order bypublishname desc;
order by可以指定多个排序键,多个字段排序时,在by后按主次排序顺序排序。
例:统计下每个出版社出版图书的数目,按出版社名称降序排序,如果出版社一样,按作者升序排序select publishname,author,count(publishname) from book group by publishname order by publishname desc,author
显示指定行
select...from...limit...x,y
x从0开始计算为起始行,y限顶行。
三,多表查询
多表联结(select选项含多个表的数据)
内联结
在前面单表查询时,查询数据时都只用到了一个列表的数据。而在多表查询中需要将两个表的数据连接在一起 ,但将两个列表数据连接在一起不能只是简单的运用单表查询语句去查询。将不同两个表数据连接在一起需要找到一个桥梁,而这个桥梁就是两个表共同的列。
例:
在上面的两个表中的桥梁就是’schoolno‘,如果想要同时显示两个表中的数据则需要利用schoolno将两个表连接。
第一种连接方式 (利用where进行连接)
select <列名1>,<列名2>...from<表1>, <表2> where <表1>.<共同列>=<表2>.<共同列>;
例:请显示读者的信息,包括学院,读者姓名以及读者性别。
select schoolname,readername,gender from school,reader where school.schoolno=reader.schoolno
第二种连接方式 (国际推荐方式 join on)
select <列名1>,<列名2>...from <表1> join <表2> on <表1>.<共同列>=<表2>.<共同列>;
select schoolname,readername,gender from school join reader on school.schoolno=reader.school;
外联结(左,右外联结)
使用where或join...on...显示的一定是能够相匹配的数据,当需要显示不匹配的数据时,必须使用外连接的方式(left join 或right join)
例:请显示所有读者姓名和所属学院,如果某个学院没有读者,也请显示出来。
select readername,schoolname from reader left join school on reader.schoolno=school.schoolno;
等价于
select readername,schoolname from school right join reader on school.schoolno=reader.school;
易错点:多个数据连接且存在外连接时,外连接放在最后。因为外连接会里连接后面全部数据一起显示;
例:请显示所有读者姓名和所属学院,图书编号,如果某个学院没有读者,也请显示出来。
错误 select readername,schoolname,bookno from school right join reader on school.schoolno=reader.school join borrow on reader.readerno=borrow.readerno;
正确 select readername,schoolname,bookno from borrow join reader on borrow.readerno=reader.readerno left join school on reader.schoolno=school.schoolno;