SQL DDL 數據定義語句

前言

  • DDL(Data Definition Language)語句:數據定義語句,這些語句定義了不一樣的數據段、數據庫、表、列、索引等數據庫對象。經常使用的語句關鍵字主要包括 create、drop、alter 等。

一、DDL 數據庫操做語句

  • 1)建立數據庫語句mysql

    # 建立數據庫,數據使用默認編碼方式 utf8mb4
    # create database 數據庫名;
    > create database test;
    
        Query OK, 1 row affected (0.04 sec)
    # 建立數據庫,指定數據編碼方式
    # create database 數據庫名 character set 字符集;
    > create database test character set gbk;
    
        Query OK, 1 row affected (0.02 sec)
  • 2)刪除數據庫語句sql

    # 刪除數據庫
    # drop database 數據庫名;
    > drop database test;
    
        Query OK, 0 rows affected (0.05 sec)
    # 刪除數據庫,若是數據庫存在就刪除
    # drop database if exists 數據庫名;
    > drop database if exists test;
    
        Query OK, 0 rows affected (0.01 sec)
  • 3)顯示全部數據庫語句數據庫

    # 顯示全部數據庫
    > show databases;
    
        +--------------------+
        | Database           |
        +--------------------+
        | information_schema |
        | performance_schema |
        | mysql              |
        | sys                |
        +--------------------+
        4 rows in set (0.01 sec)
    • 系統自動建立的數據庫緩存

      • 上面的顯示結果中的 4 個數據庫都是安裝 MySQL 時系統(macOS)自動建立的。
      • information_schema:主要存儲了系統中的一些數據庫對象信息,不如用戶表信息、列信息、權限信息、字符集信息、分區信息等。
      • performance_schema:主要用於收集數據庫服務器性能參數。
      • mysql:包含權限配置,事件,存儲引擎狀態,主從信息,日誌,時區信息,用戶權限配置等。
      • sys:performance_schema 的替代方案。
  • 4)顯示數據庫的建立信息語句服務器

    # 顯示數據庫具體信息
    # show create database 數據庫名;
    > show create database test;
    
        +----------+---------------------------------------------------------------------------------------------+
        | Database | Create Database                                                                             |
        +----------+---------------------------------------------------------------------------------------------+
        | test     | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ |
        +----------+---------------------------------------------------------------------------------------------+
        1 row in set (0.00 sec)
  • 5)選擇操做的數據庫語句數據結構

    # 選擇操做的數據庫
    # use 數據庫名;
    > use test;
    
        Database changed
  • 6)顯示正在操做的數據庫語句性能

    # 顯示正在操做的數據庫
    > select database();
    
        +------------+
        | database() |
        +------------+
        | test       |
        +------------+
        1 row in set (0.00 sec)
  • 7)導出數據庫語句ui

    # 導出數據庫,同時倒出數據庫表結構和數據
    # mysqldump -u 用戶名 -p 數據庫名 > 導出到的目標文件路徑.sql;
    $ mysqldump -u root -p test > /Users/qianchia/Desktop/test.sql;
    
        Enter password:
    # 導出數據庫,只倒出數據庫表結構
    # mysqldump -u 用戶名 -p -d 數據庫名 > 導出到的目標文件路徑.sql;
    $ mysqldump -u root -p -d test > /Users/qianchia/Desktop/test.sql;
    
        Enter password:
    # 導出數據庫
    # mysqldump -u 用戶名 -p --quick --no-create-info --extended-insert --default-character-set=字符集 源數據庫名> 目標文路徑.sql
    $ mysqldump -u root -p --quick --no-create-info --extended-insert --default-character-set=latin1 test> /Users/qianchia/Desktop/test.sql
    • --quick:該選項用於轉儲大的表。它強制 mysqldump 從服務器一次一行地檢索表中的行而不是檢索全部行,並在輸出前將它緩存到內存中。
    • --extended-insert:使用包括幾個 values 列表的多行 insert 語法。這樣使轉儲文件更小,重載文件時能夠加速插入。
    • --no-create-info:不導出每一個轉儲表的 create table 語句。
    • --default-character-set=latin1:按照原有的字符集導出全部數據,這樣導出的文件中,全部中文都是可見的,不會保存成亂碼。編碼

    • 導出數據庫是在系統命令模式下操做。日誌

  • 8)導入數據庫語句

    # 導入數據庫/表
    # source 導入的目標文件路徑.sql;
    > source /Users/qianchia/Desktop/test.sql;
    
        Query OK, 0 rows affected (0.00 sec)
        Query OK, 0 rows affected (0.01 sec)
        ...
        Query OK, 3 rows affected (0.00 sec)
        Records: 3  Duplicates: 0  Warnings: 0
    # 導入數據庫/表
    # mysql -u 用戶名 -p 數據庫名 < 導入的目標文件路徑.sql
    $ mysql -u root -p test < /Users/qianchia/Desktop/testdbcreatetab.sql
    • 導入數據庫是在選擇了操做數據庫後在 mysql 命令模式下操做。

