day34

MySQL 表操做

1.1 列類型

  • 數字類型mysql

    1. 實際使用中,對於整數類型,通常使用 int 就足夠了。sql

    2. 整數類型後面能夠加上 unsigned 例如 int unsigned 表示只取正整數。數據庫

    3. 當須要存很是精確的小數時,推薦使用 decimal 類型,由於當 float 存的小數位過長時,會自動進行四捨五入。ide

    • 整數類型編碼

      • tinyintcode

        用途:小整數值
        大小:1個字節
        範圍(有符號):(-128,127)
        範圍(無符號):(0,255)
      • smallint索引

        用途:大整數值
        大小:2個字節
        範圍(有符號):(-32768,32767)
        範圍(無符號):(0,65535)
      • mediumintutf-8

        用途:大整數值
        大小:3個字節
        範圍(有符號):(-8388608,8388607)
        範圍(無符號):(0,16777215)
      • intci

        用途:大整數值
        大小:4個字節
        範圍(有符號):(-2147483648,2147483647)
        範圍(無符號):(0,4294967295)
      • bigintrem

        用途:極大整數值
        大小:8個字節
        範圍(有符號):(-9233372036854775808,9233372036854775807)
        範圍(無符號):(0,18446744073709551615)
    • 浮點型

      • float

        用途:單精度浮點數值
        大小:4個字節
        範圍(有符號):(-3.402823466E+38,-1.175494351E-38),0,(1.175494351E-38,3.402823466E+38)
        範圍(無符號):0,(1.175494351E-38,3.402823466E+38)
      • double

        用途:雙精度浮點數值
        大小:8個字節
        範圍(有符號):(-1.7976931348623157E+308,-2.2250738585072014E-308),0,(2.2250738585072014E-308,1.7976931348623157E+308)
        範圍(無符號):0,(2.2250738585072014E-308,1.7976931348623157E+308)
      • decimal

        用途:小數值
        大小:當decimal(m,d)中,m>d,大小爲m+2,不然大小爲d+2
        範圍(有符號):取決於m和d的值
        範圍(無符號):取決於m和d的值
  • 字符串類型

    若是不能肯定字符串的長度是多少,通常建議使用 varchar(255)

    • char(數值)

      不管插入的字符串長度是多少,永遠固定的佔用設置的長度。

      用途:存儲字符串
      字符長度範圍:0-255(一箇中文是一個字符,是utf8編碼的3個字節)
      存儲特色:定長、浪費空間、存取速度快
      
      ***存儲時會向右填充空格來補全設置的長度
      例如:char(5)
      當存小於5的字符串時,自動在字符串右邊填充空格使其長度變爲5,查詢時會自動移除填充的空格
    • varchar(數值)

      根據插入的字符串長度,縮減所佔用的空間,可是會多佔用一個字節用來保存字符串的大小。

      用途:存儲字符串
      字符長度範圍:0-65535(若是大於21845會提示用其餘類型,mysql行最大限制爲65535字節,字符編碼爲utf-8)
      存儲特色:變長、精準、節省空間,存取速度慢
      
      ***存儲時輸入的真實數據內容,輸入什麼存什麼
      存儲時,會在真實數據前加1-2bytes的前綴,用來表示真實數據的bytes字節數(1-2Bytes最大表示65535個數字,正好符合mysql對row的最大字節限制,即已經足夠使用)
      若是真實的數據<255bytes則須要1Bytes的前綴(1Bytes=8bit 2**8最大表示的數字爲255)
      若是真實的數據>255bytes則須要2Bytes的前綴(2Bytes=16bit 2**16最大表示的數字爲65535)
      
      *** 當存儲的數據超過設定的長度時,mysql默認會將數據按照最大長度截取存儲,而後給出一個 warning ,
  • 時間日期類型

    1. 實際使用通常選擇 datetime 類型。

    2. 單獨插入時間時,須要以字符串的形式,按照對應的格式插入

    3. 插入年份時,儘可能使用4位值。

    ** 4. datetimetimestamp 的區別:

    datetime 的日期範圍是1001——9999年,timestamp 的日期範圍是1970——2038年;
    datetime 的存儲與時區無關,timestamp 的存儲與時區有關,顯示的值也依賴於時區;
    datetime 使用8字節的存儲空間,timestamp 的存儲空間爲4字節,所以,timestamp 比 datetime 的空間利用率更高;
    datetime 的默認值爲(null),timestamp 的字段默認不爲空(not null),默認值爲當前時間(current_timestamp)。
    • year

      用途:記錄年份
      範圍:YYYY(1901,2155)
    • date

      用途:記錄年月日
      範圍:YYYY-MM-DD(1000-01-01,9999-12-31)
    • time

      用途:記錄時分秒
      範圍:HH:MM:SS('-838:59:59','838:59:59')
    • datetime

      用途:記錄年月日時分秒
      範圍:YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59)
    • timestamp

      用途:記錄年月日時分秒
      範圍:YYYY-MM-DD HH:MM:SS(1970-01-01 00:00:00/2037 年某時)
  • 枚舉類型

    • enum

      用途:在給定的範圍內選擇一個值,例如 enum('值1','值2','值3')
      *** 若是插入的數據不在給定的範圍內,會報錯
  • 集合類型

    • set

      用途:在給定的範圍可選擇多個值,例如 enum('值1','值2','值3')
      例如:插入('值1,值2') /('值2,值3') /('值1,值3') /('值1,值2,值3') 
      
      當插入的數據不在給定的範圍內,會給出警告,而且不在範圍內的值不會被插入
      例如:插入('值1,值2,值3,值4') # 只會保存 值1,值2,值3

