-
事物---功能---用途---實現條件---實現步驟/操作步驟(注意事項)---問題---解決
-
今天學了什么
-
對已經創建的表進行添加、修改、刪除、約束操作、數據類型、ddl語句、約束
-
-
DDL語句DDL(Data Definition Languages)語句: 數據定義語言,這些語句定義了不同的數據段、數據庫、表、列、索引等數據庫對象的定義。 常用的語句關鍵字主要包括 create、drop、alter等。
-
庫的管理
-
語法
-
創建庫
-
CREATE DATABASE dbname;
-
-
查看已經存在的數據庫
-
SHOW DATABASES;
-
-
顯示數據庫創建語句
-
SHOW CREATE DATABASE db_name;
-
-
選擇數據庫
-
USE dbname;
-
-
查看數據庫中的表
-
SHOW TABLES;
-
-
刪除數據庫
-
DROP DATABASE [IF EXISTS] dbname;IF EXISTS判斷是否存在而刪除
-
-
建立一個數據庫並制定編碼格式
-
create database 數據庫名 default charset utf8 collate utf8_general_ci;
-
-
-
修改、備份、恢復數據庫
-
備份
-
mysqldump -u 用戶名 -p 數據庫名 > 導出的文件名
-
-
導入
-
mysql>source 導入的文件名;
-
-
-
-
表的管理
-
創建表
-
CREATE TABLE IF NOT EXISTS stuinfo( stuId INT, stuName VARCHAR(20), gender CHAR, bornDate DATETIME );
-
-
修改表
-
ALTER TABLE 表名 ADD|MODIFY|DROP|CHANGE COLUMN 字段名 【字段類型】;
-
添加新列及其定義放在ADD COLUMN子句之后。 請注意,COLUMN關鍵字是可選的,因此可以省略它。
-
-
修改字段名
-
ALTER TABLE studentinfo CHANGE COLUMN sex gender CHAR;
-
-
修改表名
-
ALTER TABLE stuinfo RENAME [TO] studentinfo;
- TO 為可選參數,使用與否均不影響結果。
-
-
修改表的字符集
-
altertable student character set utf8;
-
-
修改字段類型和列級約束
-
ALTER TABLE studentinfo MODIFY COLUMN borndate DATE ;
-
-
添加字段
-
ALTER TABLE studentinfo ADD COLUMN email VARCHAR(20) first;
-
-
給表添加注釋
-
ALTER TABLE `mydb1`.`employees` COMMENT='員工表';
-
`mydb1`.`employees`:這個可以用鼠標點2下數據庫然后’.‘調用出表名
-
-
-
刪除字段
-
ALTER TABLE studentinfo DROP COLUMN email;
-
-
刪除表
-
DROP TABLE [IF EXISTS] studentinfo;
-
-
查看表結構(以表格形式展示表結構)
-
DESCRIBE <表名>;
-
-
以SQL語句的形式展示表結構
-
SHOW CREATE TABLE <表名>;
-
-
-
注意事項
-
創建表時,要根據需保存的數據創建相應的列,並根據數據的類型定義相應的列類型。例:user對象
-
添加新列及其定義放在ADD COLUMN子句之后。 請注意,COLUMN關鍵字是可選的,因此可以省略它。
-
第三,MySQL允許通過指定FIRST關鍵字將新列添加到表的第一列。 它還允許您使用AFTER existing_column子句在現有列之后添加新列。如果沒有明確指定新列的位置,MySQL會將其添加為最后一列。
-
-
約束
-
常見約束
-
NOT NULL
-
非空,用於保證該字段的值不能為空。例如學生表的學生姓名及學號等等。
-
-
DEFAULT
-
默認值,用於保證該字段有默認值。例如學生表的學生性別。
-
-
UNIQUE
-
唯一,用於保證該字段的值具有唯一性,可以為空。例如注冊用戶的手機號,身份證號等。
-
-
CHECK
-
檢查約束(MySql不支持),檢查字段的值是否為指定的值。
-
-
PRIMARY KEY
-
主鍵,用於保證該字段的值具有唯一性並且非空。例如學生表的學生學號等。
-
-
FOREIGN KEY
-
外鍵,用於限制兩個表的關系,用於保證該字段的值必須來自於主表的關聯列的值,在從表添加外鍵約束,用於引用主表中某些的值。例如學生表的專業編號
-
-
-
列級約束
-
作用在一個列上
-
定義方式:列約束必須跟在列的定義里后面
-
-
表級約束除了非空、默認其他都支持
-
可以作用在多個列,也可以作用在一個列
-
定義方式:表約束不與列一起,而是單獨定義。
-
-
實現步驟
-
創建表時添加約束
-
表級約束
語法: 在各個字段的最下面 CONSTRAINT 約束名 約束類型(字段名) DROP TABLE IF EXISTS stuinfo; CREATE TABLE stuinfo( id INT, stuname VARCHAR(20), sex CHAR(1), seat INT, age INT, majorid INT, # 約束 CONSTRAINT ys PRIMARY KEY(id),# 主鍵 CONSTRAINT uq UNIQUE(seat),# 唯一鍵 CONSTRAINT ck CHECK(sex='男'OR sex='女'),# 檢查 CONSTRAINT fk FOREIGN KEY(majorid) REFERENCES major(id)# 外鍵 );
-
列級約束
語法: 直接在字段名和類型后面追加約束類型即可 mysql只支持:默認、非空、主鍵、唯一 USE students; CREATE TABLE stuinfo( id INT PRIMARY KEY,#主鍵 stuName VARCHAR(20) NOT NULL,#姓名 sex CHAR(1) CHECK(sex='男'OR sex='女'), #性別 seat INT UNIQUE,#唯一 age INT DEFAULT 19,#默認約束 majorID INT /foreign key/ REFERENCES marjor(id)#外鍵 ); CREATE TABLE major( id INT PRIMARY KEY, majorName VARCHAR(20) )
-
-
修改表時
-
添加列級約束
-
alter table 表名 modify column 字段名 字段類型 新約束
-
-
添加表級約束
-
alter table 表名 add [ constraint 約束名] 約束類型 (字段名) [外鍵的引用]
-
-
添加約束
USE students; DROP TABLE IF EXISTS stuinfo; CREATE TABLE stuinfo( id INT, stuname VARCHAR(20), sex CHAR(1), seat INT, age INT, majorid INT ) DESC stuinfo; 1.添加非空約束 ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL; #約束 CONSTRAINT ys PRIMARY KEY(id),#主鍵 CONSTRAINT uq UNIQUE(seat),#唯一鍵 CONSTRAINT ck CHECK(sex='男'OR sex='女'),#檢查 CONSTRAINT fk FOREIGN KEY(majorid) REFERENCES major(id)#外鍵,references指向主鍵 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); 4.添加唯一鍵 #列級約束 ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE; #表級約束 ALTER TABLE stuinfo ADD UNIQUE(seat); 5.添加外鍵
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id); -
刪除約束
#1.刪除非空約束 ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL; #2.刪除默認約束 ALTER TABLE stuinfo MODIFY COLUMN age INT; #3.刪除主鍵 ALTER TBALE stuinfo DROP PRIMARY KEY; #4.刪除唯一 ALTER TABLE stuinfo DROP INDEX seat; #5.刪除外鍵 ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major; SHOW INDEX FROM stuinfo;
-
-
-
-
注意事項
-
在什么時候創建約束:創建表時;修改表時;約束的添加分類。
-
非空的約束只能定義在列上
-
請注意,COLUMN關鍵字是可選的,因此可以省略它。
-
-
1.查詢約束: SELECT * FROM information_schema.`TABLE_CONSTRAINTS`;(可以通過where table_name=‘student‘來約定只查詢某個表的約束)其實每次添加約束都是將添加的約束的信息存儲到了information_schema這個schema的table_constraints表里;(mysql里``和bash的很像,也是執行``內的表達式而不是將里面作為字符串使用)
-
2.查看所有的觸發器:select* from information_schema.triggers;
-
-
外鍵
-
用於限制兩個表的關系,從表的字段值引用了主表的某字段值,外鍵列和主表的被引用列要求類型一致,意義一樣,名稱無要求;主表的被引用列要求是一個key (一般就是主鍵); 插入數據,先插入主表刪除數據,先刪除從表
-
-
數據類型
-
主要包括以下五大類
-
整數類型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT
-
浮點數類型:FLOAT、DOUBLE、DECIMAL
-
字符串類型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB
-
日期類型:Date、DateTime、TimeStamp、Time、Year
-
其他數據類型:BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection等
-
-
具體看 這個去吧(菜鳥教程)
-
代碼練習:
#選擇到star數據庫 USE star; #創建一個student表 CREATE TABLE student( #定義id為int類型並設置主鍵 id INT PRIMARY KEY, #定義name為varchar類型,位數為50,不能為空】 NAME VARCHAR(50) NOT NULL, #定義age為int類型,位數為3 age INT(3), #定義address為varchar類型,位數100 address VARCHAR(100), #定義birth為datetime類型 birth DATETIME )#設置儲存引擎,設置編碼格式 ENGINE=INNODB DEFAULT CHARSET=utf8; #查詢一個剛才創建的表 select * from 表名; SELECT * FROM student; #修改表名 rename table 表名 to 修改的表名; RENAME TABLE student TO sys_student; #查詢修改后的表名看修改成功沒 SELECT * FROM sys_student;#修改成功 #alter:對已經創建的表進行添加、修改、刪除、約束操作 #增加列 語法:alter table 表名 add 列名 數據類型; ALTER TABLE sys_student ADD sex CHAR(2); #修改列 語法:alter table 表名 modify 要修改的列名 修改的數據類型; ALTER TABLE sys_student MODIFY address VARCHAR(150) NOT NULL; #刪除列 語法:alter table 表名 drop 要刪除的列名 ALTER TABLE sys_student DROP sex; #查詢下表看刪除了沒有 SELECT * FROM sys_student;#sex列已經被刪除了 SELECT * FROM employees; #創建員工表,並添加外鍵約束 CREATE TABLE employees( employee_id INT, first_name VARCHAR(50), job_id VARCHAR(50) NOT NULL, #定義一個salary,類型為double salary DOUBLE, dept_id INT, /* 約束英文:constraint 約束實際上就是表中數據的限制條件 表級約束可以給約束起名字(方便以后通過這個名字來刪除這個約束) 在定義完所有列之后指定主鍵,語法:constraint 約束的名字 約束類型 (作用列名)*/ #emp_id_pk是約束名字,employee_id是約束的列,primary key:主鍵約束 CONSTRAINT emp_id_pk PRIMARY KEY(employee_id), /*MySQL提供了另一種稱為UNIQUE索引的索引,它允許您在一個或多個列中強制實現值的唯一性。與PRIMARY KEY索引不同,每個表可以有多個UNIQUE索引。 */ #給first_name列約束值唯一 CONSTRAINT emp_first_name_uk UNIQUE(first_name), /*CHECK <表達式> “表達式”指的就是 SQL 表達式,用於指定需要檢查的限定條件。 注意:若將CHECK約束子句置於所有列的定義以及主鍵約束和外鍵定義之后,則這種約束也稱為基於表的 CHECK 約束。該約束可以同時對表中多個列設置限定條件。*/ #給salary約束值不能為負數 CONSTRAINT emp_salary_min CHECK(salary>0), /*REFERENCES對象權限。 建立外鍵關系權限。 用戶要在tb1上建立外鍵,外鍵指向tb2,那么該用戶必須在tb2上有REFERENCES權限。 外鍵首先是表中的一個字段,它可以不是本表的主鍵 但對應另外一個表的主鍵! 主表與從表:若同一個數據庫中,b表的外鍵與a表的主鍵相對應,則a表為主表,b表為從表 */ #創建外鍵的語法: [constraint<外鍵名>] FOREIGN KEY 字段1[,字段名2,...] #references<主鍵名> 主鍵列1[,主鍵列2,...] #外鍵名 為定義外鍵約束的名稱;字段名 表示子表需要添加外鍵約束的子段列 #給dept_id列添加外鍵並和主鍵建立關系,用references建立 CONSTRAINT emp_dept_fk FOREIGN KEY (dept_id)REFERENCES department(dept_id) ) #創建主表 CREATE TABLE department( dept_id INT, dept_name VARCHAR(50), #在定義完所有列之后指定主鍵,語法:[constraint<約束名>] primary key[字段名] CONSTRAINT dept_name_uk PRIMARY KEY(dept_id), #用給(約束)給dept_name列約束唯一(UNIQUE) CONSTRAINT dept_name_uk UNIQUE(dept_name) ) SELECT *FROM employees; SELECT * FROM department; #delete刪除 where條件 語法:delete from 表名 where 條件 #從employees表中刪除employee_id 為1的行 DELETE FROM employees WHERE employee_id=1; DELETE FROM employees WHERE salary; #alter:對已經創建的表進行添加(add)、修改(modify)、刪除(drop)、約束操作 SELECT * FROM employees; #增加一個salary列,類型double ALTER TABLE employees ADD salary DOUBLE; #刪除empoyees下的salary列 ALTER TABLE employees DROP salary; #修改salary列類型為int not null ALTER TABLE employees MODIFY salary INT NOT NULL; #在department表里添加dept_count列並設置類型為int ALTER TABLE department ADD dept_count INT; #添加約束: ALTER TABLE <表名> ADD <列定義>|<完整性約束>。 #由於使用此方式中 增加的新列 自動填充null值,所以不能為增加的新列指定not null約束。 #約束唯一 constraint 約束名 約束(字段名) ALTER TABLE department ADD CONSTRAINT dept_count_uk UNIQUE(dept_count); #添加外鍵為department表里的字段,並和department里的主鍵(dept_id)建立聯系 ALTER TABLE employees ADD CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id)REFERENCES department(dept_id); SELECT #刪除外鍵約束名 ALTER TABLE employees DROP FOREIGN KEY emp_dept_fk; #刪除外鍵約束列 ALTER TABLE employees DROP dept_id; SHOW CREATE TABLE employees;#show create table 表名:查看表的詳細信息, SHOW CREATE TABLE department; #以表格形式展現結構:DESCRIBE <表名>; DESCRIBE department; DESCRIBE employees; #查詢約束:SELECT * FROM information_schema.`TABLE_CONSTRAINTS`;(可以通過where table_name=‘student‘來約定只查詢某個表的約束) #其實每次添加約束都是將添加的約束的信息存儲到了information_schema這個schema的table_constraints表里;(mysql里``和bash的很像,也是執行``內的表達式而不是將里面作為字符串使用) #查詢定義約束的列 SELECT * FROM information_schema.`TABLE_CONSTRAINTS` WHERE TABLE_NAME='employees'; #查詢定義約束的列 SELECT COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_COLUMN_NAME, REFERENCED_TABLE_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'EMPLOYEES';