1. 程式人生 > 實用技巧 >MySql的回顧九DML表資料的增,刪,改,與DDL庫表的增刪改,約束

MySql的回顧九DML表資料的增,刪,改,與DDL庫表的增刪改,約束

  雷霆空霹靂,雲雨竟虛無。炎赫衣流汗,低垂氣不蘇。杜聖人熱的時候不知是怎麼解暑的???但這邊這幾天天氣好像一直都不是太好哎!
  不過無所謂了,都過了這麼長時間,也習慣了,我還是繼續帶各位看官複習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;