二、DDL 表操做語句

  • 1)建立表語句

    # 建立表
    # create table 表名 (
          列名稱字段 數據類型(長度) 約束條件,
          列名稱字段 數據類型(長度) 約束條件
      ) [default charset = 字符集名];
    > create table student (
          no int,
          name varchar(20),
          age int,
          score int
      );
    
        Query OK, 0 rows affected (0.08 sec)
    # 建立表,約束
    
    > create table student (
          no int unique,                           // 設置惟一約束
          name varchar(20) not null,               // 設置非空約束
          age int,
          score int
      );
    
    > create table student (
          no int primary key,                      // 設置主鍵約束
          name varchar(20),
          age int,
          score int
      );
    
    > create table student (
          no int,
          name varchar(20),
          age int,
          score int
    
          primary key(no)                          // 設置主鍵約束
      );
    
    > create table student (
          no int primary key auto_increment,       // 設置主鍵自增約束
          name varchar(20),
          age int,
          score int
      );
    
    > create table A (
          ano int primary key,
          aname varchar(20),
          loc varchar(100)
      );
    
    > create table B (
          bno int primary key,
          bname varchar(20),
    
          bano int,
          # constraint 約束名稱 foreign key(外鍵名稱) references 源表(主鍵名稱)
          constraint fk_a_b foreign key(bano) references A(ano)                // 設置外鍵約束
      );
  • 2)刪除表語句

    # 刪除表
    # drop table 表名;
    > drop table student;
    
        Query OK, 0 rows affected (0.07 sec)
    # 刪除表,若是表存在就刪除
    # drop table if exists 表名;
    > drop table if exists student;
    
        Query OK, 0 rows affected (0.06 sec)
  • 3)顯示全部表語句

    # 顯示全部表
    > show tables;
    
        +----------------+
        | Tables_in_test |
        +----------------+
        | A              |
        | B              |
        | student        |
        +----------------+
        3 rows in set (0.00 sec)
  • 4)顯示錶的建立信息語句

    # 顯示錶具體信息
    > show create table student;
    
        +---------+--------------------------------------------------------------------------------------------------+
        | Table   | Create Table                                                                                     |
        +---------+--------------------------------------------------------------------------------------------------+
        | student | CREATE TABLE `student` (
                                            `no` int(11) NOT NULL AUTO_INCREMENT,
                                            `name` varchar(20) NOT NULL,
                                            `age` int(11) DEFAULT NULL,
                                            `score` int(11) DEFAULT NULL,
                                            PRIMARY KEY (`no`)
                                           ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci        |
        +---------+--------------------------------------------------------------------------------------------------+
        1 row in set (0.01 sec)
  • 5)顯示錶的數據結構語句

    # 顯示錶的數據結構
    # desc 表名稱;
    > desc student;
    
        +-------+-------------+------+-----+---------+----------------+
        | Field | Type        | Null | Key | Default | Extra          |
        +-------+-------------+------+-----+---------+----------------+
        | no    | int(11)     | NO   | PRI | NULL    | auto_increment |
        | name  | varchar(20) | NO   |     | NULL    |                |
        | age   | int(11)     | YES  |     | NULL    |                |
        | score | int(11)     | YES  |     | NULL    |                |
        +-------+-------------+------+-----+---------+----------------+
        4 rows in set (0.01 sec)
  • 6)重命名錶語句

    # 重命名錶
    # alter table 舊錶名稱 rename [to] 新表名稱;
    > alter table student rename [to] stu;
    
        Query OK, 0 rows affected (0.02 sec)
    # 重命名錶
    # rename table 舊錶名稱 to 新表名稱;
    > rename table student to stu;
    
        Query OK, 0 rows affected (0.08 sec)
  • 7)修改表的字符集語句

    # 修改表的字符集
    # alter table 表名稱 cahracter set 字符集;
    > alter table student character set gbk;
    
        Query OK, 0 rows affected (0.05 sec)
        Records: 0  Duplicates: 0  Warnings: 0
  • 8)導出表語句

    # 導出數據庫指定的表,同時導出表結構和數據
    # mysqldump -u 用戶名 -p 數據庫名 表名 > 導出到的目標文件路徑.sql;
    $ mysqldump -u root -p test student > /Users/haiqianj/Desktop/test.sql;
    
        Enter password:
    # 導出數據庫指定的表,只導出表結構
    # mysqldump -u 用戶名 -p -d 數據庫名 表名 > 導出到的目標文件路徑.sql;
    $ mysqldump -u root -p -d test student > /Users/haiqianj/Desktop/test.sql;
    
        Enter password:
    • 導出表是在系統命令模式下操做。
  • 9)導入表語句

    # 導入表/數據庫
    # source 導入的目標文件路徑.sql;
    > source /Users/qianchia/Desktop/test.sql;
    
        Query OK, 0 rows affected (0.00 sec)
        Query OK, 0 rows affected (0.01 sec)
        ...
        Query OK, 3 rows affected (0.00 sec)
        Records: 3  Duplicates: 0  Warnings: 0
    • 導入表是在選擇了操做數據庫後在 mysql 命令模式下操做。

