先检查Linux系统中是否已经安装了MySQL

    sudo service mysql start

    安装MySQL的服务端、核心程序
    sudo apt-get install mysql-server

    安装MySQL的客户端
    sudo apt-get install mysql-client

    使用root环境登录MySQL, mysql -u root

    查看数据库
    show databases; (注意加分号)

    使用数据库
    use <数据库名称>
    image.png

    例如 use information_schema

    show table; 查看表


    创建数据库并插入程序

    sudo service mysql start
    mysql -u root

    create database <数据库名称>;(加分号)
    例如:
    create database mysql_shiyan;
    创建表
    create table <表的名字>(名字 <数据类型>(数字),名字 <数据类型> (数字))

    create table employee(id int(10),name char(20),phone int(12));

    image.png
    image.png
    image.png

    CHAR 和 VARCHAR 的区别: CHAR 的长度是固定的,而 VARCHAR 的长度是可以变化的,比如,存储字符串 “abc”,对于 CHAR(10),表示存储的字符将占 10 个字节(包括 7 个空字符),而同样的 VARCHAR(12) 则只占用 4 个字节的长度,增加一个额外字节来存储字符串本身的长度,12 只是最大值,当你存储的字符小于 12 时,按实际长度存储。


    通过INSERT语句向表中插入数据
    image.png
    你已经注意到了,有的数据需要用单引号括起来,比如 Tom、Jack、Rose 的名字,这是由于它们的数据类型是 CHAR 型。此外 VARCHAR,TEXT,DATE,TIME,ENUM 等类型的数据也需要单引号修饰,而 INT,FLOAT,DOUBLE 等则不需要。

    SELECT*FROM employee;
    image.png
    查看employee表内的数据。


    查看表的数据格式

    show create table <表名>;

    cd /home/shiyankou/Desktop
    sudo service mysql start
    mysql -u root
    在Desktop建立数据库之后,通过source导入数据库
    比如说我现在通过 source /home/shiyanlou/Desktop/SQL3/MySQL-03-01.sql

    现在我们导入了一个数据库

    image.png

    但是我们不知道,每个table的格式是如何的,如果我们不知道table的格式,也就无从谈导入数据。

    show create table <表名>;


    SQL的约束

    听名字就知道,约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。
    比如,规定一个用户的用户名不能为空值且没有重复的记录,这就是一种约束规则。
    在 MySQL 中,通常有这几种约束:

    image.png

    PRIMARY主键

    1,设置主键约束
    在创建表时
    MySql - 图9

    MySql - 图10
    MySql - 图11
    2,在定义完所有列时,指定主键的语法格式为

    MySql - 图12
    MySql - 图13

    3,在创建主键时,设置复合键
    MySql - 图14
    MySql - 图15

    4,在修改表时增加主键约束
    ALTER TABLE <数据表名> ADD PRIMARY KEY <列名>

    MySql - 图16


    默认约束值default

    image.png
    default的意思就是,当你插入数据的时候,如果不加定义,该值会选择默认值输入。


    唯一约束

    INSERTINTO employee VALUES(01,’Tom’,25,3000,110110,’dpt1’);
    INSERTINTO employee VALUES(02,’Jack’,30,3500,110110,’dpt2’);

    MySql - 图18


    外键约束

    外键既能保证数据的完整性,也能表现表之间的数据关系。

    比如,现在有用户表和文章表,给文章表中添加一个指向用户id的外键,表示这篇文章所属的用户id,外键将确保这个外键指向的记录是存在的,如果你尝试删除一个用户,而这个用户还有文章存储在数据库之中,这个操作将无法完成并报错。因为你删除了用户之后,这个文章就没有所属的用户了。

    一个表可以有多个外键,但每个外键必须REFERENCES另一个表的主键

    image.png

    image.png

    FOREIGN KEY(sid) REFERENCES course(cid)


    非空约束

    被非空约束约束的列,在插入时,值必须存在,不能为空。

    image.png
    例如这里的

    DEFAULT NULL就代表,如果我们没有输入值,默认为0
    NOT NULL代表我们必须要输入值

    image.png


    SELECT语句的用法

    SELECT 语句的基本格式为

    SELECT 要查询的列名 FROM 表名字 WHERE 限制条件;
    image.png

    ——数学符号条件

    where的限制条件可以有数学符号,

    image.png
    也可以限定查找
    image.png

    ——‘AND’ 和’OR’

    image.png

    image.png
    BETWEEN AND语句是闭区间

    IN和NOT IN

    image.png

    image.png


    通配符

    关键字LIKE可以实现模糊查询,和LIKE联用的还有通配符,代表未知字符。

    SQL中的通配符是“” 和“%” 其中代表一个未知字符,而%代表不定个未知字符

    image.png

    SELECET name,age,phone FROM employee WHERE phone LIKE ‘1101__’;
    只记得电话号码前两位和电话号码的位数,如何搜索

    另一种情况,只记得名字的首字母,又不知道名字的长度用%

    image.png


    对结果排序

    order by语句 ASC升序, DESC降序

    image.png

    SELECT name,age,salary,phone FROM employee ORDER BY salary DESC;

    DESC descend下降
    ASC ascend 上升


    SQL内置函数和计算

    image.png

    SELECT MAX(salary) as max_salary,MIN(salary) FROM employee;

    使用AS关键字可以给值重命名

    image.png

    最大值处的名称变成了max_salary而最小值处还是MIN(salary)


    子查询

    上面讨论的SELECT语句都仅涉及,对一个表的处理,但是有时候我们必须对多个表同时处理,我们才可以得到我们想要的结果。

    例如,我们想要知道名为’Tom’的员工所在的部门做了几个工程,但是员工信息存储在employee中,但工程存储在project中

    SELECT of_dpt ,COUNT(proj_name) AS count_project FROM project GROUP BY of_dpt HAVING of_dpt IN
    (SELECT in_dpt FROM employee WHERE name=’Tom’);

    image.png

    这里的HAVING相当于WHERE


    连接查询

    在处理多个表时,子查询只有在结果来自一个表时才有用。
    但如果需要显示两个或多个表中的数据,就必须使用连接操作(joIn),连接的基本思想是把两个或多个表连接成一个表。

    image.png

    使用JOIN ON也能达到同样的效果

    image.png


    GROUP BY

    Group by的意思是根据by对数据按照哪个字段进行分组,或者是哪几个字段进行分组。

    语法

    select 字段 from 表名 where 条件 group by 字段
    select 字段 from 表名 group by 字段 having 过滤条件

    GROUP BY的作用
    把group by 后面的字段组合起来,形成一个集合。

    比如说

    SELECT name,people_num
    FROM employee,department,project
    WHERE in_dpt = dpt_name AND of_dpt = dpt_name;

    image.png
    我们可以看到,在查询之后的表中,name和people_num有很多重复的行。

    GROUR BY name,people_num
    相当于把,name,people_num相同的归类为一个

    image.png

    可以发现我们GROUP BY之后,name,people_num中不再有重复的值了

    image.pngimage.pngimage.png

    image.png
    我们可以发现,employee有12条信息,department有4条信息,project有6条信息

    image.png查找SELECT*FROM employee,department,project;之后可以查询到288条信息

    288=1246

    但是其中会有很多重复的信息,GROUP BY就是按照列把重复的信息去除掉的功能。

    SQL中的一些函数运算,都是在GROUP BY之后的集合中进行的。

    image.png
    之前的SELECT name,people_num FROM employee,department,project;
    都是从连接之后的表中查询的,就是上表。


    使用连接查询的方式,查询出各员工所在部门的人数与工程数,工程数命名为 count_project。(连接 3 个表,并使用 COUNT 内置函数)

    SELECT name,people_num,COUNT(proj_name) AS count_project
    FROM employee,department,project
    WHERE in_dpt = dpt_name AND of_dpt = dpt_name
    GROUP BY name,people_num;

    如果name和people_num的值是一样的,说明这一行就是员工所属的部门

    GROUP BY name,people_num之后,就相当于把员工所属的部门给挖了出来,在其中进行COUNT(proj_name)进行函数运算。

    image.png

    这是完整的表格


    数据库及表的修改和删除

    DROP DATABASES 数据库名;

    image.png

    1,重命名一张表
    RENAME TABLE 原名 TO 新名

    RENAME TABLE table_01 TO table_02;

    image.png

    2,删除一张表
    DROP TABLE 表名字;

    image.png

    3,对一列的修改
    ALTER TABLE 表名字 ADD 列名字 数据类型 约束;

    ALTER TABLE employee ADD height INT(4) DEFAULT 170;

    image.png

    这样添加进去的数据,是默认在最后一列的。

    如果想指定放在表中的某个地方可以用after语句

    ALTER TABLE employee ADD weight INT(4) DEFAULT 120 AFTER age;

    image.png

    或者是放在第一列也是可以的
    image.png
    image.png效果如图

    4,删除一列
    image.png

    5,对原来的列进行修改
    ALTER TABLE 表名字 CHANGE 原列名 新列名 数据类型 约束;

    修改数据类型可能会导致数据丢失

    image.png

    6,改变数据类型
    ALTER TABLE 表名字 MODIFY 列名字 新数据类型;


    对数据库中表的内容进行修改

    UPDATE employee SET age=21, salary =3000 WHERE name = ‘Tom’;

    image.png

    后面一定要加where否则会出现很悲剧的结果


    删除一行记录

    DELETE FROM employee WHERE name = ‘Tom’;

    image.png


    索引
    索引相当于是书的目录,可以根据页码快速找到所需的内容

    1,建立索引

    ALTER TABLE employee ADD INDEX 索引名 (列名);
    CREATE INDEX idx_name ON employee (name);

    2,查看索引
    SHOW INDEX FROM employee;

    image.png


    试图


    视图是从一个或多个表中导出来的表,是一种虚拟存在的表。它就像一个窗口,通过这个窗口可以看到系统专门提供的数据,这样,用户可以不用看到整个数据库中的数据,而只关心对自己有用的数据。
    注意理解视图是虚拟的表:

    • 数据库中只存放了视图的定义,而没有存放视图中的数据,这些数据存放在原来的表中;
    • 使用视图查询数据时,数据库系统会从原来的表中取出对应的数据;
    • 视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变;
    • 在使用视图的时候,可以把它当作一张表。

    1,创建视图
    CREATE VIEW v_emp(v_name,v_age,v_phone) AS SELECT name,age,phone FROM employee;
    image.png
    image.png


    导入

    此处讲解的是导入一个纯数据文件,该文件中将包含与数据表字段相对应的多条数据,这样可以快速导入大量数据,

    LOAD DATA INFILE ‘文件路径和文件名’ INTO TABLE 表名字;


    由于导入导出大量数据都属于敏感操作,根据 mysql 的安全策略,导入导出的文件都必须在指定的路径下进行,在 mysql 终端中查看路径变量:

    show variables like ‘%secure%’;
    image.png

    注意到 secure_file_priv 变量指定安全路径为 /var/lib/mysql-files/ ,要导入数据文件,需要将该文件移动到安全路径下

    还没导入数据之前employee表中的数据

    image.png
    LOAD DATA ‘/var/lib/mysql-files/SQL6/in.txt’ INTO TABLE employee;
    image.png


    导出

    SELECT*INTO OUTFILE ‘/var/lib/mysql-files/out.txt’ FROM employee;

    image.png

    image.png


    备份

    备份与导出的区别:导出的文件只是保存数据库中的数据;而备份,则是把数据库的结构,包括数据、约束、索引、视图等全部另存为一个文件。

    mysqldump -u root 数据库名 > 备份文件名

    image.png
    mysqldump是一个交互工具,不是MySQL里面的命令,所以应该在LINUX环境下使用,而不是MySQL系统内

    image.png


    用备份文件恢复数据库

    1,source /路径
    mysql -u root test<bak.sql

    image.pngimage.png

    image.png