1.2 列約束條件

  • not null

    做用:標識該字段不能爲空,若是沒有給該字段插入數據,則報錯
  • default

    做用:給字段設定默認值,若是該字段沒有插入數據則會自動填入設置的默認值
  • primary key

    做用:用來惟一的約束該字段裏面的數據,不能重複,不能爲空,一張表中最多隻能有一個主鍵;主鍵所在的列一般是整數類型。
    當對應的字段,不給值,會自動的被系統觸發,系統會從當前字段中已經有的最大值+1操做,獲得一個新的不一樣值,一般和主鍵搭配使用,做爲邏輯主鍵
  • auto_increment

    1. 自增加字段必須是整數;

    2. 一張表最多隻能有一個自增加。

    做用:標識該字段的值自動增加(整數類型,並且爲主鍵)
  • foreign key

    做用:當定義外鍵後,要求外鍵列數據必須在主表的主鍵列存在或爲null
  • unique key

    做用:標識該字段的值是惟一的,若是該字段插入的數據已存在,則會報錯
  • unsigned

    做用:標識整數類型爲無符號類型,即不爲負數
  • zerofill

    做用:通常跟在整數類型以後,當輸入的整數不足設置的長度時,在數據的左側用0填充到設定的長度

1.3 增(建立表)

create table 表名(
    字段名1  列類型 [(寬度) 約束條件],  # 寫完一個字段必須加逗號
    字段名2  列類型 [(寬度) 約束條件],
    字段名3  列類型 [(寬度) 約束條件],
    ... ...
    字段名n  列類型 [(寬度) 約束條件]   # 最後一個字段不能加逗號
) charset utf8 ;                    # 最後以分號結尾

實例:

有一個商店shop的數據,記錄客戶及購物狀況,有如下三個表組成:

    商品goods(商品編號goods_id,商品名goods_name, 單價unitprice, 商品類別category, 供應商provider)
    客戶customer(客戶號customer_id,姓名name,住址address,郵箱email,性別sex,身份證card_id)
    購買purchase(購買訂單號order_id,客戶號customer_ id,商品號goods_ id,購買數量nums)
    要求:
    每一個表的主外鍵
    客戶的姓名不能爲空值
    郵箱不能重複
    客戶的性別(男,女)
# 建立 shop 數據庫,字符編碼爲utf8
mysql> create database shop charset utf8;
Query OK, 1 row affected (0.01 sec)

# 進入 shop 數據庫
mysql> use shop;
Database changed

