MySQL知识补充

1 复习

1.1 约束

  • 默认约束:default
  • 非空约束:not null
  • 唯一约束:unique
  • 检查约束:check
  • 主键约束:primary key

​ 唯一

​ 非空

​ 可以被从表的外键引用

  • 外键约束:foreign key

​ 可以为空

​ 可以重复

​ 如果有值 此值必须在主表的主键列存在

​ 删除主表记录时 必须保证此记录不被从表引用

  • 自增约束:auto_increment

    只能加给int类型的主键列

1.2 单表查询

SELECT * FROM student; -- 查询所有列
SELECT sid,sname FROM student; -- 查询指定列
SELECT sage+1,MOD(score,3) FROM student;-- 列运算
SELECT * FROM student WHERE sage>10 OR sex="男" AND score BETWEEN 10 AND 30 AND sdy IN(TRUE,FALSE);-- 条件查询
SELECT * FROM student WHERE sage IS NULL OR sname IS NOT NULL;-- 条件查询
SELECT DISTINCT sex FROM student;-- 除去重复行
SELECT * FROM student WHERE sname LIKE "_a%";-- 模糊查询
SELECT CONCAT(sname,"呵呵",sage) FROM student; -- 字符串拼接
SELECT CONCAT(IFNULL(sname,"无名氏"),"呵呵",IFNULL(sage,1)) FROM student; -- null转换
SELECT CONCAT(sname,"呵呵",sage) AS 自我介绍 FROM student; -- 字符串拼接-- 起别名
SELECT SUM(score) 总分,
AVG(score) 参加考试的平均分,
AVG(IFNULL(score,0)) 所有同学的平均分,
MAX(score) 最高分,
MIN(score) 最低分,
COUNT(score) 考试人数
COUNT(*) 总人数
FROM student;-- 聚合函数
SELECT sage,COUNT(*),MAX(score) FROM student GROUP BY sage HAVING sage >20-- 分组
SELECT * FROM  student ORDER BY score DESC,sage ASC;-- 排序
SELECT * FROM student LIMIT 1,6;-- 分页查询
CREATE TABLE stu2 AS SELECT sname,sage FROM student WHERE sex="男";-- 根据结果集创建表

1.3 表与表之间的关系

  • 一对多
在多的一方 定义外键来引用一这一方的主键列即可
  • 多对多
定义一个关系表:定义两列作为联合主键 并且作为外键来分别引用另外两张表的主键
  • 一对一
根据创建顺序或者重要程度区分一个主表和从表
把从表的主键列定义为外键 来引用主表的主键

2 多表查询

一个sql语句查询多张表

2.0 装备工作

DROP TABLE student;
DROP TABLE teacher;
CREATE TABLE teacher(
    tid INT PRIMARY KEY AUTO_INCREMENT,
    tname VARCHAR(10),
    tsex CHAR(1),
    tsubject VARCHAR(10)
);
INSERT INTO teacher VALUES(NULL,"张三","男","java");
INSERT INTO teacher VALUES(NULL,"张三丰","男","c");
INSERT INTO teacher VALUES(NULL,"张无极","女","c++");
INSERT INTO teacher VALUES(NULL,"田七","女","c");
INSERT INTO teacher VALUES(NULL,"赵八","女","c++");
INSERT INTO teacher VALUES(NULL,"赵六","男","java");
INSERT INTO teacher VALUES(7,"fdb9","男","c#");
CREATE TABLE student(
    sid INT PRIMARY KEY AUTO_INCREMENT,
    sname VARCHAR(10),
    sex CHAR(1),
    sage INT,
    score FLOAT(4,1),
    stid INT
);
INSERT INTO student(
               sname,
               sex,
               sage,
               score,
               stid) VALUES(
               SUBSTR(UUID(),1,4),
               IF(RAND()>0.5,"男","女"),
               TRUNCATE(RAND()*8+18,0),
               TRUNCATE(RAND()*100,1),
               TRUNCATE(RAND()*3+2,0)
);
SELECT * FROM student;
SELECT * FROM teacher;

2.1 合并结果集

把两个结果集通过union或者union all 合并为一个结果集
-- 合并结果集
-- 必须满足条件:结果集列数相同  对应的列类型一致
-- 获取全校师生的编号 名字 性别
-- 获取所有学生的编号 名字 性别
SELECT sid,sname,sex FROM student;
SELECT tid,tname,tsex FROM teacher;
-- 以上两个结果集;都是三列 对应的列的数据类型一致  这样的结果集就可以合并
-- 重复行只显示一次
SELECT sid 编号,sname 名字,sex 性别 FROM student
UNION
SELECT tid,tname,tsex FROM teacher;
-- 不去除重复行
SELECT sid 编号,sname 名字,sex 性别 FROM student
UNION ALL
SELECT tid,tname,tsex FROM teacher;

2.2 连接查询

