MySql的回顧九DML表資料的增,刪,改,與DDL庫表的增刪改,約束
阿新 • • 發佈:2020-08-16
雷霆空霹靂,雲雨竟虛無。炎赫衣流汗,低垂氣不蘇。杜聖人熱的時候不知是怎麼解暑的???但這邊這幾天天氣好像一直都不是太好哎!
不過無所謂了,都過了這麼長時間,也習慣了,我還是繼續帶各位看官複習MySql的DML與DDL語言。
DML語言
1.插入方式一
語法:INSERT INTO 表名(欄位名,...) VALUES(值,...);
特點:
①要求值得型別和欄位的型別要一直或相容。相容【‘123’=123】插入自動轉換不會報錯
②欄位的個數和順序不一定與原始表中的欄位個數和順序一致
但必須保證和欄位一一對應
③假如表中有可以為NULL的欄位,注意可以通過以下兩種方式插入NULL值
方式一:欄位與值都省略
方式二:欄位寫上,值用NULL
④欄位和值個數必須一致
⑤欄位名可以省略,預設為所有列
2.插入方式二
語法:INSERT INTO 表名 SET 欄位=值,欄位=值,...
兩種方式的區別:
方式一:支援一次插入多行,語法如下:
INSERT INTO 表名【(欄位名,...)】 VALUES(值,...),(值,...),...;
方式一支援子查詢
INSERT INTO 表名;
查詢語句;
四.修改
1.修改表裡面的記錄★
語法:UPDATE 表名 SET 欄位=值,欄位=值 【where 篩選條件】;
2.修改多表的記錄【補充】
語法:
UPDATE 表1 別名 LEFT|RIGHT|INNER JOIN 表2 別名
ON 連線條件
SET 欄位=值,欄位=值 【WHERE 篩選條件】;
五.刪除
方式一:使用DELETE
一。刪除單表的記錄
語法:DELETE FROM 表名 【WHERE篩選條件】【LIMIT條目數】;
例:
DELETE FROM beauty LIMIT 1;
DELETE FROM beauty WHERE id=13 LIMIT 1;
二。級聯刪除【補充】
語法:
DELETE FROM 表1 別名1,別名2
FROM 表1 別名
INNER|LEFT|RIGHT JOIN 表2 別名
ON 連線條件
【WHERE 篩選條件】;
方式二:TRUNCATE
語法:TRUNCATE TABLE 表名;
兩種方式的區別【面試題】★
1.TRUNCATE刪除後,如果再插入,識別符號從1開始
DELETE刪除後,如果再插入,識別符號從斷點開始
2.DELETE可以新增篩選條件
TRUNCATE不可以新增篩選條件
3.TRUNCATE效率高
4.TRUNCATE沒有返回值
DELETE可以返回受影響的行數
5.TRUNCATE不可以回滾
DELETE可以回滾
DDL語言
1.庫的管理
一.建立庫
CREATE DATABASE 【IF NOT EXISTS】 庫名 【CHARACTER SET 字符集】;
二.修改庫
ALTER DATABASE 庫名 CHARACTER SET 字符集;
三.刪除庫
DROP DATABASE 【IF EXISTS】 庫名;
2.表的管理
一.建立表
CREATE TABLE 【IF NOT EXISTS】 表名(
欄位名 欄位型別 【約束】,
欄位名 欄位型別 【約束】,
...
欄位名 欄位型別 【約束】
);
二.修改表
新增列
ALTER TABLE 表名 ADD COLUMN 列名 型別
【FIRST|AFTER 欄位名】;
例:建立一張表
CREATE TABLE test_add_column(
t1 INT,
t2 INT,
t3 INT
);
在最前面插入一列
ALTER TABLE test_add_column ADD COLUMN newT INT FIRST;
DESC test_add_column;
在某一列後面面插入一列
ALTER TABLE test_add_column ADD COLUMN newT2 INT AFTER t2;
DESC test_add_column;
修改列的型別或約束
ALTER TABLE 表名 MODIFY COLUMN 列名 新型別 【新約束】;
修改列名,還可以修改資料型別
ALTER TABLE 表名 CHANGE COLUMN 舊列名 新列名 型別;
刪除列
ALTER TABLE 表名 DROP COLUMN 列名;
修改表名
ALTER TABLE 表名 RENAME 【TO】 新表名;
三.刪除表
DROP TABLE 【IF EXISTS】 表名;
複製表
1.複製表的結構
CREATE TABLE 表名 LIKE 舊錶;
2.複製表的結構+資料
CREATE TABLE 表名
SELECT 查詢列表 FROM 舊錶【WHERE 篩選】;
#常見約束
含義:一種限制,用於限制表中的資料,為了保證表中的資料的準確性和可靠性(一致性)
分類:六大約束
NOT NULL:非空,用於保證該欄位的值不能為空。
比如:姓名,學號等
DEFAULT:預設,用於保證該欄位有預設值。
比如性別
PRIMARY KEY:主鍵,用於保證該欄位的值具有唯一性,並且非空。
比如學號,員工編號
UNIQUE:唯一,用於保證該欄位的值具有唯一性,可以為空。
比如座位號
CHECK:檢查約束【mysql中不支援但相容不報錯,oracle與SQLserver支援】。
比如年齡,性別
FOREIGN KEY:外來鍵,用於限制兩個表的關係,用於保證該欄位的值必須來自於主表的關聯列的值,在從表新增外來鍵約束,用於引用主表中的某列的值。
比如學生表的專業編號,員工表的部門編號,員工表的工種編號。
新增約束的時機:
1.建立表時
2.修改表時
約束的新增分類:
列級約束:直接跟在列後面的約束
比如:欄位名 欄位型別 列級約束,
支援性:六大約束語法都支援,但外來鍵約束沒有效果
表級約束:脫離欄位在最後面
比如:欄位名 欄位型別,欄位名 欄位型別,
表級約束
支援性:除了非空,預設,其他的都支援
CAERTE TABLE 表名(
欄位名 欄位型別 列級約束,
欄位名 欄位型別,欄位名 欄位型別,
表級約束
);
建立表新增約束
新增列級約束,
#建立一個庫
CREATE DATABASE students;
建立表新增約束
1.新增列級約束,
以下案例只做演示。
USE students;
CREATE TABLE stuinfo(
id INT PRIMARY KEY, #主鍵
stuName VARCHAR(20) NOT NULL,#非空
gender CHAR(1) CHECK(gender='男' OR gender='女'),#檢查
age INT DEFAULT 18,#預設約束
majorId INT REFERENCES major(id) #外來鍵,這條是示例演示
);
DESC stuinfo;
CREATE TABLE major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
);
DESC major;
#檢視stuinfo表中所有的索引,包括主鍵,外來鍵,唯一
SHOW INDEX FROM stuinfo;
列級約束欄位後面可以追加多個約束如下stuName欄位,非空,唯一。 CREATE TABLE stuinfo( id INT, stuName VARCHAR(20) NOT NULL UNIQUE , gender CHAR(1), seat INT, age INT, majorid INT, PRIMARY KEY(id,stuname),#主鍵 UNIQUE(seat), FOREIGN KEY(majorid) REFERENCES major(id)#外來鍵 );
新增表約束
語法:在各個欄位的最下面 【CONSTRAINT 約束名】 約束型別(欄位名) 【可以忽略】 #1.先刪除原有的表 DROP TABLE IF EXISTS stuinfo; #建立表,用表約束新增約束條件 CREATE TABLE stuinfo( id INT, stuname VARCHAR(20), gender CHAR(1), seat INT, age INT, majorid INT, CONSTRAINT zj PRIMARY KEY(id),#主鍵 CONSTRAINT weiyi UNIQUE(seat),#唯一鍵 CONSTRAINT ck CHECK(gender='男' OR gender='女'),#檢查 CONSTRAINT wj FOREIGN KEY(majorid) REFERENCES major(id)#外來鍵 );
#檢視約束
SHOW INDEX FROM stuinfo;
#不新增別名字建立標記約束
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT,
PRIMARY KEY(id),#主鍵
UNIQUE(seat),#唯一性
CHECK(gender='男' OR gender='女'),#檢查
FOREIGN KEY(majorid) REFERENCES major(id)#外來鍵
);
#檢視約束
SHOW INDEX FROM stuinfo;
#通用的寫法:
CREATE TABLE IF NOT EXISTS stuinfo(
id INT PRIMARY KEY,
stuname VARCHAR(20) NOT NULL,
sex CHAR(1),
age INT DEFAULT 18,
seat INT UNIQUE,
majorid INT,
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(ID)
#CONSTRAINT 別名 FOREIGN KEY(欄位) REFEREENCES 表名(對應的欄位)
);
主鍵與外來鍵
#插入測試資料
INSERT INTO major VALUES(1,'java');
INSERT INTO major VALUES(2,'TypeScript');
#插入測試資料
INSERT INTO stuinfo VALUES(1,'zhangsan','男',NULL,19,1);
INSERT INTO stuinfo VALUES(2,'zhaoliu','男',NULL,19,2);
插入報錯:
/* SQL Error (1366): Incorrect string value:
'\xE7\x94\xB7' for column 'sex' at row 1 */
/* Affected rows: 0 Found rows: 0 Warnings:
0 Duration for 0 of 2 queries: 0.000 sec. */
只允許一個為空,第二個為空報錯
驗證:多個欄位設定唯一性
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(20),
seat INT,
age INT,
majorid INT,
seat2 INT,
PRIMARY KEY(id),#主鍵
UNIQUE(seat),#唯一性
UNIQUE(seat2),
CHECK(gender='男' OR gender='女'),#檢查
FOREIGN KEY(majorid) REFERENCES major(id)#外來鍵
);
刪除表
DROP TABLE IF EXISTS stuinfo;
#重新建表驗證是否允許兩個列組成一個主鍵,或者執行兩個列組成一個唯一鍵
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
seat INT,
age INT,
majorid INT,
PRIMARY KEY(id,stuname),#主鍵
UNIQUE(seat),#唯一性
FOREIGN KEY(majorid) REFERENCES major(id)#外來鍵
);
#插入測試資料
INSERT INTO stuinfo VALUES(1,'zhangsan',NULL,19,1);
INSERT INTO stuinfo VALUES(2,'zhangsan',NULL,19,1);
#刪除原來的資料
DELETE FROM stuinfo;
#測試編號重複能否插入
INSERT INTO stuinfo VALUES(1,'zhangsan',NULL,19,1);
INSERT INTO stuinfo VALUES(1,'xiongda',NULL,19,1);
#刪除原來的資料
DELETE FROM stuinfo;
組合唯一鍵
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
seat INT,
age INT,
majorid INT,
seat2 INT,
PRIMARY KEY(id,stuname),#主鍵
UNIQUE(seat,seat2),#唯一性
FOREIGN KEY(majorid) REFERENCES major(id)#外來鍵
);
#刪除原來的資料
DELETE FROM stuinfo;
#插入測試資料
INSERT INTO stuinfo VALUES(1,'zhangsan',1,19,1,2);
INSERT INTO stuinfo VALUES(2,'xiongda',1,19,1,1);
外來鍵的特點
#外來鍵
/*
1.要求在從表設定外來鍵關係。
2.從表的外來鍵列的型別和主表的關聯列要求一致或相容,名稱無要求
3.要求主表的關聯列必須是一個key(一般是主鍵或者是唯一鍵)
4.插入資料時,先插入主表的資料,在插從表。
刪除資料時,先刪從表,再刪主表。
*/
刪除表
DROP TABLE IF EXISTS stuinfo;
DROP TABLE IF EXISTS major;
建立表,建立外來鍵引用
CREATE TABLE major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
);
建立主表成功
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT,
PRIMARY KEY(id,stuname),#主鍵
UNIQUE(seat),
FOREIGN KEY(majorid) REFERENCES major(id)#外來鍵
);
刪除表
DROP TABLE IF EXISTS stuinfo;
DROP TABLE IF EXISTS major;
建立表,建立唯一鍵引用
CREATE TABLE major(
id INT UNIQUE,
majorName VARCHAR(20)
);
建立主表成功
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT,
PRIMARY KEY(id,stuname),#主鍵
UNIQUE(seat),
FOREIGN KEY(majorid) REFERENCES major(id)#外來鍵
);
修改表約束
#刪除表,重新建立
DROP TABLE IF EXISTS stuinfo;
DROP TABLE IF EXISTS major;
CREATE TABLE major(
id INT UNIQUE,
majorName VARCHAR(20)
);
建立一個沒有約束的表
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT
);
#1.新增非空約束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
DESC stuinfo;
#2.新增預設約束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
DESC stuinfo;
#3.①列級約束新增主鍵
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
DESC stuinfo;
#②表級約束新增主鍵
ALTER TABLE stuinfo ADD PRIMARY KEY(id);
#列級約束新增唯一
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
#表級約束新增唯一
ALTER TABLE stuinfo ADD UNIQUE(seat);
#新增外來鍵列級約束(表級無效)
ALTER TABLE stuinfo ADD FOREIGN KEY(majorid) REFERENCES major(id);
#別名寫法
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id);
小結
建立表時新增約束
#1.新增列級的約束
ALTER TABLE 表名 MODIFY COLUMN 欄位名 欄位型別 新的約束;
#2.新增表級的約束
ALTER TABLE 表名 ADD 【CONSTRAINT 約束名】 約束型別(欄位名) 【外來鍵的引用】;
刪除約束
#修改表時刪除約束
#刪除非空約束#NULL可以省略
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
#刪除預設約束,省略了NULL
ALTER TABLE stuinfo MODIFY COLUMN age INT;
#刪除主鍵
ALTER TABLE stuinfo DROP PRIMARY KEY;
#刪除唯一鍵
ALTER TABLE stuinfo DROP INDEX seat;
#檢視
SHOW INDEX FROM stuinfo;
DESC stuinfo;
#刪除外來鍵約束,執行成功但刪不掉。
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;
刪除外來鍵的方法
展現表結構,檢視建立表的SQL語句
SHOW CREATE TABLE stuinfo;
SHOW CREATE TABLE 表名;
刪除
alter table stuinfo drop foreign key stuinfo_ibfk_1;
ALTER TABLE 表名 DROP FOREIGN KEY 所查的欄位名
標識列(自增)
/*
又稱為自增長列
含義:可以不用手動的插入值,系統提供預設的序列值
特點:
1.標識列必須與主鍵與唯一鍵搭配使用,要求是一個key(主鍵,外來鍵,唯一鍵)。
2.一個表中只能有一個自增長列。
3.標識列的型別只能是數值型,一般是INT。
4.標識列通過SET auto_increment_increment=1;設定步長,也可以通過手動方式插入值。
*/
#一.建立表時設定標識列
CREATE TABLE tab_identity(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
#清空表
TRUNCATE TABLE tab_identity;
#插入資料測試
INSERT INTO tab_identity VALUES(NULL,'xiongda');
INSERT INTO tab_identity VALUES(NULL,'xionger');
INSERT INTO tab_identity(NAME) VALUES('guangtouqiang');
#檢視資料
SELECT * FROM tab_identity;
變數VARIABLES歪瑞抱
#檢視系統變數/MySql中起始值設定無效,偏移量設定有效
SHOW VARIABLES LIKE '%auto_increment%';
#修改(步長)偏移值
SET auto_increment_increment=3;
#清空表
TRUNCATE TABLE tab_identity;
#插入資料測試
INSERT INTO tab_identity VALUES(NULL,'xiongda');
INSERT INTO tab_identity VALUES(NULL,'xionger');
INSERT INTO tab_identity(NAME) VALUES('guangtouqiang');
#手動更改起始值
INSERT INTO tab_identity VALUES(10,'xiongda');
INSERT INTO tab_identity VALUES(NULL,'xionger');
INSERT INTO tab_identity(NAME) VALUES('guangtouqiang');
#檢視資料
SELECT * FROM tab_identity;
#二,修改表時設定標識列
#建立測試表
CREATE TABLE tab_identity2(
id INT,
NAME FLOAT,
seat INT
);
#新增標識列
ALTER TABLE tab_identity2 MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;
#查看錶結構
DESC tab_identity2;
#修改表時刪除標識列
ALTER TABLE tab_identity2 MODIFY COLUMN id INT;
#查看錶結構
DESC tab_identity2;
感謝各位讀者朋友們的耐心觀看,SQL的路還很長,在漫漫長路上還是要照顧好自己,才能走得更長遠。
#建立一個庫
CREATEDATABASEstudents; |
建立表新增約束
1.新增列級約束,
以下案例只做演示。
USEstudents; |
CREATETABLEstuinfo( idINTPRIMARYKEY,#主鍵 stuNameVARCHAR(20)NOTNULL,#非空 genderCHAR(1)CHECK(gender='男'ORgender='女'),#檢查 ageINTDEFAULT18,#預設約束 majorIdINTREFERENCESmajor(id)#外來鍵,這條是示例演示 ); |
DESCstuinfo; |