1.前言
平時項目開發中我們每一個人都經歷過業務的CRUD操作,這些CRUD操作最終結果都是進行數據庫的讀寫操作,在多種數據庫中最常見使用的就是關係型數據庫。而關係數據庫最常見使用就是Mysql數據庫了,網上關於Mysql數據庫的博客已經很多了,但是作爲一個程序員何不記錄自己學習Mysql的點點滴滴呢?要知道紙上得來終覺淺,絕知此事要躬行。唯有靠我們自己多動手、多學習充實自己,才能在以後面試中立於不敗之地,學習Mysql語法之前需要先安裝Mysql,這裏可以參考我之前寫的博客基於Centos7的Linux系統-mysql5.7安裝和配置(tar.gz與rpm)
2. SQL的分類
SQL語句廣義可以分爲以下三種類型:
- DDL(Data Definition Language):數據定義語言,這種類型的語句定義了對數據庫對象(database、index、table、column)的操作,常用的SQL關鍵字有create、alter、drop等。
- DML(Data Manipulation Language):數據操縱語言,這種類型的語句用於對數據庫存儲數據列進行增刪改查操作,常見的SQL關鍵字有 insert、delete、update、select等。
- DCL(Data Control Language):數據控制語言,這種類型的數據定義了對數據庫表、字段、用戶訪問許可與安全級別的操作,常見的關鍵字有grant、revoke等。
2.1 DDL
下面簡單通過一下案列演示DDL語句的用法。
- 連接Mysql數據庫
需啓動Mysql相關服務後,如果你的Mysql實例加入了系統服務可以鍵入如下命令以查看mysql服務狀態。
systemctl status 你的mysql系統服務名
因爲我的mysql服務名爲mysqld
,所以執行的檢查狀態命令結果如下所示:
如果你檢查mysql服務沒有啓動如下圖所示:
這個時候執行一下啓動mysql服務命令即可。
systemctl start mysqld
- 創建數據庫
當確定mysql服務正常啓動後,這個時候就可以創建數據庫了。輸入以下命令即可以連接數據庫。
mysql -h 127.0.0.1 -P 3306 -u root -p
在上面命令行中使用了幾個重要的參數,且歡迎界面有一些描述信息。
- mysql 代表着客戶端連接命令
- -h 表示指定mysql客戶端連接mysql服務端的ip地址
- -P 表示連接指定Mysql服務器運行的端口號
- -u 表示以指定的用戶名去連接mysql服務器
- -p 表示連接mysql服務器需要輸入密碼
- mysql命令的結束符用;或者\g結束
- 每一個連接mysql都會爲這次連接分配一個id,這個id表示mysql服務的連接次數
- 這裏我使用的是mysql 5.7.29 社區版本。
- 通過輸入help,或者\h 獲取幫助內容,輸入\c 清除當前輸入的內容
接下來讓我們創建一個數據庫,其語法如下所示:
CREATE DATABASE databaseName;
例如我們創建一個databaseName爲test的數據庫如下所示:
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql>
如果你看到上面有Query OK
選項恭喜你已經成功執行了創建數據庫命令。但如果創建已經存在的database 對象則會報錯。例如我們再次創建database爲test的數據庫對象,系統將會提示:
mysql> create database test;
ERROR 1007 (HY000): Can't create database 'test'; database exists
mysql>
可以查詢當前數據庫實例擁有那些數據庫名稱以避免上述的錯誤,我們輸入如下命令:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql>
當查看當前所擁有的數據庫對象後,需要繼續切換到需要操作的數據庫對象。切換數據庫語法爲:
USE databaseName;
例如我們切換到我們之前創建的數據對象test
:
mysql> use test;
Database changed
mysql>
當切換到具體的數據庫對象,我們還可以使用命令查詢當前數據庫對象下保存所有表對象:
mysql> show tables;
Empty set (0.00 sec)
mysql>
如果數據庫對象下沒有表對象則會提示Empty set
- 刪除數據庫
如果需要刪除數據庫對象,其語法爲:
DROP DATABASE 數據庫名;
例如刪除我們創建的test數據庫對象:
mysql> drop database test;
Query OK, 0 rows affected (0.01 sec)
mysql>
注意⚠️!!! 刪除數據庫對象後,所屬的數據庫對象下的表也將會被全部刪除,所以請謹慎執行刪除數據庫對象的命令。
- 創建表
在數據庫中創建表對象的語法如下:
CREATE TABLE tablename
(column_name1, column_value1 約束條件,
column_name2, column_value2 約束條件,
column_name3, column_value3 約束條件,
)
例如創建一個tb_person對象表,這個對象擁有姓名(name)、年齡(age)、性別(genderg)三個屬性,其創建命令如下所示:
mysql> create table tb_person(name varchar(50) not null, age int(11) not null, gender varchar(10) not null);
Query OK, 0 rows affected (0.01 sec)
mysql>
當創建表後可以鍵入如下命令查看錶詳情信息語法如下:
DESC 表名;
例如查看tb_person表:
mysql> desc tb_person;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name | varchar(50) | NO | | NULL | |
| age | int(11) | NO | | NULL | |
| gender | varchar(10) | NO | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql>
如果想要看當前表使用的sql引擎、表字符集相關定義、以及創建的表語句可以使用如下命令:
mysql> show create table tb_person;
+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_person | CREATE TABLE `tb_person` (
`name` varchar(50) NOT NULL,
`age` int(11) NOT NULL,
`gender` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
- 刪除表
刪除表的語法與刪除數據庫對象類似,其語法如下:
DROP Table 表名
例如刪除表tb_person:
mysql> drop table tb_person;
Query OK, 0 rows affected (0.01 sec)
mysql>
- 修改表
對於已經建立好的表,如果需要對錶結構做修改如增加列、刪除列或修改列屬性。可以將表drop掉重新建立新表,但是這對那些已經表中擁有大量數據的表並不合適。常常通過是使用alter table語句其常見修改情形如下所示:
- 修改表列的屬性
一般有時候需要將列的類型進行更改,其修改語法如下所示:
ALTER TABLE TABLENAME MODIFY COLUMN 列名A 列屬性 [FIRST | AFTER 列名B]
例如我們將tb_person中的age列屬性由int
更改爲varchar
類型:
mysql> alter table tb_person modify column age varchar(20);
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql>
此時我們查看一下tb_person的表定義信息如下:
mysql> desc tb_person;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name | varchar(50) | NO | | NULL | |
| age | varchar(20) | YES | | NULL | |
| gender | varchar(10) | NO | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
可以看到age屬性由之前的int類型更改爲varchar類型了。
- 增加表列信息
如果需要對已經定義好的表新增一列,其修改語法如下所示:
ALTER TABLE TABLENAME ADD COLUMN 列名A 列屬性 約束條件 [AFTER | FIRST 列名B]
例如我們在表中age後新增一個salary的列屬性:
mysql> alter table tb_person add column salary decimal(10,2) not null after age;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
此時我們查看一下tb_person的表定義信息如下:
mysql> desc tb_person;
+--------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+-------+
| name | varchar(50) | NO | | NULL | |
| age | varchar(20) | YES | | NULL | |
| salary | decimal(10,2) | NO | | NULL | |
| gender | varchar(10) | NO | | NULL | |
+--------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql>
此時可以看到在age列下新增了salary字段。
- 刪除表字段
刪除表字段的語法如下所示:
ALTER TABLE TABLENAME DROP COLUMN 列名
例如我們刪除掉gender字段:
mysql> alter table tb_person drop column gender;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
mysql> desc tb_person;
+--------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+-------+
| name | varchar(50) | NO | | NULL | |
| age | varchar(20) | YES | | NULL | |
| salary | decimal(10,2) | NO | | NULL | |
+--------+---------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql>
- 修改列名
有時候新建立的表名難免有欠缺的地方其修改語法如下所示:
ALTER TABLE TABLENAME CHANGE COLUMN 舊列名 新列名 列屬性 約束
例如將age列名修改爲address 如下所示:
mysql> alter table tb_person change column age address varchar(50) not null;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
mysql> desc tb_person;
+---------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+-------+
| name | varchar(50) | NO | | NULL | |
| address | varchar(50) | NO | | NULL | |
| salary | decimal(10,2) | NO | | NULL | |
+---------+---------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql>
或你注意到modify與change都可以更改列屬性,但不同的是change可以修改列名,modify無法修改列名。
- 更改表名
更改表名的語法如下所示:
ALTER TABLE TABLENAME RENAME TO 新表名
例如將表名tb_person修改爲tb_per如下所示:
mysql> alter table tb_person rename to tb_per;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| tb_per |
+----------------+
1 row in set (0.00 sec)
mysql>
2.2 DML
DML語句是我們平時開發中常常打交道的SQL語句,其主要包括CRUD操作即所謂的增刪改查。
- 表中插入數據
插入表記錄的語法如下所示:
INSERT INTO TABLENAME(列名A,列名B,列名C) values (列值1,列值2,列值3)
例如我們向表tb_person
中添加一條數據如下所示:
mysql> insert into tb_person(name,address,salary) values('張三','上海','15000');
Query OK, 1 row affected (0.00 sec)
如果你插入的數據報 Incorrent String value xxxx 的異常,這通常是數據庫對象編碼集的問題,所以我們設置一下編碼集,關於數據庫中文字符集的問題可以參考我之前的一篇博客 解決Mysql中文插入異常處理。
如果一個表中的所有列都要進行值插入我們還可以簡寫爲如下:
mysql> insert into tb_person values('張三','上海','15000');
Query OK, 1 row affected (0.00 sec)
mysql>
Mysql還支持批量插入數據,其語法如下所示:
INSERT INTO TABLENAME(列名A,列名B,列名C) values (列值1,列值2,列值3),
values (列值4,列值5,列值6),values (列值7,列值8,列值9)
例如我們在表中添加多條記錄如下所示:
mysql> insert into tb_person(name,address,salary) values('張三','上海','15000'),('李四','北京','18000'),('王五','西安','9500');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql>
一般在大量的數據插入的時候特別有效。
- 更新表記錄
當需要對錶中的數據進行更新時,其語法如下所示:
UPDATE TABLENAME SET 列1=值1,列2=值2,列3=值3 where 條件表達式 and 條件表達式...
例如我們將表中姓名爲張三,地址爲23的修改爲趙六、南京 ,薪水 10000如下:
mysql> update tb_person set name='趙六', address ='南京', salary ='10000' where name='張三' and address ='23';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
- 刪除記錄
如果記錄不需要可以進行刪除,則可用delete命令語法如下:
DELETE FROM 表名 WHERE 條件表達式 and 條件表達式 ....
mysql> select * from tb_person;
+--------+---------+----------+
| name | address | salary |
+--------+---------+----------+
| 趙六 | 南京 | 10000.00 |
| 張三 | 上海 | 15000.00 |
| 張三 | 上海 | 15000.00 |
| 張三 | 上海 | 15000.00 |
| 李四 | 北京 | 18000.00 |
| 王五 | 西安 | 9500.00 |
+--------+---------+----------+
6 rows in set (0.00 sec)
例如,在tb_person 中 刪除name=張三,address=上海 的表記錄。
mysql> delete from tb_person where name='張三' and address='上海';
Query OK, 3 rows affected (0.00 sec)
- 查詢記錄
數據插入數據庫中,就可以用SELECT 命令進行各行各樣的查詢,其查詢語法如下:
select 列名1,列名2,列名3 from TABLENAME where 條件表達式 and 條件表達式 ....
例如查詢tb_person表中所有記錄如下所示:
mysql> select * from tb_person;
+--------+---------+----------+
| name | address | salary |
+--------+---------+----------+
| 趙六 | 南京 | 10000.00 |
| 李四 | 北京 | 18000.00 |
| 王五 | 西安 | 9500.00 |
+--------+---------+----------+
3 rows in set (0.00 sec)
其中* 表示匹配表中的所有列,其等價於下列查詢語句:
select name,address,salary from tb_person;
- 查詢不重複記錄
我們現在像這張表中插入重複數據如下所示:
mysql> insert into tb_person values('川建國','America',100000),('蓬佩奧','America',10000),('川建國','America',100000);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
重新查詢所有列數據如下所示:
mysql> select name,address,salary from tb_person;
+-----------+---------+-----------+
| name | address | salary |
+-----------+---------+-----------+
| 趙六 | 南京 | 10000.00 |
| 李四 | 北京 | 18000.00 |
| 王五 | 西安 | 9500.00 |
| 川建國 | America | 100000.00 |
| 蓬佩奧 | America | 10000.00 |
| 川建國 | America | 100000.00 |
+-----------+---------+-----------+
6 rows in set (0.00 sec)
我們可以看到表中查詢出來有三處重複的數據,此時可以使用distinct過濾重複列如下所示:
mysql> select distinct name,address,salary from tb_person;
+-----------+---------+-----------+
| name | address | salary |
+-----------+---------+-----------+
| 趙六 | 南京 | 10000.00 |
| 李四 | 北京 | 18000.00 |
| 王五 | 西安 | 9500.00 |
| 川建國 | America | 100000.00 |
| 蓬佩奧 | America | 10000.00 |
+-----------+---------+-----------+
5 rows in set (0.00 sec)
- 條件查詢
很多情況下條件查詢是我們經常打交道的SQL查詢,可以使用Where搭配多個條件進行查詢,例如查詢address=America的全部記錄如下所示:
mysql> select * from tb_person where address = 'America';
+-----------+---------+-----------+
| name | address | salary |
+-----------+---------+-----------+
| 川建國 | America | 100000.00 |
| 蓬佩奧 | America | 10000.00 |
| 川建國 | America | 100000.00 |
+-----------+---------+-----------+
3 rows in set (0.00 sec)
在條件查詢中組合條件可以使用and表示與關係,or表示或關係。如果是數值類型的還可以使用數學比較運算符如> 、<、=、!=、<=、>= 。例如查詢address=America & salary >=20000的表記錄如下所示:
mysql> select * from tb_person where address='America' and salary>='20000';
+-----------+---------+-----------+
| name | address | salary |
+-----------+---------+-----------+
| 川建國 | America | 100000.00 |
| 川建國 | America | 100000.00 |
+-----------+---------+-----------+
2 rows in set (0.00 sec)
- 列排序以及限制
一般在開發中也有着對某一列進行排序並限制結果集語法如下所示:
SELECT 列名1,列名2 .... from TABLENAME where 條件表達式 and|or 條件表達式.... ORDER BY 列名1,列名2 DESC|ASC
例如我們對錶中列按照薪水大小倒排序並輸出3條記錄如下所示:
mysql> select * from tb_person order by salary desc limit 3;
+-----------+---------+-----------+
| name | address | salary |
+-----------+---------+-----------+
| 川建國 | America | 100000.00 |
| 川建國 | America | 100000.00 |
| 李四 | 北京 | 18000.00 |
+-----------+---------+-----------+
3 rows in set (0.01 sec)
上面DESC與ASC是排序順序的關鍵字,前者表示倒序排序後者表示順序排序。如果排序的字段值一致,且只有一個排序字段則表中相同的記錄將會無序排列,如果有第二個排序字段則按照第二個排序字段進行排序,以此類推。
mysql> select * from tb_person order by salary desc,address asc ;
+-----------+---------+-----------+
| name | address | salary |
+-----------+---------+-----------+
| 川建國 | America | 100000.00 |
| 川建國 | America | 100000.00 |
| 李四 | 北京 | 18000.00 |
| 蓬佩奧 | America | 10000.00 |
| 趙六 | 南京 | 10000.00 |
| 王五 | 西安 | 9500.00 |
+-----------+---------+-----------+
6 rows in set (0.00 sec)
其中上面你也以看到我們在一些SQL語句後面加入了limit關鍵字,關於limit的語法如下所示:
SELECT * from 表名 where 條件表達式1 and 條件表達式2 LIMIT [offset count]
其中offset指的是表中起始偏移量,count表示需要查詢的記錄數。例如從表中第二行開始查詢3條記錄如下所示:
mysql> select * from tb_person order by salary desc limit 1,3;
+-----------+---------+-----------+
| name | address | salary |
+-----------+---------+-----------+
| 川建國 | America | 100000.00 |
| 李四 | 北京 | 18000.00 |
| 趙六 | 南京 | 10000.00 |
+-----------+---------+-----------+
3 rows in set (0.00 sec)
- 分組查詢
一般情況下會對查詢進行分組處理,如按照地區分組查詢每個地區的總人數,其語法如下所示:
SELECT FUNCTION(列名) FROM 表名 where 條件表達式1 and|or 條件表達式2 GROUP BY 列名 HAVING 條件表達式
其中FUNCTION一般指的是聚合函數如SUM、COUNT、AVG、MAX、MIN,GROUP BY 表示按照列名進行分組。
HAVING 對查詢出來的結果在按照條件進行過濾。
這裏需要注意HAVING 與 where區別,HAVING 是對聚合函數的結果進行過濾。而WHERE是對聚合前對錶查詢的記錄進行過濾。
例如以address分組統計人數以及薪水之和如下所示:
mysql> select address, count(*),sum(salary) from tb_person group by address;
+---------+----------+-------------+
| address | count(*) | sum(salary) |
+---------+----------+-------------+
| America | 3 | 210000.00 |
| 北京 | 1 | 18000.00 |
| 南京 | 1 | 10000.00 |
| 西安 | 1 | 9500.00 |
+---------+----------+-------------+
4 rows in set (0.00 sec)
在此基礎上查詢薪水之和大於10000的記錄如下所示:
mysql> select address, count(*),sum(salary) from tb_person group by address having sum(salary)>10000;
+---------+----------+-------------+
| address | count(*) | sum(salary) |
+---------+----------+-------------+
| America | 3 | 210000.00 |
| 北京 | 1 | 18000.00 |
+---------+----------+-------------+
2 rows in set (0.00 sec)
- 表連接查詢
在日常開發中一般業務不會存在在一張表上,根據實際的業務需求將業務數據保存在不同的表上,這裏就牽扯到多表查詢。從連接類型上可分爲內連接、外連接,它們之前的區別就是內連接匹配的是兩表中都相互匹配的數據,而外連接會匹配其他不匹配的記錄。
這裏我們先新建部門表並添加幾條數據如下所示:
mysql> create table tb_department(id int primary key auto_increment,name varchar(30));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tb_department(name) values('技術部門'),('hr'),('產品線');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
同時修改一下tb_person表新增一個de_no的字段如下所示:
mysql> alter table tb_person add column de_no int;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc tb_person;
+---------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+-------+
| name | varchar(50) | NO | | NULL | |
| address | varchar(50) | NO | | NULL | |
| salary | decimal(10,2) | NO | | NULL | |
| de_no | int(11) | YES | | NULL | |
+---------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> update tb_person set de_no=1 where name='趙六';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update tb_person set de_no=2 where name='李四';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update tb_person set de_no=3 where name='王五';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
例如查詢所有員工的名字以及所在的部門如下所示:
mysql> select person.name ,department.name from tb_person person,tb_department department where person.de_no=department.id;
+--------+--------------+
| name | name |
+--------+--------------+
| 趙六 | 技術部門 |
| 李四 | hr |
| 王五 | 產品線 |
+--------+--------------+
3 rows in set (0.00 sec)
上述SQL查詢也等價於下列查詢如下所示:
mysql> select person.name ,department.name from tb_person person inner join tb_department department on person.de_no=department.id;
+--------+--------------+
| name | name |
+--------+--------------+
| 趙六 | 技術部門 |
| 李四 | hr |
| 王五 | 產品線 |
+--------+--------------+
3 rows in set (0.00 sec)
外連接又分爲左外連接與右外連接,其中左外連接包含所有左表的記錄甚至右表沒有和它匹配的記錄如下所示:
mysql> select person.name ,department.name from tb_person person left join tb_department department on person.de_no=department.id;
+-----------+--------------+
| name | name |
+-----------+--------------+
| 趙六 | 技術部門 |
| 李四 | hr |
| 王五 | 產品線 |
| 川建國 | NULL |
| 蓬佩奧 | NULL |
| 川建國 | NULL |
+-----------+--------------+
6 rows in set (0.00 sec)
上述查詢中查詢了所有的人名,即使有些人並不存在合法的部門名稱,右外連接查詢所有的右表記錄,即使左表沒有與其相匹配的記錄。
- 子查詢
某些情況下,當進行查詢的時候通常where後跟的條件是另一個Select語句後的結果,這個時候就要用到子查詢。
一般可以見到的子查詢關鍵字有 in ,not in , = ,!=,exists,not exists等。例如查詢員工部門號在1,2的所有人員信息如下所示:
mysql> select * from tb_person where de_no in (select id from tb_department where id<3);
+--------+---------+----------+-------+
| name | address | salary | de_no |
+--------+---------+----------+-------+
| 趙六 | 南京 | 10000.00 | 1 |
| 李四 | 北京 | 18000.00 | 2 |
+--------+---------+----------+-------+
2 rows in set (0.00 sec)
- 聯合查詢
有時候對多表查詢會進行合集處理,這個時候就可以使用UNION、UNION ALL 關鍵字實現這樣的功能,其語法如下所示:
SELECT * FROM 表1 UNION | UNION ALL SELECT * FROM 表二
UNION 與UNION ALL的區別是前者會將合併的結果進行去重處理而後者將會將所有的記錄都顯示出來
例如將兩張表的部門編號進行聯合查詢如下所示:
mysql> select de_no from tb_person union all select id from tb_department;
+-------+
| de_no |
+-------+
| 1 |
| 2 |
| 3 |
| NULL |
| NULL |
| NULL |
| 1 |
| 2 |
| 3 |
+-------+
9 rows in set (0.00 sec)
mysql> select de_no from tb_person union select id from tb_department;
+-------+
| de_no |
+-------+
| 1 |
| 2 |
| 3 |
| NULL |
+-------+
4 rows in set (0.00 sec)
2.3 DCL
一般DCL語句管理系統權限使用例如創建一個corearchi用戶,並且對test下所有數據庫有着select與insert權限
mysql> grant select,insert on test.* to 'corearchi'@'localhost' identified by '1234@Haha';
Query OK, 0 rows affected(0.01 sec)
此時我們可以使用切換至corearchi用戶登陸並插入數據如下所示:
[root@donniegao ~]# mysql -u corearchi -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.29 MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test;
mysql> desc tb_person;
+---------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+-------+
| name | varchar(50) | NO | | NULL | |
| address | varchar(50) | NO | | NULL | |
| salary | decimal(10,2) | NO | | NULL | |
| de_no | int(11) | YES | | NULL | |
+---------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> insert into tb_person values('小米','北京','30000',3);
Query OK, 1 row affected (0.00 sec)
然後我們在使用root權限收回corearchi的insert權限如下所示:
mysql> revoke insert on test.* from 'corearchi'@'localhost';
Query OK, 0 rows affected (0.01 sec)
然後重新登陸corearchi用戶再來嘗試插入數據如下所示:
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> insert into tb_person values('小米','北京','30000',3);
ERROR 1142 (42000): INSERT command denied to user 'corearchi'@'localhost' for table 'tb_person'
我們發現此時corearchi用戶無法再次向tb_person中插入數據了,因爲其權限已經被收回。
接下來下一節讓我們溫習一下 MYSQL數據類型 。