MySQL知識點複習小結

前言

最近剛剛複習了關係型數據庫MySQL,現進行簡單總結。

知識點

1. 數據庫

DataBase(簡稱DB),用於存儲和管理數據的倉庫。

1.1 數據庫的特點:

可持久化存儲數據(數據庫其實就是一個文件系統);

可高效存儲和管理數據;

支持統一的方式來操作數據庫(對於關係型數據庫——SQL;對於非關係型數據庫——NoSQL)

1.2 常見的數據庫:

關係型數據庫——MySQL(由於開源免費,功能強大支持千萬級別的併發訪問,web應用中常用)、Oracle、DB2(常用於銀行系統)、Microsoft Sql Server(C#、.net常用)、SQLite(應用手機端的嵌入式小型數據庫)

非關係型數據庫——Redis(key-value)、HBase(列數據庫)、MongoDB(文件數據庫)

2. SQL

Structured Query Language,結構化查詢語言,定義了操作所有RDBMS的規則,對於每一種數據庫操作實現的具體方式可能有所不同(SQL語句有差異)

2.1 SQL通用語法:

  1. SQL語句可單行書寫,可多行書寫,每條語句最後以‘;’分號結尾
  2. 對於變量(表名、列名、值)可使用'_'來增強可讀性
  3. SQL語句中可使用空格和縮進來增加語句的可讀性
  4. MySQL數據庫的SQL語句不區分大小寫,建議關鍵字使用大寫
  5. MySQL數據庫支持三種註釋:單行註釋—— # XXXX; -- XXXX; 多行註釋—— /* xxxx */,其中# XXX是MySQL特有的註釋方式,其他數據庫支持-- xxxx;和/* xxx */兩種註釋(注意-- xxx註釋符號和註釋內容中間有空格,如果沒有空格會有結果但是SQL語句執行後會報錯
show databases; -- 顯示所有數據庫

use db1; # 使用db1數據庫

/*
創建數據庫db2
*/
create database db2;

2.2 SQL分類:DDL(數據定義語言)、DML(數據操作語言)、DQL(數據查詢語言)、DCL(數據控制語言)下面以MySQL數據庫爲例進行詳細總結。

3. 安裝部署MySQL

MySQL數據庫是目前應用最廣的關係型數據庫,安裝部署方法參考鏈接:https://blog.csdn.net/bobo553443/article/details/81383194

MySQL Shell啓動方式一共有兩種。

3.1 MySQL Shell

一種是直接安裝MySQL Shell應用程序,然後輸出 \sql、\connect [email protected]並輸入root用戶的密碼進入root用戶操作MySQL shell環境。

3.2 MySQL Server

另一種是安裝MySQL Server之後使用cmd進入其安裝目錄的bin目錄(要麼cmd直接cd進入;要麼文件資源管理器的文件目錄中直接輸入cmd進入)輸入 mysql -u root -p再輸入密碼即可

退出Shell環境可使用exit命令/quit命令。

MySQL提供可視化操作界面,使用MySQL Workbench應用程序連接server,根據需要建立schema(數據庫)和表即可

MySQL安裝目錄中可以看到對於數據庫而言對應的是一個文件夾,數據表對應一個文件

4. DDL

Data Definition Language,數據定義語言,主要涉及數據庫和數據表的CRUD操作C(create)R(retrieve)U(update)D(delete)

4.1 數據庫

4.1.1 查詢數據庫:

1. show databases;

2. show create database db1; 查看db1數據庫的字符集character 

/* 查詢數據庫:
    1. show databases;
    2. show create database db1; 查看db1數據庫的字符集character 
*/
mysql> show databases; -- 查看當前所有的數據庫
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+
6 rows in set (0.00 sec)

mysql> show create database mysql; -- 查看mysql數據庫的字符集
+----------+---------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database                                                                                                                 |
+----------+---------------------------------------------------------------------------------------------------------------------------------+
| mysql    | CREATE DATABASE `mysql` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+---------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

4.1.2 創建數據庫:

1. create database db1;

2. create database if not exists db1; -- 如果db1存在會報錯,可在創建時進行判斷。 如果db1不存在則創建數據庫db1;如果存在則不做任何操作

3. create database db1 character set gbk; -- 設置數據庫db1的字符集爲gbk(可支持中文)

4. create databases if not exists db1 character set gbk;

/* 創建數據庫:
    1. create database db1;
    2. create database if not exists db1; -- 如果db1存在會報錯,可在創建時進行判斷。 如果db1不存在則創建數據庫db1;如果存在則不做任何操作
    3. create database db1 character set gbk; -- 設置數據庫db1的字符集爲gbk(可支持中文)
    4. create databases if not exists db1 character set gbk;
*/
mysql> create database db1; -- 創建數據庫db1
Query OK, 1 row affected (0.38 sec)

mysql> show databases; -- 使用show查看到數據庫db1創建成功
+--------------------+
| Database           |
+--------------------+
| db1                |
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+
7 rows in set (0.00 sec)

mysql> create database db1; -- 在db1數據庫已存在的情況下再次創建報錯
ERROR 1007 (HY000): Can't create database 'db1'; database exists
mysql> create database if not exists db1; -- 增加判斷條件,如果db1已存在不做任何操作
Query OK, 1 row affected, 1 warning (0.10 sec)


mysql> create database if not exists db2 character set gbk; -- 通用的創建數據庫的標準語句
Query OK, 1 row affected (0.12 sec)

mysql> show create database db2;
+----------+------------------------------------------------------------------------------------------------+
| Database | Create Database                                                                                |
+----------+------------------------------------------------------------------------------------------------+
| db2      | CREATE DATABASE `db2` /*!40100 DEFAULT CHARACTER SET gbk */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+------------------------------------------------------------------------------------------------+
1 row in set (0.05 sec)

4.1.3 刪除數據庫

1. drop database db1;

2. drop database if exists db1; -- 先判斷db1是否存在,若存在則刪除;若不存在則不做操作

/* 刪除數據庫:
    1. drop database db1;
    2. drop database if exists db1; -- 先判斷db1是否存在,若存在則刪除;若不存在則不做操作
*/
mysql> drop database db2; -- 刪除數據庫db2
Query OK, 0 rows affected (0.23 sec)

mysql> show databases; -- 顯示數據庫db2刪除成功
+--------------------+
| Database           |
+--------------------+
| db1                |
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+
7 rows in set (0.00 sec)

mysql> show create database db2; -- 展示db2字符信息,但此時db2已被刪除所以報錯
ERROR 1049 (42000): Unknown database 'db2'
mysql> drop database if exists db2; -- 刪除數據庫前先做判斷,如果存在則刪除
Query OK, 0 rows affected, 1 warning (0.09 sec)

4.1.4 修改數據庫

alter database db1 character set gbk; --修改數據庫db1的字符集爲gbk

/* 修改數據庫:
    alter database db1 character set gbk; --修改數據庫db1的字符集爲gbk
*/
mysql> alter database db1 character set gbk; -- 修改db1字符集爲gbk
Query OK, 1 row affected (0.18 sec)

mysql> show create database db1; -- 查看db1字符集,字符集修改爲gbk
+----------+------------------------------------------------------------------------------------------------+
| Database | Create Database                                                                                |
+----------+------------------------------------------------------------------------------------------------+
| db1      | CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET gbk */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

4.1.5 使用數據庫

1. use db1; -- 使用數據庫db1

2. select database(); # 查看當前使用的是哪個數據庫

/* 使用數據庫:
    1. use db1; -- 使用數據庫db1
    2. select database(); # 查看當前使用的是哪個數據庫
*/
mysql> select database(); -- 查看當前使用的數據庫
+------------+
| database() |
+------------+
| mysql      |
+------------+
1 row in set (0.00 sec)

mysql> use db1;  -- 使用db1數據庫
Database changed
mysql> select database(); -- 查看當前數據庫已改變爲db1
+------------+
| database() |
+------------+
| db1        |
+------------+
1 row in set (0.00 sec)

4.2 數據表

4.2.1 查詢表

1. show tables; -- 查看當前數據庫下所有的表

2. desc table1; -- 查看錶table1的表結構(列名 列屬性 列限制

/* 查詢表:
    1. show tables; -- 查看當前數據庫下所有的表
    2. desc table1; -- 查看錶table1的表結構(列名 列屬性 列限制)
    3. show create table table1; -- 查看table1的字符集
*/
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| table1        |
+---------------+
1 row in set (0.01 sec)

mysql> desc table1; -- 查看table1的表結構
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(4)      | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
| sex   | varchar(1)  | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.15 sec)

4.2.2 創建表

/* 創建表:
    1.create table table1(
      列名1 列屬性1,
      列名2 列屬性2,
      ... # 注意最後一行無逗號
      ); -- 語句結束有分號
    2. create table table2 like table1; -- 複製表(table2表結構同table1)
*/

mysql> create table table1(
    -> id int(4),
    -> name varchar(20), -- char(20)是一開始給定20個字符,varchar(20)是根據實際的屬性值大小分配,最大爲20個字符
    -> sex varchar(1)
    -> );
Query OK, 0 rows affected, 1 warning (2.95 sec)

mysql> create table table2 like table1; -- 複製表table1到新表table2中
Query OK, 0 rows affected, 1 warning (0.82 sec)

mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| table1        |
| table2        |
+---------------+
2 rows in set (0.00 sec)

mysql> desc table2; -- 可見新建的表table2表結構同table1
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(4)      | YES  |     | NULL    |       |
| name     | varchar(20) | YES  |     | NULL    |       |
| sex      | char(1)     | YES  |     | NULL    |       |
| score    | double(4,1) | YES  |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

4.2.3 修改表

/* 修改表:
    1. alter table table1 add 列名 列屬性; -- 給表table1增加一個新列
    2. alter table table1 modify 列名 新列屬性; -- 給表table1的列名修改屬性
    3. alter table table1 change 列名 新列名 新列屬性; -- 給表table1的列修改列名和列屬性
    4. alter table table1 drop 列名; -- 刪除表table1的列
    5. alter table character set 字符集; -- 設置表table1的字符集
    6. alter table table1 rename to table2; -- 修改表名table1爲table2
*/
mysql> alter table table1 add score double(4,1); -- 增加新列score
Query OK, 0 rows affected, 1 warning (0.96 sec)
Records: 0  Duplicates: 0  Warnings: 1

mysql> desc table1; -- 查看table1的表結構可見score新列添加成功
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(4)      | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
| sex   | varchar(1)  | YES  |     | NULL    |       |
| score | double(4,1) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> alter table table1 modify sex char(1); -- 修改列sex屬性爲char(1)
Query OK, 0 rows affected (2.46 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc table1; -- 查看table1表結構可見sex屬性修改成功
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| id          | int(4)      | YES  |     | NULL    |       |
| name        | varchar(20) | YES  |     | NULL    |       |
| sex         | char(1)     | YES  |     | NULL    |       |
| score       | double(4,1) | YES  |     | NULL    |       |
| birthday    | date        | YES  |     | NULL    |       |
| insert_time | timestamp   | YES  |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+
6 rows in set (0.07 sec)

mysql> alter table table1 change insert_time modify_time timestamp; -- 修改列insert_time爲新列modify_time,列屬性保持原樣
Query OK, 0 rows affected (0.15 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc table1; -- 查看錶結構可見列名修改成功
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| id          | int(4)      | YES  |     | NULL    |       |
| name        | varchar(20) | YES  |     | NULL    |       |
| sex         | char(1)     | YES  |     | NULL    |       |
| score       | double(4,1) | YES  |     | NULL    |       |
| birthday    | date        | YES  |     | NULL    |       |
| modify_time | timestamp   | YES  |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

mysql> alter table table1 drop modify_time; -- 刪除列modify_time
Query OK, 0 rows affected (1.45 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc table1; -- 查看錶結構可見列刪除成功
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(4)      | YES  |     | NULL    |       |
| name     | varchar(20) | YES  |     | NULL    |       |
| sex      | char(1)     | YES  |     | NULL    |       |
| score    | double(4,1) | YES  |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.17 sec)

mysql> alter table table1 character set gbk; -- 修改表table1的字符集
Query OK, 0 rows affected (0.45 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table table1; -- 查看可見table1的字符集修改成功
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                                                                                                                                |
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| table1 | CREATE TABLE `table1` (
  `id` int(4) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `sex` char(1) DEFAULT NULL,
  `score` double(4,1) DEFAULT NULL,
  `birthday` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.06 sec)

mysql> alter table table1 rename to table2; -- 修改table1的表名
Query OK, 0 rows affected (0.52 sec)

mysql> show tables; -- 查看當前數據庫的表沒有table1
+---------------+
| Tables_in_db1 |
+---------------+
| table2        |
+---------------+
1 row in set (0.06 sec)

mysql> desc table1;
ERROR 1146 (42S02): Table 'db1.table1' doesn't exist
mysql> desc table2; -- 查看錶名已修改成功
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(4)      | YES  |     | NULL    |       |
| name     | varchar(20) | YES  |     | NULL    |       |
| sex      | char(1)     | YES  |     | NULL    |       |
| score    | double(4,1) | YES  |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

4.2.4 刪除表

/* 刪除表:
    1. drop table table2; -- 刪除表table2
    2. drop table if exists table2; -- 在刪除前加判斷,如果表table2存在則刪除,否則不做操作
*/

mysql> drop table table2; -- 刪除表table2
Query OK, 0 rows affected (0.54 sec)

mysql> show tables; -- 查看當前數據庫的表可見table2已被刪除
+---------------+
| Tables_in_db1 |
+---------------+
| table1        |
+---------------+
1 row in set (0.00 sec)

mysql> drop table table2; -- 表不存在的情況下執行drop操作會報錯
ERROR 1051 (42S02): Unknown table 'db1.table2'
mysql> drop table if exists table2; -- 刪除操作加判斷
Query OK, 0 rows affected, 1 warning (0.09 sec)

5. DML

Date Manipulation Language,數據操作語言,主要涉及數據增(insert)刪(delete)改(update)

5.1 增加數據

/* 增加數據:
    1. insert into table1 values(列值1,列值2,...); -- 列值需要與table1的列順序一一對應
    2. insert into table1(列名1, 列名2,...) values(列值1,列值2,...); -- 指定添加某些列的一條表數據
    注意:數值類型直接寫,其他類型需要加單引號/雙引號
*/
mysql> insert into table1 values(1001,'zhangsan','女',123.1,'1997-12-15');
Query OK, 1 row affected (0.20 sec)

mysql> select * from table1;
+------+----------+------+-------+------------+
| id   | name     | sex  | score | birthday   |
+------+----------+------+-------+------------+
| 1001 | zhangsan | 女   | 123.1 | 1997-12-15 |
+------+----------+------+-------+------------+
1 row in set (0.07 sec)

mysql> insert into table1(id,name,sex) values(1002,'lisi','男');
Query OK, 1 row affected (0.18 sec)

mysql> select * from table1;
+------+----------+------+-------+------------+
| id   | name     | sex  | score | birthday   |
+------+----------+------+-------+------------+
| 1001 | zhangsan | 女   | 123.1 | 1997-12-15 |
| 1002 | lisi     | 男   |  NULL | NULL       |
+------+----------+------+-------+------------+
2 rows in set (0.00 sec)

5.2 修改數據

/* 修改表數據:
    1. update table1 set 列名1=列值1, 列名2=列值2,... where 條件; -- where條件用來篩選表條目,給指定條目修改數據
    2. update table1 set 列名1=列值1, 列名2=列值2,...; -- 不加where條件即給全表數據更新
    注:一般update操作都需要加where條件已保證表數據的有效性
*/

mysql> update table1 set score=124.4 where id = 1002; -- 更新id=1002的表數據score
Query OK, 1 row affected (0.16 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from table1; -- 查看錶數據1002的score更新(原本爲NULL)
+------+----------+------+-------+------------+
| id   | name     | sex  | score | birthday   |
+------+----------+------+-------+------------+
| 1001 | zhangsan | 女   | 123.1 | 1997-12-15 |
| 1002 | lisi     | 男   | 124.4 | NULL       |
+------+----------+------+-------+------------+
2 rows in set (0.00 sec)

mysql> update table1 set birthday='1999-9-9'; -- 不加where條件全表數據更新
Query OK, 2 rows affected (0.14 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from table1; -- 查看發現所有表數據的birthday更新
+------+----------+------+-------+------------+
| id   | name     | sex  | score | birthday   |
+------+----------+------+-------+------------+
| 1001 | zhangsan | 女   | 123.1 | 1999-09-09 |
| 1002 | lisi     | 男   | 124.4 | 1999-09-09 |
+------+----------+------+-------+------------+
2 rows in set (0.00 sec)

5.3 刪除數據

/* 刪除表數據:
    1. delete from table1 where 條件; -- 刪除滿足條件的表數據
    2. delete from table1; -- 刪除所有表數據
    3. truncate table table1; -- 清空表數據,保留表結構(相當於delete不加where)
    4. drop table table1; --刪除表及表數據(DDL操作)
    注:實際應用中都要加where條件已保證數據的完整性(以防誤刪錯刪)
*/

mysql> delete from table1 where id=1002; -- 刪除id=1002的表條目/元組
Query OK, 1 row affected (0.16 sec)

mysql> select * from table1; -- 查看錶id=1002的數據刪除
+------+----------+------+-------+------------+
| id   | name     | sex  | score | birthday   |
+------+----------+------+-------+------------+
| 1001 | zhangsan | 女   | 123.1 | 1999-09-09 |
+------+----------+------+-------+------------+
1 row in set (0.00 sec)

mysql> insert into table1 values( -- 新增加一條數據
    -> 1004,'lilei','男',124.4,'1998-12-3');
Query OK, 1 row affected (0.14 sec)

mysql> select * from table1; 
+------+----------+------+-------+------------+
| id   | name     | sex  | score | birthday   |
+------+----------+------+-------+------------+
| 1001 | zhangsan | 女   | 123.1 | 1999-09-09 |
| 1004 | lilei    | 男   | 124.4 | 1998-12-03 |
+------+----------+------+-------+------------+
2 rows in set (0.00 sec)

mysql> delete from table1; -- 不加where條件刪除所有表數據
Query OK, 2 rows affected (0.22 sec)

mysql> select * from table1; -- 查看錶數據全被刪除
Empty set (0.00 sec)

mysql> truncate table table1; -- 清空表table1
Query OK, 0 rows affected (1.04 sec)

mysql> show tables; -- 表結構保留
+---------------+
| Tables_in_db1 |
+---------------+
| table1        |
+---------------+
1 row in set (0.00 sec)

mysql> desc table1;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(4)      | YES  |     | NULL    |       |
| name     | varchar(20) | YES  |     | NULL    |       |
| sex      | char(1)     | YES  |     | NULL    |       |
| score    | double(4,1) | YES  |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

mysql> select * from table1; -- 表數據清空
Empty set (0.00 sec)

mysql> drop table table1;
Query OK, 0 rows affected (0.33 sec)

mysql> show tables;
Empty set (0.04 sec)

6. DQL

Data Query Language,數據查詢語言,涉及數據查詢操作(select)

select [distinct] 查詢目標 [as 別名]
from table_name [as 別名]
where 條件
group by 分組依據
having 分組後條件
order by 排序依據
limit 起始索引,偏移量

6.1 普通全查詢

/* 普通全查詢:不加where條件
    1. select * from table_name;
    2. select 列名1,列名2,... from table_name;
*/

mysql> select * from table1;
+------+----------+------+
| id   | name     | sex  |
+------+----------+------+
| 1001 | zhangsan | 女   |
| 1002 | lisi     | 男   |
| 1003 | wangwu   | 男   |
| 1004 | leilei   | 男   |
+------+----------+------+
4 rows in set (0.21 sec)

mysql> select id,name from table1;
+------+----------+
| id   | name     |
+------+----------+
| 1001 | zhangsan |
| 1002 | lisi     |
| 1003 | wangwu   |
| 1004 | leilei   |
+------+----------+
4 rows in set (0.00 sec)

6.2 普通條件查詢

/* 普通條件查詢: 加where條件
    1. select * from table_name where 條件;
    2. select 列名1,列名2,... from table_name where 條件;
    3. 想讓結果唯一無重複值,加distinct關鍵字 
        select distinct 列名1,列名2,... from table_name where 條件;
    4. 對列名,表名起別名,加as關鍵字(可省略)
        select 列名1 as 新列名1,列名2 新列名2,... from table_name [as] table_newName where 條件;
*/

mysql> select * from table1 where sex='女';
+------+----------+------+
| id   | name     | sex  |
+------+----------+------+
| 1001 | zhangsan | 女   |
+------+----------+------+
1 row in set (0.03 sec)

mysql> select id,name from table1 where id=1002;
+------+------+
| id   | name |
+------+------+
| 1002 | lisi |
+------+------+
1 row in set (0.00 sec)

mysql> select distinct sex from table1;
+------+
| sex  |
+------+
| 女   |
| 男   |
+------+
2 rows in set (0.11 sec)

mysql> select sex 性別, name as 姓名 from table1 表;
+------+----------+
| 性別 | 姓名     |
+------+----------+
| 女   | zhangsan |
| 男   | lisi     |
| 男   | wangwu   |
| 男   | leilei   |
+------+----------+
4 rows in set (0.01 sec)

6.3 分組查詢

/* 分組查詢:
    1. select 查詢目標 from table_name group by 分組條件;
    2. select 查詢目標 from table_name group by 分組條件 having 分組後的條件; -- 分組後對分組結果繼續條件查詢
*/

mysql> select count(*) from table1 group by sex;
+----------+
| count(*) |
+----------+
|        1 |
|        3 |
+----------+
2 rows in set (0.07 sec)

mysql> select * from table1 group by sex having name like '%l%';
+------+------+------+
| id   | name | sex  |
+------+------+------+
| 1002 | lisi | 男   |
+------+------+------+
1 row in set (0.00 sec)

6.4 排序查詢

/* 排序查詢:
    1. select 查詢目標 from table_name order by 排序依據; -- 默認升序排列
    2. select 查詢目標 from table_name order by 排序依據 asc; --升序排列
    3. select 查詢目標 from table_name order by 排序依據 desc; --降序排列
*/

mysql> select * from table1 order by id;
+------+----------+------+
| id   | name     | sex  |
+------+----------+------+
| 1001 | zhangsan | 女   |
| 1002 | lisi     | 男   |
| 1003 | wangwu   | 男   |
| 1004 | leilei   | 男   |
+------+----------+------+
4 rows in set (0.08 sec)

mysql> select * from table1 order by id desc;
+------+----------+------+
| id   | name     | sex  |
+------+----------+------+
| 1004 | leilei   | 男   |
| 1003 | wangwu   | 男   |
| 1002 | lisi     | 男   |
| 1001 | zhangsan | 女   |
+------+----------+------+
4 rows in set (0.00 sec)

6.5 聚合函數

6.6 分頁查詢

/* 分頁查詢:
    select 查詢目標 from table_name limit 起始索引,偏移量; 
    注:起始索引 = (頁碼 - 1) * 偏移量
*/

mysql> select * from table1 limit 0,2; -- 第一頁 0=(1-0)*2
+------+----------+------+
| id   | name     | sex  |
+------+----------+------+
| 1001 | zhangsan | 女   |
| 1002 | lisi     | 男   |
+------+----------+------+
2 rows in set (0.00 sec)

mysql> select * from table1 limit 2,2; -- 第二頁 2=(2-1)*2
+------+--------+------+
| id   | name   | sex  |
+------+--------+------+
| 1003 | wangwu | 男   |
| 1004 | leilei | 男   |
+------+--------+------+
2 rows in set (0.00 sec)

注:如果查詢結果不想要null值,可使用ifnull函數將null值轉爲給定的值

mysql> insert into table1 values(1005,'lihua',null);
Query OK, 1 row affected (0.31 sec)

mysql> select * from table1;
+------+----------+------+
| id   | name     | sex  |
+------+----------+------+
| 1001 | zhangsan | 女   |
| 1002 | lisi     | 男   |
| 1003 | wangwu   | 男   |
| 1004 | leilei   | 男   |
| 1005 | lihua    | NULL |
+------+----------+------+
5 rows in set (0.00 sec)

mysql> select id,name,ifnull(sex,'男') from table1;
+------+----------+------------------+
| id   | name     | ifnull(sex,'男') |
+------+----------+------------------+
| 1001 | zhangsan | 女               |
| 1002 | lisi     | 男               |
| 1003 | wangwu   | 男               |
| 1004 | leilei   | 男               |
| 1005 | lihua    | 男               |
+------+----------+------------------+
5 rows in set (0.08 sec)

7. DCL

Data Control Language,數據控制語言,涉及用戶管理和權限管理

7.1 用戶管理

/* 查看用戶:
    1. use mysql; -- 切換到mysql數據庫
    2. select * from user; -- 查詢mysql數據庫下的user表
*/
mysql> use mysql;
Database changed
mysql> select * from user;
+-----------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+-------
| Host      | User             | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Show_db_priv | Super_priv | Create_tmp_table_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | Create_view_priv | Show_view_priv | Create_routine_priv | Alter_routine_priv | Create_user_priv | Event_priv | Trigger_priv | Create_tablespace_priv | ssl_type | ssl_cipher | x509_issuer | x509_subject | max_questions | max_updates | max_connections | max_user_connections | plugin                | authentication_string                                                  | password_expired | password_last_changed | password_lifetime | account_locked | Create_role_priv | Drop_role_priv | Password_reuse_history | Password_reuse_time | Password_require_current | User_attributes |
+-----------+------------------+-------------+-------------+-------------+-------------+-

/* 創建用戶:    create user 'user_name'@'ip' identified by '密碼';  */
mysql> create user 'user1'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.52 sec)

/* 修改密碼:    alter user 'user_name'@'ip' identified with mysql_native_password by '新密碼';   */
mysql> alter user 'user1'@'localhost' identified with mysql_native_password by '123';
Query OK, 0 rows affected (0.24 sec)

/* 刪除用戶:    drop user 'user_name'@'ip';  */
mysql> drop user 'user1'@'localhost';
Query OK, 0 rows affected (0.41 sec)

7.2 權限管理

/* 查看用戶權限: show grants for 'user_name'@'ip';   */
 show grants for 'user1'@'localhost';
+-------------------------------------------+
| Grants for user1@localhost                |
+-------------------------------------------+
| GRANT USAGE ON *.* TO `user1`@`localhost` |
+-------------------------------------------+
1 row in set (0.08 sec)

/* 授予用戶權限:
    1. grant 權限 on 數據庫名.表名 to 'user_name'@'ip'; -- 給user_name賦予對某個數據庫的某個表的某些權限
    2. grant all on *.* to 'user_name'@'ip'; -- 授予user_name對所有數據庫的所有表的所有權限
*/

mysql> grant select on *.* to 'user1'@'localhost'; -- 授予user1對所有數據庫及表的select權限
Query OK, 0 rows affected (0.22 sec)

mysql> show grants for 'user1'@'localhost'; -- 查看user1用戶對所有數據庫及表由select權限
+--------------------------------------------+
| Grants for user1@localhost                 |
+--------------------------------------------+
| GRANT SELECT ON *.* TO `user1`@`localhost` |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql> grant all on *.* to 'user1'@'localhost'; -- 授予user1用戶所有權限
Query OK, 0 rows affected (0.20 sec)

mysql> show grants for 'user1'@'localhost';
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for user1@localhost                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `user1`@`localhost`                                                                                                           |
| GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,INNODB_REDO_LOG_ARCHIVE,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `user1`@`localhost` |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

/* 撤銷用戶權限:
    1. revoke 權限 on 數據庫.數據表 from 'user_name'@'ip'; -- 撤銷用戶user_name對於指定數據庫的數據表的某些權限
    2. revoke all on *.* from 'user_name'@'ip'; -- 撤銷用戶user_name對所有數據庫及表的所有權限
*/

mysql> revoke select on *.* from 'user1'@'localhost'; -- 撤銷user1用戶的select權限
Query OK, 0 rows affected (0.15 sec)

mysql> show grants for 'user1'@'localhost'; -- 查看可見用戶user1的select權限被撤銷,已不具有select權限
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for user1@localhost                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `user1`@`localhost`                                                                                                                   |
| GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,INNODB_REDO_LOG_ARCHIVE,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `user1`@`localhost` |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> revoke all on *.* from 'user1'@'localhost'; -- 撤銷user1用戶的所有權限
Query OK, 0 rows affected (0.17 sec)

mysql> show grants for 'user1'@'localhost'; -- 查看可見用戶user1的所有權限被撤銷
+-------------------------------------------+
| Grants for user1@localhost                |
+-------------------------------------------+
| GRANT USAGE ON *.* TO `user1`@`localhost` |
+-------------------------------------------+
1 row in set (0.00 sec)

8. 約束

8.1 主鍵約束

mysql> create table table2(
    -> id int primary key, -- 創建表時加主鍵約束
    -> name varchar(20));
Query OK, 0 rows affected (1.41 sec)

mysql> desc table2; -- 查看錶主鍵約束已加(默認not null)
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.14 sec)

mysql> alter table table2 drop primary key; -- 刪除主鍵約束
Query OK, 0 rows affected (2.28 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc table2; -- 查看主鍵約束已被刪除,但是列依舊not null
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.13 sec)

mysql> alter table table2 modify id int primary key; -- 創建表後添加主鍵約束
Query OK, 0 rows affected (1.42 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc table2;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.10 sec)



mysql> create table table3(
    -> id int primary key auto_increment); -- 主鍵自動增長auto_increment
Query OK, 0 rows affected (0.64 sec)

mysql> desc table3;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
+-------+---------+------+-----+---------+----------------+
1 row in set (0.07 sec)

mysql> alter table table3 modify id int; -- 刪除自動增長約束
Query OK, 0 rows affected (1.39 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc table3;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> alter table table3 modify id int auto_increment; -- 創建表之後添加自動增長約束
Query OK, 0 rows affected (2.16 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc table3;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
+-------+---------+------+-----+---------+----------------+
1 row in set (0.00 sec)

8.2 非空約束

mysql> create table table3(
    -> id int not null); -- 創建表時增加not null約束
Query OK, 0 rows affected (0.71 sec)

mysql> desc table3;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> alter table table3 modify id int; -- 刪除not null約束
Query OK, 0 rows affected (1.70 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc table3;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.04 sec)

mysql> alter table table3 modify id int not null; -- 創建表之後添加not null約束
Query OK, 0 rows affected (2.23 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc table3;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

8.3 唯一約束

mysql> create table table3(
    -> id int unique); -- 創建表時添加unique約束
Query OK, 0 rows affected (0.66 sec)

mysql> desc table3;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  | UNI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> alter table table3 drop index id; -- 刪除unique約束
Query OK, 0 rows affected (0.26 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc table3;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> alter table table3 modify id int unique; -- 創建表後增加unique約束
Query OK, 0 rows affected (0.43 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc table3;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  | UNI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

8.4 外鍵約束

constraint 外鍵約束名稱 foreign key thisTable_name(thisTable_qualifierName) references 外表名(外表鍵);

mysql> create table table4(
    -> id int, -- 注意有逗號
    -> constraint table4_ibfk_1 foreign key table4(id) references table3(id)); -- 創建表時加foreign key約束
Query OK, 0 rows affected (0.69 sec)

mysql> desc table4;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  | MUL | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> alter table table4 drop foreign key table4_ibfk_1; -- 刪除某個外鍵約束
Query OK, 0 rows affected (0.33 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table table4 add constraint table4_fk foreign key table4(id) references table3(id); -- 創建表後添加foreign key約束
Query OK, 0 rows affected (2.24 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc table4;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  | MUL | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

9. 範式

第一範式1NF:表中每個列都是不可分割的(存在問題:數據冗餘;添加數據無效;刪除數據會連帶刪除有效數據)

第二範式2NF:表中每個列都完全依賴於主鍵(存在問題:添加數據無效;刪除數據連帶刪除有效數據) 對1NF的表拆表

第三範式3NF:表中不存在傳遞依賴,滿足3NF的基本滿足業務開發表設計需求。 對2NF的表拆表

10. 事務

mysql> select * from table1;
+------+----------+------+
| id   | name     | sex  |
+------+----------+------+
| 1001 | zhangsan | 女   |
| 1002 | lisi     | 男   |
| 1003 | wangwu   | 男   |
| 1004 | leilei   | 男   |
| 1005 | lihua    | NULL |
+------+----------+------+
5 rows in set (0.08 sec)

mysql> start transaction; -- 開啓事務
Query OK, 0 rows affected (0.00 sec)

mysql> update table1 set sex='男' where id = 1005; -- 更新表數據
Query OK, 1 row affected (0.07 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from table1;
+------+----------+------+
| id   | name     | sex  |
+------+----------+------+
| 1001 | zhangsan | 女   |
| 1002 | lisi     | 男   |
| 1003 | wangwu   | 男   |
| 1004 | leilei   | 男   |
| 1005 | lihua    | 男   |
+------+----------+------+
5 rows in set (0.00 sec)

mysql> rollback; -- 回滾
Query OK, 0 rows affected (0.06 sec)

mysql> select * from table1; -- 之前事務執行無效
+------+----------+------+
| id   | name     | sex  |
+------+----------+------+
| 1001 | zhangsan | 女   |
| 1002 | lisi     | 男   |
| 1003 | wangwu   | 男   |
| 1004 | leilei   | 男   |
| 1005 | lihua    | NULL |
+------+----------+------+
5 rows in set (0.00 sec)

mysql> update table1 set sex='男' where id = 1005;
Query OK, 1 row affected (0.18 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> commit; -- 提交事務
Query OK, 0 rows affected (0.00 sec)

mysql> select * from table1; -- 事務執行有效
+------+----------+------+
| id   | name     | sex  |
+------+----------+------+
| 1001 | zhangsan | 女   |
| 1002 | lisi     | 男   |
| 1003 | wangwu   | 男   |
| 1004 | leilei   | 男   |
| 1005 | lihua    | 男   |
+------+----------+------+
5 rows in set (0.00 sec)

11. 多表關係

表與表的關係就三種:1:1、1:N、N:N。fubiao

對於1:1(例如居民與居民身份證號),一般會整成一張表,有時候爲了業務需求會分別建表(比如其中一張表數據與其他表密切關聯等)

對於1:N(例如部門與員工),使用外鍵關聯,1對應父表,N對應子表。constraint foreign_relation_name foreign key 子表(列名) conferences 父表(列名)

對於N:N(例如學生與課程),會創建一個關聯表,拆分爲兩個1:N的關係,一般兩個表的主鍵會成爲關聯表的組合主鍵(同時也是關聯表的外鍵)

注:子表外鍵的列屬性需要和父表關聯的列屬性保持一致

12. 多表查詢

多表聯查符合笛卡爾積運算:如果table_A中共3條數據,table_B中共2條數據,那麼select * from table_A,table_B結果共有3*2=6條數據(可能結果中有不正確的數據,所以需要消除無用的數據)

多表查詢一般分爲內連接查詢、外連接查詢和全連接查詢

12.1 內連接查詢

內連接查詢 = where條件查詢  select 查詢目標 from table1 [inner] join table2 on 查詢條件;

mysql> select * from table1;
+------+----------+------+
| id   | name     | sex  |
+------+----------+------+
| 1001 | zhangsan | 女   |
| 1002 | lisi     | 男   |
| 1003 | wangwu   | 男   |
| 1004 | leilei   | 男   |
| 1005 | lihua    | 男   |
+------+----------+------+
5 rows in set (0.00 sec)

mysql> select * from table2;
+------+----------+
| id   | name     |
+------+----------+
| 1001 | zhangsan |
| 1002 | lisi     |
| 1002 | NULL     |
| NULL | leilei   |
+------+----------+

mysql> select
    -> table1.id ID號, -- ID
    -> table1.name as 姓名
    -> from table1,table2
    -> where table1.id=table2.id;
+------+----------+
| ID號 | 姓名     |
+------+----------+
| 1001 | zhangsan |
| 1002 | lisi     |
| 1003 | wangwu   |
+------+----------+
3 rows in set (0.00 sec)

mysql> select * from table1 inner join table2 on table1.id = table2.id;
+------+----------+------+------+----------+
| id   | name     | sex  | id   | name     |
+------+----------+------+------+----------+
| 1001 | zhangsan | 女   | 1001 | zhangsan |
| 1002 | lisi     | 男   | 1002 | lisi     |
| 1003 | wangwu   | 男   | 1003 | NULL     |
+------+----------+------+------+----------+
3 rows in set (0.00 sec)

mysql> select * from table2 join table1 on table1.id = table2.id;
+------+----------+------+----------+------+
| id   | name     | id   | name     | sex  |
+------+----------+------+----------+------+
| 1001 | zhangsan | 1001 | zhangsan | 女   |
| 1002 | lisi     | 1002 | lisi     | 男   |
| 1003 | NULL     | 1003 | wangwu   | 男   |
+------+----------+------+----------+------+
3 rows in set (0.00 sec)

12.2 外連接查詢

mysql> select * from table1;
+------+----------+------+
| id   | name     | sex  |
+------+----------+------+
| 1001 | zhangsan | 女   |
| 1002 | lisi     | 男   |
| 1003 | wangwu   | 男   |
| 1004 | leilei   | 男   |
| 1005 | lihua    | 男   |
| 1007 | NULL     | NULL |
+------+----------+------+
6 rows in set (0.00 sec)
mysql> select * from table2;
+------+----------+
| id   | name     |
+------+----------+
| 1001 | zhangsan |
| NULL | leilei   |
| 1002 | lisi     |
| 1003 | NULL     |
+------+----------+
4 rows in set (0.00 sec)

mysql> select * from table1 left join table2 on table1.id = table2.id; -- 左外連接,結果爲左表及交集部分(右表沒有的加null)
+------+----------+------+------+----------+
| id   | name     | sex  | id   | name     |
+------+----------+------+------+----------+
| 1001 | zhangsan | 女   | 1001 | zhangsan |
| 1002 | lisi     | 男   | 1002 | lisi     |
| 1003 | wangwu   | 男   | 1003 | NULL     |
| 1004 | leilei   | 男   | NULL | NULL     |
| 1005 | lihua    | 男   | NULL | NULL     |
| 1007 | NULL     | NULL | NULL | NULL     |
+------+----------+------+------+----------+
6 rows in set (0.00 sec)

mysql> select * from table1 right join table2 on table1.id = table2.id; -- 右外連接,結果有右表及交集部分(左表沒有的加null)
+------+----------+------+------+----------+
| id   | name     | sex  | id   | name     |
+------+----------+------+------+----------+
| 1001 | zhangsan | 女   | 1001 | zhangsan |
| 1002 | lisi     | 男   | 1002 | lisi     |
| 1003 | wangwu   | 男   | 1003 | NULL     |
| NULL | NULL     | NULL | NULL | leilei   |
+------+----------+------+------+----------+
4 rows in set (0.00 sec)

12.3 全連接查詢 union MySQL本身不支持全連接,可使用union連接左連接和右連接間接實現全連接

mysql> select * from table1 left join table2 on table1.id = table2.id
    -> union
    -> select * from table1 right join table2 on table1.id = table2.id;
+------+----------+------+------+----------+
| id   | name     | sex  | id   | name     |
+------+----------+------+------+----------+
| 1001 | zhangsan | 女   | 1001 | zhangsan |
| 1002 | lisi     | 男   | 1002 | lisi     |
| 1003 | wangwu   | 男   | 1003 | NULL     |
| 1004 | leilei   | 男   | NULL | NULL     |
| 1005 | lihua    | 男   | NULL | NULL     |
| 1007 | NULL     | NULL | NULL | NULL     |
| NULL | NULL     | NULL | NULL | leilei   |
+------+----------+------+------+----------+
7 rows in set (0.11 sec)

拓展:數據庫的備份與還原.

數據庫的備份:mysqldump -u 用戶名 -p 數據庫名 [數據表名] > 備份路徑xx.sql

數據庫的還原:source xxx.sql

總結

不同版本mysql命令可能有所差異,學會使用help進行查看。此篇博客中使用shell命令進行操作,實際開發推薦直接使用MySQL Workbench可視化開發工具簡化開發(可視化點擊操作完成數據庫、數據表的操作,同時也支持SQL命令)。

關於MySQL的觸發器、存儲引擎、視圖、存儲過程、索引等知識點後續進行持續更新。

知識系統體系的學習很重要,多理解基礎概念和底層原理,及時總結。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章