学习视频链接


MYSQL入门学习笔记

关联式数据库 => tables and keys

**primary key (主键)**:可以唯一区分资料

:heavy_exclamation_mark:当有重复时,可以设定多个主键来唯一区分资料

**foreign key(外键)**:实现table的互相关联(也可以和自己关联)

:heavy_exclamation_mark:但是只能关联table的主键

可以将一个属性同时设定为不同table的主键和外键

SQL基础语法

:heavy_exclamation_mark: 后文中的” <> “ 代表 “ ` “,同时SQL中遵循属性名用 ``包裹,值用 ‘’ 或者 “” 包裹的潜规则

数据库相关操作

创建数据库 CREATE DATABASE <name>

展示数据库 SHOW DATABASES;

关键字用大写,命名用``包裹

删除数据库 DROP DATABASE <db_name>;

数据库常见类型

  • INT –整数

  • DECYMAL(m,n) –有小数点的数,m=几个数字,n=几个小数

  • VARCHAR(n) –字串,n=最多可以容纳几个字

  • BLOB –(Binary Large Object) 图片 影片 档案等二进制资料

  • DATE –’YYYY-MM-DD’ 记录日期

  • TIMESTAMP –’YYYY-MM-DD HH:MM:SS’ 记录时间

表格操作

选择数据库 USE <db_name>;

创建表格

CREATE TABLE <table_name>(
`属性名1` 类型 限制类型,
`属性名2` 类型 限制类型
);

删除表格 DROP TABLE <table_name>;

新增属性 ALTER TABLE <name> ADD <属性名> 类型;

删除属性 ALTER TABLE <name> DROP <属性名> 类型;

查看表格属性 DECRIBE <table_name>;

加入内容 INSERT INTO <table_name> VALUES(属性1-内容,属性2-内容);

查找表格 SELECT * FROM <table_name>; 此条命令为查找当前数据库内所有名为table_name的表格,并完全展示出来

限制和限制的类型

  • UNIQUE –不允许重名
  • AUTO_INCREMENT –增加内容时自动加一,无需手动填写 (用于序号)
  • DEFAULT –预设值,不填写内容时,按照预设的填写

修改资料

语法

UPDATE `table_name`
SET `属性名` = '目标值';
WHERE 条件 (可以不写);

示例

UPDATE `student`
SET `major` = '历史';
WHERE `major` = '生物' OR `major` = '物理';
//将major为生物和物理的值,更新为历史

删除资料

语法

DELETE FROM `table_name`
WHERE 条件;

示例

DELETE FROM `student`
WHERE `score` > 60;
//删除 score小于60的方式

不写WHERE语句时,代表删除表格的所有资料

搜寻资料

SELECT * FROM <table_name>; => * 代表取得所有属性的意思

SELECT * FROM <table_name> LIMIT n; => 仅仅显示前 n 笔资料

SELECT * FROM <table_name> WHERE <属性名> ; => 仅仅显示属性名为属性1的内容

WHERE <属性名> IN (‘1’,’2’) = WHERE <属性名> = ‘1’ OR <属性名> = ‘2’

SELECT <属性1> FROM <table_name>; => 代表取得属性名为属性1的内容,取得多个属性的时候用 , 隔开

SELECT DISTINCT <属性1> FROM <table_name>; =>去掉重复属性

SELECT * FROM <table_name> ORDER BY <属性1> DESC; =>以属性1来排序表格

DESC 表示由高到低排序;不写时默认为ASC,代表由低到高排序

示例

SELECT *
FROM `student`
ORDER BY `score`,`student_id`
//排序时,优先以score对表格内容进行从低到高的排序;当score相同时,以student_id作为基准排序

:heavy_exclamation_mark: 各种语句的条件可以混用

>SELECT *
>FROM `student`
>WHERE `major` = '英语' OR `score` <> 70
>LIMIT 2;
>//回传major为英语和score不等于70的前两个数据

增加外键

//将table2的对应属性名,设置为table1的外键
FOREIGN KEY(`table1`)
REFERENCES `table2`(`table2对应属性名`)
ON DELETE CASCADE;

ON DELETE CASCADE 是当“table2对应属性名”被删除后,将table1中对应的值删掉

ON DELETE SET NULL 是当“table2对应属性名”被删除后,将table1中对应的值设置为NULL

当该键为其他表的主键时,不可以使用 ON DELETE SET NULL

基本逻辑

新建表格时,先创建各个表格,再添加外键的关联

增加资料时,先增加外键所在的表格的资料,再增加自己表格的资料

聚合函数 (aggregate functions)

取得成员数

  • SELECT COUNT(<属性名>) FROM <table_name>;
  • SELECT COUNT(*) FROM <table_name>;

在限制条件下取数 示例

  • SELECT COUNT(*) 
    FROM  `employee`
    WHERE `birth_date` > '1980-01-02' AND `sex` = 'F';
    //在employee表中取得birth_date 大于1980-01-02的女性
    

取得员工的平均薪水 示例

  • SELECT AVG (<salary>) FROM <employee>;

取得所有员工的薪水总和 示例

  • SELECT SUM(<salary>) FROM <employee>;

取得最高薪水

  • SELECT MAX(<salary>) FROM <employee>;

取得最低薪水

  • SELECT MIN(<salary>) FROM <employee>;

万用字元 wildcards

% 代表多个字元,_代表一个字元

取得电话号码是335连续的客户

  • SELECT * FROM <cient> WHERE <phone> LIKE '%335%';

取得姓艾的客户

  • SELECT *FROM <client> WHERE <phone> LIKE '艾%';

取得生日在12月的员工 生日格式YYYY-MM-DD

  • SELECT * FROM <employee> WHERE <birth_data> LIKE '_________12%';

union 连接搜寻结果

:heavy_exclamation_mark: 连接的属性数目和资料类型必须相同

员工名字 连接 客户名字

  • SELECT <name> FROM <employee>
    UNION
    SELECT <client_name> FROM <client>;
    

    员工id+员工名字 连接 客户id+客户名字

    - ```sql
    SELECT <employee_id>,<name>
    FROM <employee>
    UNION
    SELECT <client_id>,<client_name>
    FROM <client>;

    //改名
    SELECT <employee_id> AS <total_id>,<name> AS <total_name>
    FROM <employee>
    UNION
    SELECT <client_id>,<client_name>
    FROM <client>;

Join 连接表格

取得所有部门经理的资料

  • //返回结果包含两个表格的所有属性
    SELECT * 
    FROM <employee> 
    JOIN <branch> 
    ON <emp_id> = <manager_id> //条件
    

    - ```sql
    //返回结果只包含选中的属性
    SELECT <emp_id>,<branch_name>,<name>
    FROM <employee>
    JOIN <branch>
    ON <emp_id> = <manager_id>

可以用<table_name>.<属性名> 来区分不同表格的相同属性名

left 关键字

不管条件是否成立,都会将JOIN左边的表格属性全部回传;右边的表格没有对应的属性时,就填写NULL

SELECT * 
FROM <employee> LEFT JOIN <branch>
ON <emp_id> = <manager_id>

right 关键字

和left正好相反,不在此赘述

subquery 子查询

在一个查询语句中插入另外一个查询语句,对前一个查询的结果进行查询

示例 找出研发部门的经理名字

  • //从员工标准中查找其名字
    SELECT `name`
    FROM `employee`
    WHERE `emp_id` = (
        //得到 研发部门经理的id
        SELECT `manager_id`
        FROM `branch`
        WHERE `branch_name` = `研发`
    );
    

把 WHERE 后的第一个”=” 换为IN,可用于多个查询结果