2.mysql基礎知識(創建表、增刪改差、約束、ddl語句)


  •  
    事物---功能---用途---實現條件---實現步驟/操作步驟(注意事項)---問題---解決
  •  
    今天學了什么
    •  
      對已經創建的表進行添加、修改、刪除、約束操作、數據類型、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';
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM