mysql

数据约束

添加主键约束的方式

1.直接写在某一列的后面
        CREATE TABLE stu(
    sid        CHAR(6) PRIMARY KEY,
    sname    VARCHAR(20),
    age        INT,
    gender    VARCHAR(10) 
        );


2.专门去指定某一列为主键列
        CREATE TABLE stu(
    sid        CHAR(6),
    sname    VARCHAR(20),
    age        INT,
    gender    VARCHAR(10),
    PRIMARY KEY(sid)
        );

修改表时指定主键
ALTER TABLE stu ADD PRIMARY KEY(sid);

删除主键
ALTER TABLE stu DROP PRIMARY KEY;

主键自增长(AUTO_INCREMENT)

1.创建表时进行添加
      CREATE TABLE stu(
    sid INT PRIMARY KEY AUTO_INCREMENT,
    sname    VARCHAR(20),
    age        INT,
    gender    VARCHAR(10)
      );

2.修改表时设置主键自增长:
ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;

修改表时删除主键自增长:
ALTER TABLE stu CHANGE sid sid INT;

唯一约束 unique(不重复 [ 但是可以为空])

  CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname    VARCHAR(20) UNIQUE,
    对sname列设置了唯一约束
age        INT,
gender    VARCHAR(10)
  );

非空约束:

  CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
    主键
    自增长
sname    VARCHAR(20) NOT NULL,
    非空约束
    对sname列设置了非空约束
age        INT,
gender    VARCHAR(10)

默认值约束:

  CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname    VARCHAR(20) NOT NULL,    
age        INT,
gender    VARCHAR(10) default ‘男’
    对gender列设置了默认约束
    不写性别就给一个默认值【男】

 关系模型

1.数据库表中的多对一关系,只需要在多方使用一个独立的列来引用1方的主键即可
2.数据库一对一关系
在表中建立一对一关系比较特殊,需要让其中一张表的主键,即是主键又是外键。
3.数据库多对多关系
在表中建立多对多关系需要使用中间表,即需要三张表,在中间表中使用两个外键,分别引用其他两个表的主键。

外键约束:foreign key

想给那个表设置外键约束,那就在这个表中添加外键

数据库表中的多对一关系

emp.deptno必须在dept表中是真实存在
  create talbe emp (
    empno int primary key,
    ...
    deptno int,
    CONSTRAINT fk_emp FOREIGN KEY(mgr) REFERENCES 
    emp(empno)  
  );



  修改表时添加外键约束
  ADD CONSTRAINT fk_emp_deptno FOREIGN KEY(deptno) REFERENCES dept(deptno);


  修改表时删除外键约束
  DROP FOREIGN KEY fk_emp_deptno;/*约束名称*/

数据库一对一关系

从表的主键即是外键

数据库多对多关系

  在表中建立多对多关系需要使用中间表,即需要三张表,在中间表中使用两个外键,分别引用其他两个表的主键。

/*学生表*/
      create table student(
        sid int PRIMARY KEY,
        ...
      );
/*老师表*/
      create table teacher(
        tid int PRIMARY KEY,
        ...
      );
/*中间表*/
      create table stu_tea(
        sid int,
        tid int,
    CONSTRAINT fk_stu_tea_sid FOREIGN KEY(sid) REFERENCES student(sid),
    CONSTRAINT fk_stu_tea_tid FOREIGN KEY(tid) REFERENCES teacher(tid)
      );

联合主键(复合主键):一张表中存在两个或两个以上的主键列

不建议大家这么去写,我们可以使用一个主键+n个唯一约束列,来代替

多表查询

笛卡尔积:

select * from emp,dept;

同时查询多张表,将行数相乘,完全多对多的关系

内连接

* 内连接查询出的所有记录都满足条件。

方式1
select e.ename,e.sal,d.loc from emp e INNER JOIN dept d ON e.deptno = d.deptno;

方式2
select e.ename,e.sal,d.loc from emp e ,dept d where e.deptno = d.deptno;

外连接

左外连接  以左表为准
左外:SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
select * from 
emp e LEFT OUTER JOIN dept d 
on e.deptno = d.deptno;

左表记录无论是否满足条件都会查询出来,而右表只有满足条件才能出来。左表中不满足条件的记录,右表部分都为NULL

右外连接  以右表为准
右外:SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx

select * from 
emp e1 RIGHT OUTER JOIN dept d1
on e1.deptno = d1.deptno;
右表记录无论是否满足条件都会查询出来,而左表只有满足条件才能出来。右表不满足条件的记录,其左表部分都为NULL

子查询

any,all关键字必须与一个比较操作符一起使用

select * from emp where sal >all (select sal from emp where deptno = 20);

all的意思是“对于子查询返回的列中的所有值,如果比较结果为true,则返回true”

any关键词可以理解为“对于子查询返回的列中的任一数值,如果比较结果为true

数据库的备份及恢复

1. 数据库导出SQL脚本

备份数据库内容,并不是备份数据库!
> mysqldump –u用户名 –p密码 数据库名>生成的脚本文件路径
> 例如:mysqldump -uroot -p123 mydb1>C:mydb1.sql (与mysql.exe和mysqld.exe一样, 都在bin目录下)
> 注意,不要打分号,不要登录mysql,直接在cmd下运行
> 注意,生成的脚本文件中不包含create database语句

2. 执行SQL脚本

第一种方式
> mysql -u用户名 -p密码 数据库<脚本文件路径
> 例如:
* 先删除mydb1库,再重新创建mydb1库
* mysql -uroot -p123 mydb1<C:mydb1.sql
> 注意,不要打分号,不要登录mysql,直接在cmd下运行
第二种方式
> 登录mysql
> source SQL脚本路径
> 例如:
* 先删除mydb1库,再重新创建mydb1库
* 切换到mydb1库
* source c:mydb1.sql
恢复数据库信息

原文地址:https://www.cnblogs.com/taozizainali/p/11043842.html