mysql数据库(二)

一、完整性约束

        完整性约束是为了表的数据的正确性!如果数据不正确,那么一开始就不能添加到表中。

    1.主键

        当某一列添加了主键约束后,那么这一列的数据就不能重复出现。这样每行记录中其主键列的值就是这一行的唯一标识。例如学生的学号可以用来做唯一标识,而学生的姓名是不能做唯一标识的,因为学习有可能同名。

主键列的值不能为NULL,也不能重复!

  指定主键约束使用PRIMARY KEY关键字

    创建表:定义列时指定主键

CREATE TABLE stu(
		sid	    CHAR(6) PRIMARY KEY,
		sname	VARCHAR(20),
		age		INT,
		gender	VARCHAR(10) 
);

    创建表:定义列之后独立指定主键

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;
    2.主键自增长

        MySQL提供了主键自动增长的功能!当主键设置为自动增长后,在没有给出主键值时,主键的值会自动生成,而且是最大主键值+1,也就不会出现重复主键的可能了。主键必须是整型才可以自增长。

        关键字:AUTO_INCREMENT

    创建表时设置自增长:

CREATE TABLE stu(
		sid INT PRIMARY KEY AUTO_INCREMENT,
		sname	VARCHAR(20),
		age		INT,
		gender	VARCHAR(10)
);

    修改表时设置自增长:

ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;

    修改表时删除自增长:

ALTER TABLE stu CHANGE sid sid INT;
    3.非空

        指定非空约束的列不能没有值,也就是说在插入记录时,对添加了非空约束的列一定要给值;在修改记录时,不能把非空列的值设置为NULL。

        关键字:NOT NULL

    指定非空约束:

CREATE TABLE stu(
		sid INT PRIMARY KEY AUTO_INCREMENT,
		sname VARCHAR(10) NOT NULL,
		age		INT,
		gender	VARCHAR(10)
);

        当为sname字段指定为非空后,在向stu表中插入记录时,必须给sname字段指定值,否则会报错。

    4.唯一

        还可以为字段指定唯一约束!当为字段指定唯一约束后,那么字段的值必须是唯一的。这一点与主键相似!

        关键字:UNIQUE

    指定唯一约束

CREATE TABLE tab_ab(
	sid INT PRIMARY KEY AUTO_INCREMENT,
	sname VARCHAR(10) UNIQUE
);

         当两次插入相同的名字时,MySQL会报错!

    5.外键

        主外键是构成表与表关联的唯一途径!

        外键是另一张表的主键!例如员工表与部门表之间就存在关联关系,其中员工表中的部门编号字段就是外键,是相对部门表的外键。

         * 外键必须是另一表的主键的值(外键要引用主键!)

         * 外键可以重复

         * 外键可以为空

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

        语法:CONSTRAINT 约束名称 FOREIGN KEY(外键列名) REFERENCES 关联表(关联表的主键) 

创建t_user表,指定uid为主键列:

CREATE TABLE t_user(
	uid	INT PRIMARY KEY AUTO_INCREMENT,
	uname	VARCHAR(20) UNIQUE NOT NULL
);

创建t_section表,指定sid为主键列,u_id为相对t_user表的uid列的外键:

CREATE TABLE t_section(
		sid	INT PRIMARY KEY AUTO_INCREMENT,
		sname	VARCHAR(30),
		u_id	INT,
		CONSTRAINT fk_t_user FOREIGN KEY(u_id) REFERENCES t_user(uid)
);

修改t_section表,指定u_id为相对t_user表的uid列的外键:

ALTER TABLE t_section 
ADD CONSTRAINT fk_t_user 
FOREIGN KEY(u_id) 
REFERENCES t_user(uid);

修改t_section表,删除u_id的外键约束:

ALTER TABLE t_section
DROP FOREIGN KEY fk_t_user;
    6.数据库中表与表的关系

        (1)一对多

                在多的一方创建外键约束。

        (2)一对一

                  在表中建立一对一关系比较特殊,需要让其中一张表的主键,即是主键又是外键。

        (3)多对多

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