# 建立 goods 數據表
mysql> create table goods(
    -> goods_id int unsigned auto_increment primary key,
    -> goods_name varchar(32) not null default '',
    -> unitprice decimal(5,2) not null default 0,
    -> category varchar(32) not null default '',
    -> provider varchar(32) not null default ''
    -> )charset utf8;
Query OK, 0 rows affected (0.03 sec)

# 建立 customer 數據表
mysql> create table customer(
    -> customer_id int unsigned auto_increment primary key,
    -> address varchar(256) not null default '',
    -> email varchar(32) unique key not null default '',
    -> gender enum('男','女') not null,
    -> card_id char(18) unique key not null default ''
    -> )charset utf8;
Query OK, 0 rows affected (0.03 sec)

# 建立 purchase 數據表
mysql> create table purchase(
    -> order_id int unsigned auto_increment primary key,
    -> customer_id int unsigned,
    -> goods_id int unsigned,
    -> nums int default 0,
    -> foreign key (customer_id) references customer(customer_id),
    -> foreign key (goods_id) references goods(goods_id)
    -> )charset utf8;
Query OK, 0 rows affected (0.02 sec)

# 查看當前數據庫下的數據表
mysql> show tables;
+----------------+
| Tables_in_shop |
+----------------+
| customer       |
| goods          |
| purchase       |
+----------------+
3 rows in set (0.00 sec)

1.4 改

  • 修改表名

    alter table 表名 rename 新表名;
  • 增長字段

    • 直接增長字段(位置始終在最後)

      # 增長一條
      alter table 表名 add 字段名 列類型 [(寬度) 約束條件];
      
      # 增長多條
      alter table 表名 add 字段名1 列類型 [(寬度) 約束條件],
      add 字段名2 列類型 [(寬度) 約束條件],
      ......
      add 字段名n 列類型 [(寬度) 約束條件];
    • 指定位置增長字段

      # 新增字段爲表的第一個字段
      alter table 表名 add 字段名 列類型 [(寬度) 約束條件] first;
      
      # 新增字段到特定字段以後
      alter table 表名 add 字段名 列類型 [(寬度) 約束條件] after 已存在的字段名;
  • 修改字段

    # modify
    alter table 表名 modify 原字段名 新列類型 [(寬度) 約束條件]; 
    
    # change
    alter table 表名 change 原字段名 新字段名 新列類型 [(寬度) 約束條件];

1.5 刪

  • 刪除表

    drop table 表名;
  • 刪除字段

    alter table 表名 drop 字段名;

1.6 查

  • 查看數據庫下的表

    mysql> show tables;
    +----------------+
    | Tables_in_shop |
    +----------------+
    | customer       |
    | goods          |
    | purchase       |
    +----------------+
    3 rows in set (0.00 sec)
  • 查看錶信息

    # 1.查看錶建立信息
    mysql> show create table goods\G
    *************************** 1. row ***************************
           Table: goods
    Create Table: CREATE TABLE `goods` (
      `goods_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `goods_name` varchar(32) NOT NULL DEFAULT '',
      `unitprice` decimal(5,2) NOT NULL DEFAULT '0.00',
      `category` varchar(32) NOT NULL DEFAULT '',
      `provider` varchar(32) NOT NULL DEFAULT '',
      PRIMARY KEY (`goods_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)
    
    # 2. 查看錶建立信息
    mysql> show create table goods;
    +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table | Create Table
    
    
                                                               |
    +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | goods | CREATE TABLE `goods` (
      `goods_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `goods_name` varchar(32) NOT NULL DEFAULT '',
      `unitprice` decimal(5,2) NOT NULL DEFAULT '0.00',
      `category` varchar(32) NOT NULL DEFAULT '',
      `provider` varchar(32) NOT NULL DEFAULT '',
      PRIMARY KEY (`goods_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
    +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)

1.7 複製表

  • 複製表結構+數據

    # 複製時,不會複製 key(主鍵,外鍵,索引)
    create table 新表名 select * from 舊錶名;
  • 複製表結構

    # 1.
    create table 新表名 select * from 舊錶名 where 1=2;  # (能夠任意設置設置一個不成立的條件)
    
    # 2. 
    create table 新表名 like 舊錶名;
相關文章
相關標籤/搜索