from后面有多张表:为连接查询
-- 笛卡尔积
-- 行:student行数*teacher行数
-- 列:student列数+teacher列数
SELECT * FROM student AS s,teacher AS t;
-- 通过主表的主键值=从表的外键值 来删除垃圾的笛卡尔积行
SELECT * FROM student AS s,teacher AS t WHERE s.stid=t.tid;

内连接

-- 内连接
-- 获取学生及其老师信息
SELECT * FROM student;
SELECT * FROM teacher;
-- 内连接的方言格式:
-- select 列 from 表1,表2 where 条件;
SELECT * FROM student AS s,teacher AS t WHERE s.stid=t.tid;
-- 内连接的标准格式:
-- select 列 from 表1 inner join 表2 on 条件;
SELECT * FROM student AS s INNER JOIN teacher AS t ON s.stid=t.tid;

外连接

--  外连接
--  保证一张表的完整性
--  获取所有学生及其老师信息
--  左外连接: 保证左边表的完整性 
--  格式:select 列 from 表1 left join 表2 on 条件;
SELECT * FROM student AS s LEFT JOIN teacher AS t ON s.stid=t.tid;
SELECT * FROM teacher AS t RIGHT JOIN student AS s ON s.stid=t.tid;
--  右外连接:保证右边表的完整性 
--  格式:select 列 from 表1 right join 表2 on 条件;
SELECT * FROM student AS s RIGHT JOIN teacher AS t ON s.stid=t.tid;

2.3 子查询

-- 子查询
-- select中嵌套select

-- 子select在from后面作为一张表
-- 获取学生和老师都为女的的师生信息
-- 通过内连接实现
SELECT * FROM student s,teacher t WHERE s.stid=t.tid AND s.sex="女" AND t.tsex="女";
-- 通过子查询实现
SELECT * FROM student WHERE sex="女"; -- 获取女同学
SELECT * FROM teacher WHERE tsex="女"; -- 获取女老师
-- 把以上两个结果集作为两个表来查询
SELECT * 
FROM 
     (SELECT * FROM student WHERE sex="女") s,
     (SELECT * FROM teacher WHERE tsex="女") t
WHERE s.stid=t.tid;

-- 子select在select后面作为结果集的列
SELECT   *,
  (SELECT AVG(IFNULL(score,0)) FROM student) 平均分,
  (score-(SELECT AVG(IFNULL(score,0)) FROM student)) 平均分差距
FROM student;


-- 获取最高分学生的信息
-- 子select在where后面作为条件
SELECT *  FROM student WHERE score=(SELECT MAX(score) FROM student);

/*子select作为条件可以使用的运算符/关键字:> >= < <= != */ 
SELECT * FROM student WHERE sage > (SELECT sage FROM student WHERE sid=1);-- 获取比1号学生年龄大的所有学生的信息
SELECT * FROM student WHERE stid=(SELECT tid FROM teacher WHERE tname="张三");-- 获取张三老师教的所有学生的信息
/*子select作为条件可以使用的运算符/关键字:in、not in */
-- 获取与女生分数相同的男生的信息
SELECT score FROM student WHERE sex="女";-- 获取女生的所有分数
SELECT * FROM student WHERE sex="男"  AND score IN(SELECT score FROM student WHERE sex="女"); -- 获取男生的信息
-- 获取与所有女生分数不同的男生的信息
SELECT * FROM student WHERE sex="男"  AND score NOT IN(SELECT score FROM student WHERE sex="女");

/*子select作为条件可以使用的运算符/关键字:all、any*/
-- 获取比所有20岁的学生分数都高的学生的信息
-- 获取所有20岁学生的分数
SELECT MAX(score) FROM student WHERE sage=20;
SELECT * FROM student WHERE score > (SELECT MAX(score) FROM student WHERE sage=20);
SELECT * FROM student WHERE score > ALL (SELECT score FROM student WHERE sage=20);
-- 获取比任意一个20岁的学生分数高的学生的信息
SELECT * FROM student WHERE score > (SELECT MIN(score) FROM student WHERE sage=20) AND sage!=20;
SELECT * FROM student WHERE score > ANY (SELECT score FROM student WHERE sage=20) AND sage!=20;

-- 获取所有学生的信息 并附加最高分
SELECT  s.*,ms.*
FROM student s,
     (SELECT MAX(score) FROM student) ms;
     
SELECT  s.*,(SELECT MAX(score) FROM student)
FROM student s;

3 实现数据库备份和恢复

方式1:通过数据库客户端软件即可实现

image

方式2:通过mysqldump和source分别实现备份和恢复

数据备份

  • 打开dos命令行:windows+r

  • 输入mysqldump的命令:mysqldump -uroot -proot 数据库名 > 备份的文件

    备份文件必须先创建好空的文件 文件后缀名为.sql

image

数据恢复

  • 创建一个空的数据库 并制定编码集

  • 通过source命令实现把备份文件读入到当前数据库中

image

posted @ 2021-09-25 22:26  RenVei  阅读(30)  评论(0编辑  收藏  举报