三、DDL 列字段操做語句

  • 1)添加列語句

    # 添加列,添加單列
    # alter table 
        表名稱 
      add [column] 
        列名稱 類型 [約束] [first | after 列名稱];
    > alter table student add cla varchar(20);
    
        Query OK, 0 rows affected (0.04 sec)
        Records: 0  Duplicates: 0  Warnings: 0
    # 添加列,添加多列
    # alter table 
        表名稱 
      add [column] 
        列名稱 類型 [約束] [first | after 列名稱],
      add [column]  
         列名稱 類型 [約束] [first | after 列名稱], 
       ...;
    > alter table student add cla varchar(20), add addr varchar(100);
    
        Query OK, 0 rows affected (0.02 sec)
        Records: 0  Duplicates: 0  Warnings: 0
  • 2)刪除列語句

    # 刪除列,刪除單列
    # alter table 
        表名稱 
      drop [column] 
        列名稱;
    > alter table student drop address;
    
        Query OK, 0 rows affected (0.10 sec)
        Records: 0  Duplicates: 0  Warnings: 0
    # 刪除列,刪除多列
    # alter table 
        表名稱 
      drop [column] 
        列名稱, 
      drop [column] 
        列名稱, 
      ...;
    > alter table student drop class, drop address;
    
        Query OK, 0 rows affected (0.11 sec)
        Records: 0  Duplicates: 0  Warnings: 0
  • 3)修改列名稱語句

    # 修改列名稱,修改單列名稱
    # alter table 
        表名稱 
      change [column] 
        舊列名稱 
        新列名稱 類型 [約束] [first | after 列名稱];
    > alter table student change cla class int;
    
        Query OK, 0 rows affected (0.10 sec)
        Records: 0  Duplicates: 0  Warnings: 0
    # 修改列名稱,修改多列名稱
    # alter table 
        表名稱 
      change [column] 
        舊列名稱 
        新列名稱 類型 [約束] [first | after 列名稱],
      change [column]
        舊列名稱 
        新列名稱 類型 [約束] [first | after 列名稱],
      ...;
    > alter table student change cla class int, change addr address varchar(100);
    
        Query OK, 0 rows affected (0.10 sec)
        Records: 0  Duplicates: 0  Warnings: 0
  • 4)修改列屬性語句

    # 修改列屬性,修改單列的字段類型及約束
    # alter table 
        表名稱 
      modify [column] 
        列名稱 類型 [約束] [first | after 列名稱];
    > alter table student modify cla int;
    
        Query OK, 0 rows affected (0.11 sec)
        Records: 0  Duplicates: 0  Warnings: 0
    # 修改列屬性,修改多列的字段類型及約束
    # alter table 
        表名稱 
      modify [column] 
        列名稱 類型 [約束] [first | after 列名稱], 
      modify [column] 
        列名稱 類型 [約束] [first | after 列名稱], 
      ...;
    > alter table student modify cla int, modify addr varchar(200);
    
        Query OK, 0 rows affected (0.10 sec)
        Records: 0  Duplicates: 0  Warnings: 0
  • 5)修改列順序語句

    • 在上邊的 add、change、modify 語句中的可選參數 [first | after 列名稱] 能夠用老修改字段在表中的位置。
    • first:放在全部列最前邊
    • after 列名稱:放在指定列以後

    • 注意:change、first、after column 這些關鍵字都屬於 MySQL 在標準 SQL 上的擴展,在其它數據庫中不必定適用。

相關文章
相關標籤/搜索