目录
一、笛卡尔积
二、表连接
1、内部连接
1.1 等值连接
1.2 非等值连接
2、外部链接
2.1 左外连接-LEFT JOIN
2.2 右外连接-RIGHT JOIN
2.3 全关联-FULL JOIN/UNION
三、子查询
1、嵌套子查询
2、相关子查询
3、insert和select语句添加数据
4、update和select语句(子查询)结合
四、数据库备份与还原
一、笛卡尔积
SELECT * FROM student,class;
观察笛卡尔积的特点:将两张表的数据组合在了一张二维表中,笛卡尔积中有些记录没有意义。
二、表连接
在实际查询应用中,用户所需要的数据并不全在一个表中,可能存在多个表中,这时就需使用多表查询。
在数据库应用中,经常需要从多个相关的表中查询数据,这就需要进行表连接。
1、内部连接
内部连接有以下两种语法形式:
SELECT select_list FROM 表名1,表名2 WHERE 表1.列=表2.列;
或者
SELECT 别名.list FROM 表1 别名1 [INNER] JOIN 表2 别名2 ON 别名1.列=别名2.列;
inner join on 内连接
一般用inner join 或 join 关键字来指定内连接。又可分为等值连接,非等值连接。
1.1 等值连接
是在连接条件中使用比较运算符等于号(=)来比较连接列的列值,其查询结果中列出被连接表中的所有列。
SELECT S.学号,S.姓名,S.性别,S.籍贯,C.班级名称,C.年级FROM 学生信息 S INNER JOIN 班级信息 CON S.班级编号=C.班级编号;
1.2 非等值连接
是在连接条件中使用了除等号外的其它比较运算符,来比较连接列的列值。
案例:查询成绩大于40的学生个人情况,并按照成绩降序排列。
SELECT 学生信息 .学号,学生信息 .姓名,学生信息 .性别,学生信息 .班级编号,成绩表.成绩FROM 学生信息 INNER JOIN 成绩表ON 学生信息 .学号=成绩表.学号WHERE 成绩表.成绩>=40ORDER BY 成绩表.成绩 DESC;
2、外部链接
• 外部连接会返回FROM子句中提到的至少一个表或视图中的所有行。
• 外部连接分为左外部连接、右外部连接
左外部连接对连接条件中左边的表不加限制;
右外部连接对连接条件中右边的表不加限制。
2.1 左外连接-LEFT JOIN
使用关键字LEFT OUTER JOIN 关键字对两个表进行连接,左外连接的查询结果中包含指定左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有找到匹配的行,则结果集中的右表的相对应的位置为NULL。
SELECT * FROM student s LEFT JOIN sc ON s.sno=sc.sno;
2.2 右外连接-RIGHT JOIN
使用RIGHT OUTER JOIN 关键字对两个表进行连接,右外连接是左外连接的反向连接,只不过在查询结果集中包括的是指定右表的所有行。如果右边的某行在左表中没有找到匹配的行,则结果集中的左表的相对应位置为NULL。
SELECT * FROM course c RIGHT JOIN teacher t ON c.tno=t.tno;
2.3 全关联-FULL JOIN/UNION
mysql不支持FULL JOIN ,但是可以用左连接UNION右连接关键字实现全关联.
三、子查询
子查询在其他查询结果的基础上提供了一种有效的方式来表示where子句的条件。
子查询是可以嵌套在 SELECT、INSERT、UPDATE、DELETE 语句中。
子查询的 SELECT 查询总是使用圆括号括起来。
1、嵌套子查询
在MySQL中子查询是可以嵌套使用的,并且可以在一个查询中嵌套任意多个子查询,即一个子查询中还可以包含另一个子查询,这种查询方式称为嵌套子查询。
例: 查询计算机系学生选修了哪些课程
SELECT * FROM sc WHERE sno IN(SELECT sno FROM StudentWHERE Sdept = ‘计算机系’);
例: 查询修了‘c02’课程且成绩高于此课程的平均成绩的学生的学号和成绩。
SELECT Sno , Grade FROM SCWHERE Cno = 'c02‘and Grade > (SELECT AVG(Grade) from SCWHERE Cno = 'c02');
2、相关子查询
相关子查询(单值子查询)
这样的子查询只返回一个值,然后将一列值与查询返回的值进行比较。
例:查询和'静静'在同一个班的学生的信息。
SELECT 学生信息 .学号,学生信息 .姓名,学生信息 .性别,班级信息.班级编号,班级信息 .班级名称,班级信息 .年级FROM 学生信息 INNER JOIN 班级信息ON 学生信息 .班级编号=班级信息.班级编号WHERE 学生信息 .班级编号=(SELECT 班级编号 FROM 学生信息 WHERE 姓名='ff');
3、insert和select语句添加数据
在INSERT语句中使用SELECT子句可以将一个或多个表或视图中的值添加到另一个表中。使用SELECT子句还可以同时插入多行。
INSERT语句中使用SELECT子句的语法形式为:
INSERT [INTO] table_name[(column_list)]SELECT select_list FROM table_name;
通过SELECT语句生成的结果集,再结合INSERT语句,可以把结果集插入到指定的表中,这种方法用于插入的数据不确定(通常多于一条),并且都具有一些特性时。
--拷贝表结构
CREATE TABLE table_bak LIKE table;
--拷贝表数据
CREATE TABLE table_bak_1 AS SELECT * FROM table;
4、update和select语句(子查询)结合
• 例:将计算机系全体学生的成绩加5分。
UPDATE SC SET Grade = Grade + 5WHERE Sno IN(SELECT Sno FROM StudentWHERE Sdept = '计算机系' );
四、数据库备份与还原
数据库热备份工具:mysqldump.exe(数据库在工作中备份)
备份:
mysqldump -h IP地址 -u 用户名 -p 密码 要备份的数据库名>本地电脑路径/数据文件名.sql
还原:
mysql -h IP地址 -u 用户名 -p 密码 数据库名<本地电脑路径/数据文件名.sql
或
use 数据库名;source 本地电脑路径/数据文件名.sql;
数据库冷备份工具:(数据库停止工作进行备份)