目录内容
- 一、连接查询
- 1. 连接查询概述
- 2. 内连接
- 3. 左连接
- 4. 右连接
- 二、自关联
- 三、子查询
- Mysql函数
一、连接查询
1. 连接查询概述
- 内连接:连接两个表时,取的是两个表中都存在的数据。(取交集)
- 左连接:连接两个表时,取的是左表中特有的数据,对于右表中不存在的数据,用null来填充。
- 右连接:连接两个表时,取的是右表中特有的数据,对于左表中不存在的数据,用null来填充。
内连接:
左连接:
右连接:
2. 内连接
语法格式
select * from 表名1 inner join 表名2 on 表1.列=表2.列;
1.查询的是两个表的交集的数据
2.表1的列与表2的列一定是存在关联关系
3.内连接连接时可以连接多个表
案例
-- 例1: 查询学生信息及学生的成绩
select * from students inner join scores on students.studentNo = scores.studentNo;
-- students起别名为stu, scores起别名为sc
select * from students as stu inner join scores as sc on stu.studentNo = sc.studentNo;
-- 起别名可以不写as
select * from students stu inner join scores sc on stu.studentNo = sc.studentNo;
select * from students stu, scores sc where stu.studentNo = sc.studentNo;
-- 例2: 查询课程信息及课程的成绩
select * from courses cs inner join scores sc on cs.courseNo = sc.courseNo;
-- 例3: 查询王昭君的成绩, 要求显示姓名、 课程号、 成绩
select stu.name, sc.courseNo, sc.score from students stu inner join scores sc on
stu.studentNo = sc.studentNo where stu.name = '王昭君';
-- 1、 查询学生信息及学生的课程对应的成绩
select * from students
inner join scores on students.studentNo=scores.studentNo
inner join courses on scores.courseNo=courses.courseNo;
3. 左连接
语法格式
select * from 表1 left join 表2 on 表1.列=表2.列;
左连接查询的是左表特有的数据,对于右表中不存在的数据用null来填充
案例
-- 例1: 查询所有学生的成绩, 包括没有成绩的学生
select * from students stu left join scores sc on stu.studentNo = sc.studentNo
-- 例2:查询所有学生的成绩, 包括没有成绩的学生, 需要显示课程名
select * from students
left join scores on students.studentNo = scores.studentNo
left join courses on scores.courseNo = courses.courseNo
4. 右连接
语法格式
select * from 表1 right join 表2 on 表1.列=表2.列;
右连接查询的是右表特有的数据,对于左表中不存在的数据用null来填充
二、自关联
要通过自关联进行查询时,当前自关联的表当中一定会存在两个相关联的字段
自关联要用别名
语法格式
select * from 表名 as 别名1 inner join 表名 as 别名2 on 别名1.列=别名2.列;
案例
-- 查询出河南省所有的市
select * from areas as a1 inner join areas as a2 on a1.aid=a2.pid where a1.atitle='河南省';
-- 查询出郑州市所有的区
select * from areas as a1 inner join areas as a2 on a1.aid=a2.pid where a1.atitle='郑州市';
-- 查询出河南省所有的市区信息
select * from areas as a1 inner join areas as a2 on a1.aid=a2.pid left join areas as a3 on
a2.aid=a3.pid where a1.atitle='河南省';
三、子查询
指的就是查询语句里面嵌套查询语句
格式:
select 列名 from 表名 where 列名 in(select查询);
子查询的注意事项:
1.where后面的条件要什么,我的子查询就查什么
例:条件要学号,子查询就查学号
2.什么情况有限考虑子查询?
2.1题上给出的条件没有明确的提示结果
例.查询计算机系学生选修了哪些课程? 问:计算机系学生有哪些?
2.2 where后面要用到聚合函数当条件
聚合函数不能直接写,就可以借助查询语句把聚合函数的结果给查出来就OK
成绩大于平均成绩
where grade>(select avg(grade) from sc)
例子:
select 列名 from 表名 where 列名 in(select 列名 from 表名 where 列名 in(select 列名 from 表名 where 条件));
select 列名 from 表名 where 列名 in(select 列名 from 表名 where 条件);
嵌套子查询:指的是子查询中还包含其他的子查询
select(select(select(select)))
相关子查询:指的是子查询的结果有且只有一个值
当insert语句和select语句做结合,就是把查询的结果插入到某一张表中。
格式:
insert into 表名 select 查询语句
update 语句 update 表名 set 列名
where 列名 in(select语句)
删除语句
delete from 表名 where 列名 in(select查询语句)
例︰删除计算机系学生的成绩
delete from sc where sno in(select sno from student where sdept='计算机系');
Mysql函数
字符串函数:
length(字符串)求的是字符串的字节长度
MYSQL函数中一个汉字占3个字节,一个英文占1个字节
char_length(字符串)求的是字符串的长度
mid(原始字符串,截取的开始位置,截取的长度)
数值函数:
round(原始数据,保留的小数位)
round(原始数据)只保留整数部分
least(值1,值2,值3...)求最小的数字
greatest(值1,值2...)求最大的数字
日期时间函数:
now()获取日期和时间
current_date()获取日期
current_time()获取时间
to_days(日期值)将日期转换成总天数
dayofyear(日期值)求该年已过的天数
week(日期值)已过的周数
控制函数︰
if(布尔表达式,参数1,参数2)
if(null,参数1,参数2)
布尔表达式:True Flase 当为真时,为参数1 当为假时,为参数2
为null时,为参数1 否则使用参数2
ifnull(参数1,参数2)
ifnull(null,参数2)