MySQL語句整理
阿新 • • 發佈:2018-12-29
SQL(Structured Query Language)語句,即結構化查詢語言,是操作和檢索關係資料庫的標準語言。SQL語句一般分為以下幾種:
- DCL(Database Control Language,資料控制語言)語句:主要由GRANT和REVOKE兩個關鍵字完成
- DDL(Database Definition Language,資料定義語言)語句:主要由CREATE、ALTER、DROP和TRUNCATE四個關鍵字完成
- DML(Database Manipulation Language,資料操作語言)語句:主要由INSERT、UPDATE和DELETE三個關鍵字完成
- 查詢語句:主要由SELECT語句完成
- 事務控制語句:主要由COMMIT、ROLLBACK和SAVEPOINT三個關鍵字完成
一.DCL語句
DCL語句就是對使用者進行授權和授權收回的操作,可以對不同的使用者的許可權進行控制,增加資料庫安全性,進行資料庫的維護。一般都是資料庫管理員使用超級使用者root進行操作。 MySQL的許可權命令是grant,許可權撤銷的命令時revoke; 1.grant授權格式: grant 許可權列表 on 庫.表 to 使用者名稱@'ip' identified by "密碼";
2.revoke回收許可權格式:
revoke 許可權列表 on 庫.表 from 使用者名稱@'ip';
二.DDL語句
資料庫物件:
表(table)、資料字典、約束(constraint)、檢視(view)、索引(index)、函式(function)、儲存過程(procedure)、觸發器(trigger)
CREATE、ALTER、DELETE關鍵字分別是建立、修改和刪除資料庫物件的,此處使用我們使用最多的對錶的操作來舉例
1.CREATE:
CREATE TABLE [模式名.] 表名(
該表中的列定義
);
e.g.
CREATE TABLE test(
StuId VARCHAR(8) PRIMARY KEY,
StuName VARCHAR(30) NOT NULL,
StuAge SMALLINT NOT NULL,
StuBirth DATETIME
);
注:查看錶結構:DESCRIBE 表名;
2.ALTER:
1)新增列:
ALTER TABLE 表名
ADD column columnName1 datatype [default expr] [FIRST|AFTER colName];
columnName1:新新增的列名;
datatype:資料型別;
default expr:完整性約束;
FIRST|AFTER colName:插入位置,預設是插入在最後一列,FIRST是在第一列,AFTER colName是在指定列後插入
e.g.
ALTER TABLE test
ADD column StuMajor VARCHAR(20) NOT NULL AFTER StuName;
2)修改列
ALTER TABLE 表名 CHANGE oldName newName datatype;
e.g.
ALTER TABLE test CHANGE StuBirth Birthday year;
3)刪除列
ALTER TABLE 表名 DROP column columnName;
e.g.
ALTER TABLE test DROP column StuMajor;
4)修改表名
ALTER TABEL 表名 RENAME TO 新表名;
e.g.
ALTER TABLE test RENAME TO student;
3.DROP
刪除表
DROP TABLE 表名;
e.g.
DROP TABLE student;
4.TRUNCATE
刪除表內所有資料但保留表的結構,叫做“截斷”
TRUNCATE TABLE 表名;
e.g.
TRUNCATE TABLE student;
三.DML語句
1.INSERT
標準SQL語句只允許一次插入一條資料,但MySQL對其進行擴充套件使其可以一次插入多條資料
插入一條資料:
INSERT INTO 表名 VALUES(value1, value2, ...);
插入多條資料:
INSERT INTO 表名 VALUES(value1,value2,...),(value1,value2,...),(value1,value2,...);
e.g.
INSERT INTO student VALUES(‘001’,'Lisa',20,1997),(‘002’,'Rose',21,1996);
2.UPDATE
UPDATE 表名 SET COLUMN1 = VALUE1[, COLUMN2 = VALUE2]...
[WHERE CONDITION];
e.g.將所有年齡大於20歲的學生的年齡+1
UPDATE student SET StuAge = StuAge+1 WHERE StuAge>20;
3.DELETE
DELETE FROM 表名 [WHERE CONDITION];
e.g.將所有1997年出生的學生資訊刪除
DELETE FROM student WHERE Birthday = 1997;
四.查詢語句
1.單表查詢:
SELECT COLUMN1, COLUMN2...
FROM 資料來源
[WHERE CONDITION]
[GROUP BY columnName]
[ORDER BY columnName DESC|ASC]
e.g.將電腦科學專業的學生選出來並按照學號降序排列,只顯示學生姓名
SELECT StuName FROM student
WHERE StuMajor = 'CS'
ORDER BY StuId DESC;
2.多表查詢:
1)簡單的外連線方式
SELECT VALUE1[,VALUE2]...
FROM tableName1,tableName2
WHERE tableName1.column1 = tableName2.column2[AND ...];
WHERE 後跟的是連線條件和查詢條件
2)自連線:有時需要自己和自己進行連線,叫做自連線
e.g.
有如下的表temp
CREATE TABLE emp(
id INT AUTO_INCRETMENT PRIMARY KEY,
name VARCAHR(255),
mangerId INT,
FOREIGN KEY(managerId) references temp(id)
);
其中有四條記錄
id name managerId
1 aaa null
2 bbb 1
3 ccc 1
4 ddd 1
對該表進行查詢操作:
SELECT employee.id, employee.name 員工名, manager.name 經理名
FROM emp employee, emp manager
WHERE employee.managerId = manager.id;
該查詢語句使用自連線顯示員工和經理的關係,其中:
employee.name 員工名, manager.name 經理名 員工名和經理名是重新命名,在顯示列時顯示員工名和經理名;
FROM emp employee, emp manager 兩個相同的表需要進行區分,起不同的名字;
WHERE employee.managerId = manager.id 是連線條件
更多的多表連線可以參考:
五.事務處理
1.事務是由一步或幾步資料庫操作序列組成的邏輯執行單元。
這系列操作要麼全部執行,要麼全部放棄執行。程式和事務是完全兩種不同的概念。一般而言,一段程式中可能包含多個事務。在MySQL中,有多種引擎,最常用的兩個引擎:InnoDB和MyISAM,其中InnoDB是支援事務的,而MyISAM是不支援的,可以在config配置檔案中對其進行修改。
2.事務的四個特性:
- 原子性(Atomicity):事務是應用中最小的執行單位。
- 一致性(Consistency):事務執行的結果必須讓資料庫從一個一致性的狀態變成另外一個一致性的狀態。一致性是通過原子性保證的
- 隔離性(Isolation):各個事務執行相互不干擾。
- 持續性(Durability):也成為永續性(Persistence),指事務一旦提交,將資料做的任何改變都儲存進物理資料庫。
- DML語句對資料進行操作
- DDL和DCL都各只有一條,因為DDL和DCL語句都會將事務提交
- 顯示提交:commit
- 自動提交:DDL/DCL語句
SET AUTOCOMMIT = {0|1} 0是關閉自動提交(開啟事務),1是開啟自動提交(關閉事務)
5.事務的回滾(rollback)
事務包含的任意一個數據庫操作執行失敗後執行回滾事務,將該事務中進行的操作全部失效。兩種方式:
- 顯示回滾:rollback
- 自動回滾:系統錯誤或強行退出
BEGIN;
INSERT INTO student VALUES(NULL,'001','aaa');
INSERT INTO student VALUES(NULL,'002','bbb');
INSERT INTO student VALUES(NULL,'003','ccc');
SELECT * FROM student; ①
ROLLBACK;
SELECT * FROM student; ②
①語句查詢的結果中包含插入的資料,但如果此時在別的命令列視窗中執行該語句,也不會看到以上的三條資料,體現了事務的隔離性,這三條資料其實並沒有寫入物理資料庫;
在執行了回滾操作後,在②的查詢語句的結果中看不到begin之後的那三條資料
e.g.2
INSERT INTO student VALUES(NULL,'001','aaa');
INSERT INTO student VALUES(NULL,'002','bbb');
SAVEPOINT p;
INSERT INTO student VALUES(NULL,'003','ccc');
SELECT * FROM student; ①
ROLLBACK TO p;
SELECT * FROM student; ②
MySQL還提供關鍵字SAVEPOINT設定中間點,可以設定回滾的位置,①處的查詢語句結果中包含三條插入資料的結果,但②處的查詢結果中不包含中間點p之後插入的資料。需要注意的是,回到中間點的回滾不會結束事務。