MySQL二

来源:互联网 发布:linux 分配权限 编辑:程序博客网 时间:2024/05/21 06:16

约束

主键:非空,唯一,被引用

  • 创建表时指定主键的两种方式:
  CREATE TABLE stu(    sid     CHAR(6) PRIMARY KEY,    sname   VARCHAR(20),    );

指定sid列为主键列,即为sid列添加主键约束

    CREATE TABLE stu(    sid     CHAR(6),    sname   VARCHAR(20),    PRIMARY KEY(sid)    );

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

  • 非空约束:在定义时,在列的结构类型后面加上NOT NULL
  • 唯一约束:在定义时,在列的结构类型后面加上 NOT NULL UNIQE
  • 主键自增长
    -因为主键列的特性是:必须唯一、不能为空,所以我们通常会指定主键类为整型,然后设置其自动增长,这样可以保证在插入数据时主键列的唯一和非空特性。
    -创建表时指定主键自增长
  CREATE TABLE stu(        sid INT PRIMARY KEY AUTO_INCREMENT,        gender  VARCHAR(10)  );
  • 修改表时设置主键自增长:
    ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;

概念模型

对象模型:可以双向关联,而且引用的是对象,而不是一个主键!
关系模型:只能多方引用一方,而且引用的只是主键,而不是一整行记录。

外键约束

  • 外键必须是另一表的主键的值(外键要引用主键!)
  • 外键可以重复
  • 外键可以为空
  • 一张表中可以有多个外键!
    语法:CONSTRAINT 约束名称 FOREIGN KEY(外键列名) REFERENCES 关联表(关联表的主键)
    创建表时指定外键约束
  create talbe emp (    empno int primary key,    ...    deptno int,    CONSTRAINT fk_emp FOREIGN KEY(mgr) REFERENCES emp(empno)    );
  • 修改表时添加外键约束
  ALERT TABLE emp  ADD CONSTRAINT fk_emp_deptno FOREIGN KEY(deptno) REFERENCES dept(deptno);
  • 修改表时删除外键约束
    ALTER TABLE emp
    DROP FOREIGN KEY fk_emp_deptno;

数据库一对一关系

  • 需要让其中一张表的主键,即是主键又是外键。
    create table husband(
    hid int PRIMARY KEY,

    );
    create table wife(
    wid int PRIMARY KEY,

    ADD CONSTRAINT fk_wife_wid FOREIGN KEY(wid) REFERENCES husband(hid)
    );
    从表的主键即是外键!

数据库多对多

  • 在表中建立多对多关系需要使用中间表,即需要三张表,在中间表中使用两个外键,分别引用其他两个表的主键。
create table student(    sid int PRIMARY KEY,    ...  );create table teacher(    tid int PRIMARY KEY,    ...  );create table stu_tea(    sid int,    tid int,    ADD CONSTRAINT fk_stu_tea_sid FOREIGN KEY(sid) REFERENCES student(sid),    ADD CONSTRAINT fk_stu_tea_tid FOREIGN KEY(tid) REFERENCES teacher(tid)  );

数据库的备份与恢复.

  • 数据库导出SQL脚本(备份数据库内容,并不是备份数据库!)
    mysqldump –u用户名 –p密码 数据库名>生成的脚本文件路径
    • mysqldump -uroot -p123 mydb1>C:\mydb1.sql
      不要打分号,不要登录mysql,直接在cmd下运行,生成的脚本文件中不包含create database语句
  • 执行SQL脚本
    第一种方式
    mysql -u用户名 -p密码 数据库<脚本文件路径
    例如:
    *mysql -uroot -p123 mydb1<C:\mydb1.sql
    第二种方式
    登录mysql
    source SQL脚本路径
    例如:
    • 先删除mydb1库,再重新创建mydb1库
    • 切换到mydb1库
    • source c:\mydb1.sql
      mysqldump -uroot -p123 mydb3>c:/a.sql –> 备份
      mysql -uroot -p123 mydb3<c:/a.sql --> 恢复
      source c:/a.sql –> 恢复

多表查询

  • 合并结果集
    要求被合并的表中,列的类型和列数相同
    UNION,去除重复行
    UNION ALL,不去除重复行
    SELECT * FROM cd
    UNION ALL
    SELECT * FROM ab;

连接查询

  • 分类
    内连接
    外连接:

    • 左外连接
    • 右外连接
    • 全外连接(MySQL不支持)
      自然连接(属于一种简化方式)
  • 内连接
    如果两张表有外键关系,可以使用内连接

    • 方言:SELECT * FROM 表1 别名1, 表2 别名2 WHERE 别名1.xx=别名2.xx
    • 标准:SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.xx=别名2.xx(平时按这个格式写)
    • 自然:SELECT * FROM 表1 别名1 NATURAL JOIN 表2 别名2(了解)
  • 外连接
    • 左外:SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
      左表记录无论是否满足条件都会查询出来,而右表只有满足条件才能出来。左表中不满足条件的记录,右表部分都为NULL
    • 右外:SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
      右表记录无论是否满足条件都会查询出来,而左表只有满足条件才能出来。右表不满足条件的记录,其左表部分都为NULL
    • 全链接:可以使用UNION来完成全链接

子查询:

  • 单行单列:SELECT * FROM 表1 别名1 WHERE 列1 [=、>、<、>=、<=、!=] (SELECT 列 FROM 表2 别名2 WHERE 条件)
  • 多行单列:SELECT * FROM 表1 别名1 WHERE 列1 [IN, ALL, ANY] (SELECT 列 FROM 表2 别名2 WHERE 条件)
  • 单行多列:SELECT * FROM 表1 别名1 WHERE (列1,列2) IN (SELECT 列1, 列2 FROM 表2 别名2 WHERE 条件)
  • 多行多列:SELECT * FROM 表1 别名1 , (SELECT ….) 别名2 WHERE 条件
0 0
原创粉丝点击