MySQL数据库技术

十、多表查询

1.分页查询

语法:limit 开始的索引,每页查询的条数
-- 公式:开始的索引=当前的页码-1 * 每页的条数-- 每页显示3条数纪录
select * from 表名 limit 0,3; -- 第一页
select * from 表名 limit 3,3; -- 第二页-- 注意:起始位置从0索引开始

2.多表查询

概念

合并多个数据表的信息查询,又称为连接查询

-- 案例表
-- 创建班级表
CREATE TABLE class(cno INT PRIMARY KEY,-- 班级编号cname VARCHAR(50),-- 班级名称address INT -- 班级所在教室号
)
-- 学生表
CREATE TABLE student(sno INT PRIMARY KEY,-- 学号sname VARCHAR(50),-- 姓名job VARCHAR(50),-- 职位mgr INT,-- 上级的学号score FLOAT(5,2), -- 成绩cno INT, -- 班级CONSTRAINT student_fk FOREIGN KEY(cno) REFERENCES class(cno)
)
-- 成绩等级表
CREATE TABLE scorerank(scorelow INT,scorehigh INT,rank VARCHAR(50)
)CHARACTER SET utf8
INSERT INTO scorerank VALUES(260,269,'普通');
INSERT INTO scorerank VALUES(270,279,'良好');
INSERT INTO scorerank VALUES(280,289,'优秀');
INSERT INTO scorerank VALUES(290,300,'杰出');INSERT INTO class VALUES(1,'classone',101);
INSERT INTO class VALUES(2,'classtwo',102);
INSERT INTO class VALUES(3,'classthree',103);
INSERT INTO class VALUES(4,'classfour',104);SELECT * FROM class;
SELECT * FROM student;INSERT INTO student VALUES(1801,'tom','banzhang',NULL,272,1);
INSERT INTO student VALUES(1802,'rose','fubanzhang',1801,265,2);
INSERT INTO student VALUES(1803,'jack','fubanzhang',1801,274,1);
INSERT INTO student VALUES(1804,'bob','math-kdb',1808,279,1);
INSERT INTO student VALUES(1805,'james','chinese-kdb',1808,267,3);
INSERT INTO student VALUES(1806,'george','english-kdb',1808,280,1);
INSERT INTO student VALUES(1807,'curry','mzuzhang',1804,270,2);
INSERT INTO student VALUES(1808,'fox','xuexiweiyuan',1802,282,2);
INSERT INTO student VALUES(1809,'simons','czuzhang',1805,270,1);
INSERT INTO student VALUES(1810,'love','luren',1807,262,3);
INSERT INTO student VALUES(1811,'tt','luren',1807,270,3);
分类

内连接

外连接

自连接

交叉连接

-- 案例:查询所有学生名和班级名,涉及到两张表
select sname,cname from student,class;

问题分析:

笛卡儿积,出现多余没用的数据

解决代码:

select sname,cname from student,class where student.cno = class.cno;--注意:如果解决笛卡尔积现象,多表查询的规定,多表查询的条件是至少不能小于表的个数-1,加了一个条件笛卡尔积就会消失
所以两张表至少有一个条件,三张表至少有两个条件
自连接查询

是指同一张表的连接查询

-- 查询学生的上级的姓名
SELECT s1.`sname`,boss.`sname` bossname FROM student s1,student boss WHERE s1.`mgr`=boss.`sno`;
内连接

等值连接、不等值连接、自然连接

-- 等值连接 inner join  on 显示内连接,隐式内连接
SELECT sname,cname  FROM student INNER JOIN class ON student.`cno`=class.`cno`;-- 显示内连接
SELECT sname,cname FROM student,class WHERE student.cno = class.cno; -- 隐式内连接-- 不等值连接,范围型,添加between and-- 自然连接: natural join 所有符合条件的结果返回,自动连接符合的条件进行查询
SELECT * FROM student NATURAL JOIN class;
外连接

左外连接、右外连接

-- 左外连接
语法:select 字段列表 from 表1 left join 表2 条件  左表为主
SELECT s.`sname`,c.`cname`,s.`id` FROM student s LEFT JOIN class c ON s.`cno` = c.`cno`;-- 右外连接,和左外类似
SELECT s.`sname`,c.`cname`,s.`id` FROM student s RIGHT JOIN class c ON s.`cno` = c.`cno`;
交叉连接

就是笛卡尔积 cross join

SELECT COUNT(*) FROM student CROSS JOIN class;

3.子查询

嵌套查询,select语句中包含select

如果一条语句中包含两个或者以上的select,那么这样的语句叫子查询

子查询出现的位置:

​ 1.where后,作为条件的一部分

​ 2.from后,作为被查下的一张表

当查询出现在where后作为条件时,还可以使用关键字:

​ all

​ any

子查询结果集的形式:

单行单列、单行多列、多行单列、多行多列

-- 单行单列:指返回一行一列数据的子查询语句
-- 案例:成绩大于bob的同学,第一步查询bob的成绩,第二步查询高于bob成绩的同学
SELECT score FROM student WHERE sname='bob';
SELECT * FROM student WHERE score>(SELECT score FROM student WHERE sname='bob');-- 案例2:与tom在一个班级的同学
SELECT cno FROM student WHERE sname='tom';
SELECT cno,sname FROM student WHERE cno=(SELECT cno FROM student WHERE sname='tom');-- 多行单列:返回多行数据的子查询
-- 案例:查询高于三班所有人成绩的同学,其中三班所有人成绩就是子查询
SELECT score FROM student WHERE cno=3;
SELECT * FROM student WHERE score > ALL(SELECT score FROM student WHERE cno=3);
-- 案例2:查询比三班任意一个人成绩高的同学名字,成绩,班级号
SELECT * FROM student WHERE cno=3;
SELECT sname,score,cno FROM student WHERE score > ANY(SELECT score FROM student WHERE cno=3);-- 单行多列的查询
-- 案例:查询与tt班级和职务都相同的同学
SELECT job,cno FROM student WHERE sname='tt';
SELECT  * FROM student WHERE (job,cno) = (SELECT job,cno FROM student WHERE sname='tt');-- 多行多列的查询
--案例:查询出高于自己班级平均成绩的同学信息
-- 第一步:查询出各个班级的平均成绩和班级号
SELECT AVG(score),cno FROM student GROUP BY cno;
-- 第二步:把上面的查询作为一张子表查询
SELECT s1.`sname`,s1.`score`,s1.`cno`,s2.myscore FROM student s1,(SELECT AVG(score) myscore,cno FROM student GROUP BY cno) s2WHERE s1.`cno`=s2.cno AND s1.`score`>s2.myscore;

十一、MySQL事务处理

1.TCL语言:

Transanction Control Language 事务控制语言

事务:一个或一组SQL语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行

2.事务有哪些特点:

事物的ACID属性: