SQL进阶


备份与恢复

1.数据库导出SQL脚本

MYSQLDUMP -u用户名 -p密码 数据库>生成脚本的文件路径

注:不要在mysql中使用,直接在cmd中使用,且后面没有分号

2.数据库恢复

mysql -u用户名 -p密码 数据库<脚本的文件路径

  前提:必须新建一个同名的空的数据库,然后再退出mysql,在cmd中使用

  注:依旧不要在后面加上分号

SOURCE 地址

  前提:必须新建一个同名的空的数据库,再USE这个数据库,然后进行数据库恢复操作

  注:必须用分号


约束

主键约束

主键:一行记录的主要纲领,是它的唯一标识,例如人的主键就是身份证号。

主键特点:非空,唯一,被引用(学习外键时用到,只有主键能被引用)

指定主键的3种方式;

  1.在想指定为主键的列的最后加上PRIMARY KEY

   2.在创建表的语句的最后加上 PRIMARY KEY(列名)

  3.在创建完表之后,对表进行修改

  ALTER TABLE 表名

  ADD PRIMARY KEY(列名);

   4.删除主键

  对表进行修改,删除主键

  由于表中主键只有一个,所以不需要指定删除的主键的名称

可以看到,主键内容不能为空

主键也不能重复


主键自增长

主键要求不能重复,为了让它不重复,我们使用主键自增长,不需要我们在插入时指定主键,他会自动增长

注:主键自增长只能运用在整数列上,字符串列不能自增长。

格式:在创建表时,指定主键,在指定的主键后面加上AUTO_INCREMENT

 通常情况下我们插入第一个数据需要指定主键的值从而确定主键的一个初始值,之后可以不指定主键的值,他会自增长。


非空约束和唯一约束

我们知道主键是不能为空的,同时也不能重复,在实际应用中,很多列的值也不能为空,不能重复。

非空约束格式:在创建表的时候,在需要加上非空约束的列名后面加上 NOT NULL

唯一约束格式:在创建表的时候,在需要加上唯一约束的列名后面加上UNIQUE

注:一个列可以同时加上非空约束和唯一约束,当然,虽然它具备了主键的这两个特性,但是它不能作为主键,因为主键具有独特的第三个特性:被引用。只有主键才能被引用。

非空约束示例:

条件约束示例:


概念模型

概念模型分为对象模型和关系模型。

对象模型:JAVA中的类。可以双向关联,引用的是对象,而不是一个主键。

关系模型:数据库中的表。只能多方引用一方,而且引用的是主键,而不是一整行记录。


外键约束

外键的四个特点

  *外键必须是另一个表的主键的值

  *外键可以重复

  *外键可以为空

  *一张表中可以有多个外键

建立一个外键约束

  首先我们有一个具有主键的表。如例子中的部门表,其中部门编号是主键

   接下来我们创建一个新表,以部门的主键为外键

   解释:EMP表中,设置外键为DNO,它和DEPT表中的DEPTNO相联系。FK_EMP_DEPT表示的是两个表相互联系的名称

  如图所示,外键可以重复,可以为空,但是不可以是一个非原表中的值。

  如图中的60号部门在原表中不存在,所以受到约束,不能插入。

我们也可以选择用修改表的方式为表添加一个外键

  格式:

  ALTER 表名

  ADD CONSTRAINT 约束名 FOREIGN KEY(外键列名) REFERENCES 连接的表的名字(连接的表的主键名); 


 一对一关系

关键:因为要让表中所有的值都与另外一个表一对一,所以所有的表的外键必须唯一。

一个有效的约束方式是将表中的主键就当作自己的外键,从而本表的外键就是一个唯一的值了

例子:

我们先建立一个丈夫表,其中HID是主键

 接下来我们创建一个妻子表,由于丈夫和妻子必须一对一,所以设置妻子的主键WID是她本身的外键,从而实现一对一

 

