一、MySQL入门
1.了解数据库和MySQL
本章是MySQL的入门章节,在本章中主要是对MySQL和数据库概念的一个了解和MySQL的安装,并且学习了如何使用数据库客户端工具navicat对MySQL进行连接,并且对navicat的基本操作进行学习。
2.创建数据表
3.利用查询功能在表内插入数据
二、简单查询
1.基本查询语句
select子句:select <列名1>,<列名2>,......
from子句:from <表名>;
select * from <表名>; 表示查询该表中的全部列。
distinct子句:删除重复数据 select distinct 姓名 from student;表示删除student表中姓名列中重复的数据。
2.指定查询条件
select <列名1>,<列名2>,......
from <表名>
where 查询条件;
SQL的运行顺序:
- from 从哪张表中查找数据
- where 查询出符合条件的行
- 从查询出的行中选取出select语句指定的列
3.运算符
算术运算符:+ - * / 任何数与null运算结果都等于null
比较运算符:=、<>(不等于)、>、>=、<、<=
逻辑运算符:not(否定某一条件)、and(并且)、between(范围查询)、or(或者)、in(or的简单用法)
4.字符串模糊查询
like子句:字符串模糊查询(%表示任意字符串、_一个下划线表示任意1个字符)
三、汇总分析
1.汇总函数
count函数:求某列的行数,count(*)表示求所有行数
select count(*) from teacher; 表示求“teacher”表的所有行数
sum函数:对某列数据求和,只能对数值类型的列计算
select sum(成绩) from score; 表示对“score”表中的“成绩”列求和
avg函数:求某列数据的平均值,只能对数值类型的列计算
select avg(成绩) from score; 表示对“score”表中的“成绩”列求平均值,即求平均成绩
max函数:求某列数据的最大值
select max(成绩) from score; 表示求“score”表中的“成绩”列的最大值
min函数:求某列数据的最小值
select min(成绩) from score; 表示求“score”表中的“成绩”列的最小值
2.分组
group by子句:将数据按某个条列进行分组
select 性别,count(*) from student group by 性别; 按性别进行分组,汇总不同性别的人数
对分组结果指定条件:having子句
3.用SQL解决业务问题
(1)翻译成大白话
面对一个我们需要解决的问题,我们要把问题翻译成自己能看懂的大白话,理解问题
(2)写出分析思路
面对一个问题,要先思考解决这个问题的分析思路是什么,第一步要做什么,第二步要做什么...
(3)写出对应的SQL语句
按照分析思路写出SQL语句
4.对查询结果排序
降序(desc):从大到小
升序(asc):从小到大
空值(null)的排序:对一列数值进行排序,空值(null)会排在最前面
limit子句:从查询结果中取出指定行
select * from score limit 2; 表示从查询结果中取出前两行
四、复杂查询
1.视图功能
视图是一个虚拟的表,是一个表中的数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成。视图本身不存放数据,它存放的是SQL查询语句,所以视图中的数据会随着查询的源表数据的改变而改变。
创建视图:create view 视图名称(<视图列名1>,<视图列名2>,...) as <select查询语句>;
视图的作用:视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使用户不必为以后的操作每次都指定全部的条件。
2.子查询
子查询是在一个select查询语句中嵌套进了另一个select查询语句,SQL查询语句是先运行子查询再运行外部的查询语句。
子查询可用于from、in、any、all中
any和all关键字:这两个都是用于子查询,any 是任意一个 ,all 是所有
any表示有任何一个满足就返回true,all表示全部都满足才返回true
例如:
select 学号,成绩 from where 成绩>any(select 成绩 from score where 课程号='0002'); 表示这些学号的学生成绩比课程0002的全部成绩里的任意一个高
select 学号,成绩 from where 成绩>all(select 成绩 from score where 课程号='0002');
表示这些学号的学生成绩比课程0002的全部成绩里的所有成绩都高
3.标量子查询
一般子查询结果可以返回多行结果,而返回结果只有一行的查询叫标量子查询。由于标量子查询只返回一个值,所以标量子查询的返回值可以和比较运算符(<、>)一起使用。
select 学号,成绩 from score where 成绩>(select avg(成绩) from score); 表示求大于平均成绩学生的学号
select 学号,成绩 from score where 成绩 between(select avg(成绩)from score where 成绩<60) and (select avg(成绩)from score where 成绩>80); 表示求介于小于60分学生平均成绩和大于80分学生平均成绩之间的学生成绩
只要用到单一值的情况下,我们都可以用标量子查询获取到
4.关联子查询
在关联子查询中,对于外部查询返回的每一行数据,内部查询都要执行一次。另外,在关联子查询中是信息流是双向的。外部查询的每行数据传递一个值给子查询,然后子查询为每一行数据执行一次并返回它的记录。然后,外部查询根据返回的记录做出决策。
1、外部查询得到一条记录并传递到内部查询中;
2、内部查询基于输入值执行;
3、内部查询把返回值输出到外部查询中,并用这些值结束内部查询。
三种子查询对比:
5.各种函数
(1)汇总函数
count函数:求某列的行数,count(*)表示求所有行数
select count(*) from teacher; 表示求“teacher”表的所有行数
sum函数:对某列数据求和,只能对数值类型的列计算
select sum(成绩) from score; 表示对“score”表中的“成绩”列求和
avg函数:求某列数据的平均值,只能对数值类型的列计算
select avg(成绩) from score; 表示对“score”表中的“成绩”列求平均值,即求平均成绩
max函数:求某列数据的最大值
select max(成绩) from score; 表示求“score”表中的“成绩”列的最大值
min函数:求某列数据的最小值
select min(成绩) from score; 表示求“score”表中的“成绩”列的最小值
(2)字符串函数
(3)算术函数
(4)日期函数
五、多表查询
1.表的加法(union)
将两个表的数据按行合并在一起
select 课程号,课程名称 from course union select 课程号,课程名称 from course1; 表示将course和course1这两张表的数据按行合并在一起,去除重复的行
select 课程号,课程名称 from course union all select 课程号,课程名称 from course1; 表示将course和course1这两张表的数据按行合并在一起,保留除重复的行
2.表的联结
关系数据库里,两张表有对应的列可以相互关联到一起的对应匹配关系叫做联结。
(1)交叉联结(笛卡尔积,cross join)
将表中的每一行和另一个表中的每一行合并在一起
(2)内联结(inner join)
查找出同在于两张表中的数据,并对这些数据进行交叉联结
select a.学号,a.姓名,b.课程号 from student as a inner join score as b on a.学号=b.学号; 表示这两张表通过学号进行内联结
(3)左联结(left join)
将左侧的表作为主表,将主表中的数据全部取出来,右边的表中只选出和主表数据相同主键的行
select a.学号,a.姓名,b.课程号 from student as a left join score as b on a.学号=b.学号; 表示这两张表通过学号进行左联结
(4)右联结(right join)
将右侧的表作为主表,将主表中的数据全部取出来,左边的表中只选出和主表数据相同主键的行
select a.学号,a.姓名,b.课程号 from student as a right join score as b on a.学号=b.学号; 表示这两张表通过学号进行右联结
(5)全联结(full join)
全连接的查询结果会返回左边表和右边表的所有行,当某行和另一表中的行匹配的时候,两个行进行合并,如果某一行和另一表中的行没有匹配的话,另一个表对应的地方用空值(null)进行填充(MySQL不支持全联结)
SQL联结文氏图
3.case表达式
CASE 表达式是一个标量表达式,它基于条件逻辑来返回一个值。注意,CASE 是一个表达式,而不是一条语句;也就是说,不能用它来控制活动的流程,也不能根据条件逻辑来做某些处理。相反,它只是根据条件逻辑来返回某个值。因为CASE是一个标量表达式,所以它可以支持任何标量表达式(如SELECT、WHERE、HAVING,以及ORDER BY)、CHECK 约束,等等。