目錄
一、庫的管理
1、庫的創建
語法:
create database 【if not exists】 庫名;
2、庫的修改
ALTER DATABASE 表名 CHARACTER SET 字符集;
alter database books
character set 'utf8' ;
3、庫的刪除
drop database if exists 庫名
二、表的管理
1、表的創建
語法:
create table 表名(
列名 列的類型【(長度) 約束】,
列名 列的類型【(長度) 約束】,
列名 列的類型【(長度) 約束】,
........
列名 列的類型【(長度) 約束】
)
案例:在books數據庫中創建表book
CREATE TABLE book (
id INT, #編號
bName VARCHAR(20), #書名
price DOUBLE, #價格
authorId INT, #作者Id
publishDate DATETIME #出版如期
)
創建表aothor
CREATE TABLE author(
id INT, #作者編號
au_name VARCHAR(20),
nation VARCHAR(10)
)
2、表的修改
#①修改列名
ALTER TABLE book
CHANGE COLUMN publishDate pubDate DATETIME --column可以省略
#②修改列的類型或約束
ALTER TABLE book MODIFY COLUMN pubdate TIMESTAMP
#③添加新列
ALTER TABLE `author` ADD COLUMN annual DOUBLE 【first | after字段名】
#④刪除列
ALTER TABLE `author` DROP COLUMN annual
#⑤修改表名
ALTER TABLE `author` RENAME TO book_author
3、表的刪除
drop table if exists 表名
通用寫法:
DROP DATABASE IF EXISTS 舊庫名;
CREATE DATABASE 新庫名 ;
DROP TABLE IF EXISTS 舊庫名;
CREATE TABLE 表名
4、表的複製
僅僅複製表的結構
CREATE TABLE COPY LIKE 表名
複製表結構+數據
CREATE TABLE COPY2 SELECT * FROM 表名
三、常見的數據類型
整型
小數
位類型
char和varchar類型
binary和varbinary類型
Enum類型
Set類型
日期和時間類型
datetime和timestamp的區別
常見約束
含義:一種限制,用於限制表中的數據,爲了保證表中的數據的準確性和可靠性
分類:六大約束
NOT NULL:非空,用於保證該字段的值不能爲空。比如姓名、學號等
DEFAULT:默認,用於保證該字段的默認值,比如性別
PRIMARY KEY:主鍵,用於保證該字段的值具有唯一性,並且非空
UNIQUE:唯一,用於保證該字段具有唯一性,可以爲空,比如座位號
CHECK:檢查約束【MySQL不支持】比如年齡、性別
FOREIGN KEY:外鍵,用於限制兩個表的關係,用於保證該字段的值必須來自於主表的關聯列的值
比如:學生表的專業編號,員工表的部門編號,員工表的工種編號
添加約束的時機(前提是沒有數據):
1、創建表時
2、修改表時
約束的添加分類:
列級約束
6大約束語法都支持,但外鍵約束沒有效果
表級約束
除了非空、默認,其他的都支持
創建表時添加約束
1、添加列級約束
語法:直接在字段名和類型後面追加約束類型即可
只支持 主鍵、非空、默認、唯一
CREATE TABLE stuinfo(
id INT PRIMARY KEY,#主鍵
stuName VARCHAR(20) NOT NULL UNIQUE,#非空
gender CHAR(1) CHECK(gender='男' OR gender ='女'),#檢查
seat INT UNIQUE,#唯一
age INT DEFAULT 18,#默認約束
majorId INT REFERENCES major(id)#外鍵
);
2、添加表級約束
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT,
CONSTRAINT pk PRIMARY KEY(id),#主鍵
CONSTRAINT uq UNIQUE(seat),#唯一鍵
CONSTRAINT ck CHECK(gender ='男' OR gender = '女'),#檢查
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)#外鍵
);
3、主鍵和唯一的對比
保證唯一性 | 是否允許爲空 | 一個表中可以有多少個 | 是否允許組合 | |
主鍵 | √ | × | 至多有1個 | √,但不推薦 |
唯一 | √ | √ | 可以有多個 | √,但不推薦 |
-- 通用的寫法:★
CREATE TABLE IF NOT EXISTS stuinfo(
id INT PRIMARY KEY,
stuname VARCHAR(20),
sex CHAR(1),
age INT DEFAULT 18,
seat INT UNIQUE,
majorid INT,
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
);
4、外鍵的特點
外鍵:
1、要求在從表設置外鍵關係
2、從表的外鍵列的類型和主表的關聯列的類型要求一致或兼容,名稱無要求
3、主表的關聯列必須是一個key(一般是主鍵或唯一)
4、插入數據時,先插入主表,再插入從表
刪除數據時,先刪除從表,再刪除主表
修改表時添加約束
1、添加列級約束
alter table 表名 modify column 字段名 字段類型 新約束;
2、添加表級約束
alter table 表名 add 【constraint 約束名】 約束類型(字段名) 【外鍵的引用】;
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT
)
DESC stuinfo;
-- 1.添加非空約束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
-- 2.添加默認約束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
-- 3.添加主鍵
-- ①列級約束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
-- ②表級約束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);
修改表時刪除約束
-- 1.刪除非空約束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
-- 2.刪除默認約束
ALTER TABLE stuinfo MODIFY COLUMN age INT ;
-- 3.刪除主鍵
ALTER TABLE stuinfo DROP PRIMARY KEY;
-- 4.刪除唯一
ALTER TABLE stuinfo DROP INDEX seat;
-- 5.刪除外鍵
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;
案例
-- 1.向表emp2的id列中添加PRIMARY KEY約束(my_emp_id_pk)
ALTER TABLE emp2 MODIFY COLUMN id INT PRIMARY KEY;
ALTER TABLE emp2 ADD CONSTRAINT my_emp_id_pk PRIMARY KEY(id);
-- 2.向表dept2的id列中添加PRIMARY KEY約束(my_dept_id_pk)
-- 3.向表emp2中添加列dept_id,並在其中定義FOREIGN KEY約束,與之相關聯的列是dept2表中的id列。
ALTER TABLE emp2 ADD COLUMN dept_id INT;
ALTER TABLE emp2 ADD CONSTRAINT fk_emp2_dept2 FOREIGN KEY(dept_id) REFERENCES dept2(id);
位置 支持的約束類型 是否可以起約束名
列級約束: 列的後面 語法都支持,但外鍵沒有效果 不可以
表級約束: 所有列的下面 默認和非空不支持,其他支持 可以(主鍵沒有效果)
標識列
又稱爲自增長列
含義:可以不用手動的插入值,系統提供默認的序列值
特點:
1、標識列必須和主鍵搭配嗎?不一定,但要求是一個key
2、一個表可以有幾個標識列?至多一個!
3、標識列的類型只能是數值型
4、標識列可以通過 SET auto_increment_increment=3;設置步長
可以通過 手動插入值,設置起始值
DROP TABLE IF EXISTS tab_identity;
CREATE TABLE tab_identity(
id INT PRIMARY KEY AUTO_INCREMENT ,
NAME VARCHAR(20),
seat INT
);
INSERT INTO tab_identity(NAME) VALUES('lucy');
INSERT INTO tab_identity(id,NAME) VALUES(NULL,'john'); -- 多次插入