此时我们再插入一个WIFE,令她的WID为1,报错,原因是WID作为主键必须唯一,同时在逻辑上也实现了一个丈夫只有一个妻子的需求

 此时我们在插入一个WIFE,令她的WID为4,也报错,原因是HASBAND表中没有HID值为4,而WID作为外键不能有原表中不存在的值,这在逻辑上又实现了一个妻子必须又一个丈夫的需求


多对多关系

关键:使用三张表,其中一张表是中间表,有两个外键,分别对应另外两个表,从而使另外的两个表实现多对多关系

 例子:

建立一个学生表,一个老师表,分别设置他们的ID都是各自的主键。再建立一个中间表,表中有两列元素,分别是SID和TID,二者都是中间表的外键,与学生表和老师表相连

现在我们插入数据:

 

现在我们将多对多的关系传入到中间表中:

 在本例中通过传入两个外键SID和TID实现多对多的关系。


 多表查询

多表查询有三种类型

1.合并结果集

2.连接查询

3.子查询

合并结果集

要求:合并的两个表的列类型和列数相同

例子:

先创建两张表,表的列类型和列数量相同

 向其中插入数据

 这时我们使用合并结果集,如果不需要删除相同数据,格式为在两个查询中间加上UNION ALL

显示的列名是先查询的那一张表的列名,两张表的所有元素都会合并起来。

如果需要删除相同数据,格式为在两个查询中间加上UNION

显示的列名依旧是先查询的表的列名,两张表的完全相同的行会被删除掉,只留一个。

 注意:列的数量不同或者列类型不同都会造成合并失败从而报错。

连接查询

连接查询是一次查询多张表,分为:

1.内连接

2.外连接

3.自然连接

内连接

内连接有三种格式,分别为mysql自带格式,标准格式,自带格式

mysql自带格式

  SELECT * FROM 表1,表2;

  得到的结果的匹配方式是表1的每一行都和表2的所有行进行一次连接,因此得到的查询结果的行数是两张表的行数相乘之积。

  然而这种情况得到了很多无用的结果,很多行都是无意义的。

   为了解决过多的无用数据,我们要加上条件。

  比如这样,让两张表的相关联数据相等,就可以删除掉很多无关紧要的数据。

  有时,我们也可以指定需要查询的两个不同表的列,需要查询哪几张表的内容,就合并哪几张表。

   

  我们也可以为表起别名,从而更加方便我们的使用,一旦为表起了别名,这个名字可以到处使用。

   

 标准格式

  SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.XXX=别名2.XXX;

   尽可能使用标准格式而非mysql格式,因为如果更换数据库,改写sql语句会很麻烦。

自然格式

  SELECT * FROM 表1 别名1 NATURAL JOIN 表2 别名2;

  数据库会自动连接两张表,不需要加条件,数据库会自动寻找两张表中列名相同的列,然后进行匹配。

外连接

外连接有一主一次,左(右)为主,主表中的所有行,无论是否满足条件,都要打印出来。当不满足条件时,右(左)表部分用NULL来补位

格式

SELECT  列 FROM 左表 LEFT OUTER JOIN 右表 ON 条件;

SELECT  列 FROM 左表 RIGHT OUTER JOIN 右表 ON 条件;

左表为主演示:

 右表为主演示:

 

 还有一种外连接叫全外查询,但是mysql不支持这种操作,但是我们可以用UNION合并结果集来实现全外查询。

子查询

子查询就是查询中包含着查询,子查询出现的位置可以是WHERE后作为条件出现,也可以是FROM后作为表出现

例如:查询公司中薪水最高的员工,就是在WHERE后作为条件出现

SELECT * FROM EMP WHERE SALARY=MAX(SALARY);

这种语句会报错,原因是聚合函数不能放在条件里,那么我们就需要用到子查询。

SELECT * FROM EMP WHERE SALARY=(SELECT MAX(SALARY) FROM EMP);

FROM后作为表出现的例子可以是多次查询,在第一次查询后得到的表中再次进行查询。