二、编码

    1.查看MySQL编码

        SHOW VARIABLES LIKE 'char%';


        因为当初安装时指定了字符集为UTF8,所以所有的编码都是UTF8。

        character_set_client:你发送的数据必须与client指定的编码一致!!!服务器会使用该编码来解读客户端发送过来的数据;

        character_set_connection:通过该编码与client一致!该编码不会导致乱码!当执行的是查询语句时,客户端发送过来的数据会先转换成connection指定的编码。但只要客户端发送过来的数据与client指定的编码一致,那么转换就不会出现问题;

        character_set_database:默认编码,创建数据库时,如果没有指定编码,默认使用database编码;

        character_set_server:MySQL服务器默认编码;

        character_set_results:响应的编码,即查询结果返回给客户端的编码。这说明客户端必须使用result指定的编码来解码;

    2.控制台编码

        修改character_set_client、character_set_results、character_set_connection为GBK,就不会出现乱码了。但其实只需要修改character_set_client和character_set_results。

        控制台的编码只能是GBK,而不能修改为UTF8,这就出现一个问题。客户端发送的数据是GBK,而character_set_client为UTF8,这就说明客户端数据到了服务器端后一定会出现乱码。既然不能修改控制台的编码,那么只能修改character_set_client为GBK了。

服务器发送给客户端的数据编码为character_set_result,它如果是UTF8,那么控制台使用GBK解码也一定会出现乱码。因为无法修改控制台编码,所以只能把character_set_result修改为GBK。

        修改character_set_client变量:set character_set_client=gbk;

        修改character_set_results变量:set character_set_results=gbk;

        设置编码只对当前连接有效,这说明每次登录MySQL提示符后都要去修改这两个编码,但可以通过修改配置文件来处理这一问题:配置文件路径:MySQL路径下的my.ini文件


    3.MySQL工具

        使用MySQL工具是不会出现乱码的,因为它们会每次连接时都修改character_set_client、character_set_results、character_set_connection的编码。这样对my.ini上的配置覆盖了,也就不会出现乱码了。

三、备份和恢复数据

    1.生成SQL脚本

        在控制台使用mysqldump命令可以用来生成指定数据库的脚本文本,但要注意,脚本文本中只包含数据库的内容,而不会存在创建数据库的语句!所以在恢复数据时,还需要自已手动创建一个数据库之后再去恢复数据。

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

    2.执行SQL语句

        执行SQL脚本需要登录mysql,然后进入指定数据库,才可以执行SQL脚本!

        执行SQL脚本不只是用来恢复数据库,也可以在平时编写SQL脚本,然后使用执行SQL 脚本来操作数据库!

            SOURCE 执行的脚本文件路径

        还可以通过另一种方法执行脚本,这种方式不需要登录mysql:

            mysql –u用户名 –p密码 数据库<要执行脚本文件路径

四、多表查询

    1.合并结果集

        作用:把两个select语句的查询结果合并到一起!

        合并结果集有两种方式:

            UNION:去除重复记录,例如:SELECT * FROM t1 UNION SELECT * FROM t2;

             UNION ALL:不去除重复记录,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2。

        要求:被合并的列数和列类型必须相同

    2.连接查询

        连接查询就是求出多个表的乘积,例如t1连接t2,那么查询出的结果就是t1*t2

        连接查询会产生笛卡尔积,假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。可以扩展到多个集合的情况。

        那么多表查询产生这样的结果并不是我们想要的,那么怎么去除重复的,不想要的记录呢,当然是通过条件过滤。通常要查询的多个表之间都存在关联关系,那么就通过关联关系去除笛卡尔积。

        (1)内连接

            * 方言: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

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

        (2)外连接

            * 左外:SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx

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

            * 左外自然:SELECT * FROM 表1 别名1 NATURAL LEFT OUTER JOIN 表2 别名2 

            * 右外:SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx

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

            * 右外自然:SELECT * FROM 表1 别名1 NATURAL RIGHT OUTER JOIN 表2 别名2 

    3.子查询

        子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。

        子查询出现的位置:

                where后,作为条件的一部分;

                from后,作为被查询的一条表;

        当子查询出现在where后作为条件时,还可以使用如下关键字:

                any

                all

        子查询结果集的形式:

                单行单列(用于条件)

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 条件

猜你喜欢

转载自blog.csdn.net/fy_java1995/article/details/80288608