MySQL表的操作

  • MySQL基礎一
    上一節主要了解了MySQL數據庫的相關命令和數據庫中存儲的數據類型, 這一節主要是MySQL中對于表的操作。
    數據表(或稱表): 是數據庫的重要儲存部分, 是一張二維表格由行和列組成,行稱呼為記錄,列稱之為字段。

在創建表之前 需要打開數據庫,使用USE db_name;命令打開數據庫。這樣就能在db_name下創建表了。

創建表的命令:

CREATE TABLE [IF NOT EXISTS] t_name(
column_name data_type,
...
);

查看當前打開的數據庫 SELECT DATABASE();

我們先創建一張工資表,用來練手:

CREATE TABLE t_salary(
username VARCHAR(20),
age TINYINT UNSIGNED,
salary FLOAT(8,2) UNSIGNED
);

解釋一下上面的意思 CREATE TABLE 命令為創建表格, UNSIGNED為無符號位,即正數。FLOAT(8,2)表示8位數保留小數點后2位。

ps: 今天聽后臺說起,如果是涉及到錢的話 可以設置類型為int 然后單位為分。具體的咱也沒有學習到就先不談了~

那么既然創建好了數據表, 如何查看數據表呢?

查看數據表命令
SHOW TABLES [FROM db_name] [LIKE 'pattern' | WHERE expr]
查看數據表的命令是否影響當前使用的數據庫呢,可以使用
SELECT DATABASE();查看當前使用的數據庫。

表有了 怎么查看數據表中的各個字段呢,也就是表結構如何查看。
查看數據表結構:
SHOW COLUMNS FROM table_name;

工資表結構

好了,既然表已經有了接下來就該如何存儲數據了, 在mysql中可以使用insert 插入一條數據(記錄)。
插入命令:
INSERT [INTO] table_name [(column1, column2...)] VALUES(value1, value2, ...)
從命令中可以看出 字段可以省略,那如果字段省略之后, 值一定要跟表中的數據一一對應,否則會發生錯誤。
插入數據(記錄)之后,可以使用SELECT命令進行查找數據。SELECT 命令在數據庫的使用中 非常普遍。
簡單查找命令
SELECT expr,... FROM table_name;

表約束

空值與非空值
  • NULL, 字段值可以為空
  • NOT NULL, 字段值禁止為空
    該約束不能同時出現在同一字段中, 字段默認為NULL 我們可以使用一個小例子來進行測試
  1. 創建t_null表
CREATE TABLE IF NOT EXISTS t_null(
username VARCHAR(20) NOT NULL,
age TINYINT UNSIGNED NULL
);
  1. 插入正常數據
INSERT t_null VALUES('Tom', NULL);
正常
  1. 插入非法數據
INSERT t_null VALUES(NULL, 12);
錯誤
自增約束

AUTOINCREMENT

  • 自動編號, 并且必須與主鍵組合使用
  • 默認情況下 起始為1, 每次的增量為1
主鍵

PRIMARY KEY

  • 每張表只能存一個主鍵
  • 主鍵保證記錄的唯一性
  • 主鍵自動為NOT NULL
  • 自增約束必須組合主鍵使用, 但是主鍵不一定要組合自增使用

可以使用例子證明:

  1. 創建表格 (主鍵自增)
CREATE TABLE IF NOT EXISTS t_primary(
t_id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(20) NOT NULL
);
  1. 插入數據
INSERT t_primary (username) VALUES('c');
INSERT t_primary (username) VALUES('oc');
返回結果
  1. 查看數據
SELECT * FROM t_primary;
查詢所有字段結果

ps: 這里的*號為過濾的字段 如果為* 則表示顯示全部的字段

顯示10的那里是因為我為主鍵t_id賦值為10, 因為是自增所以下面為11 , 12, 13..

唯一約束

UNQUE KEY

  • 唯一約束
  • 唯一約束可以保證記錄的唯一性
  • 唯一約束的字段可以為空值(NULL)
  • 每張數據表可以存在多個唯一約束

還是以一個例子來解釋:

  1. 創建表格
CREATE TABLE IF NOT EXISTS t_unique(
t_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL,
age TINYINT UNSIGNED UNQUE KEY
);
  1. 插入數據
INSERT t_unique (username, age) VALUES('tom', 20);
INSERT t_unique (username, age) VALUES('tom', 20);
  1. 錯誤
重復錯誤
默認約束

DEFAULT

  • 當插入記錄時,如果沒有明確賦值,則自動賦予默認值
    例子:
  1. 創建表格
CREATE TABLE IF NOT EXISTS t_default(
t_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCRMENT,
username VARCHAR(20) NOT NULL,
sex ENUM('1', '2', '3') DEFAULT '3'
);
  1. 插入數據
INSERT t_default (username) values ('tom');
  1. 查看表中數據
SELECT * FROM t_default;
  1. 數據返回結果
數據返回結果
外鍵約束
  • 父表和字表必須使用相同的存儲引擎,而且禁止使用臨時表
  • 數據表的存儲引擎只能是INNODB
  • 外鍵列和參照列必須具有相同的數據類型,其中數字類型的長度或者是否有符號位必須相同,而字符的長度則不同.
  • 外鍵列和參照列必須創建索引,如果外鍵列不存在索引的話,MySQL將自動創建.
    關于最后一條, 如果參照列沒有所以MySQL不會創建外鍵列的索引
    例子:
  1. 創建城市表
CREATE TABLE IF NOT EXISTS t_province(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
p_name VARCAHR(20) NOT NULL
);
  1. 創建用戶表
CREATE TABLE IF NOT EXISTS t_users(
id SMALLINT UNSIGNED PRIMARY KEY AUT_INCREMENT,
username VARCHAR(20) NOT NULL,
p_id SMALLINT UNSIGN,
FOREIGN KEY (p_id) REFERENCES t_province (id)
);

如外鍵開頭所說 如果參照列創建了索引,那么 MySQL會自動為外鍵列創建索引。雖然我們沒有明顯的為t_province表的id創建索引,但是id為主鍵, 主鍵會默認創建索引。所以t_users表中的p_id字段也會有索引。那么如何證明呢。 可以使用SHOW INDEXES FROM table_name命令查看表中的索引, 當然為了好看還可以使用 \G 讓索引成網格狀顯示。
查看t_province表中的索引

SHOW INDEXES FROM t_province\G;

t_province中的索引

查看t_users表中的索引

SHOW INDEXES FROM t_users\G;
t_users中的索引
外鍵約束的參照操作
  • CASCADE: 從父表刪除或者更新 時自動刪除或者更新子表中匹配的行
  • SET NULL: 從父表刪除或者更新行,并設置字表中的外鍵列為NULL。如果使用該選項, 必須保證字表列沒有指定為NOT NULL
  • RESTRICT: 拒絕對父表的刪除或更新操作
  • NO ACTION : 標準的SQL 的關鍵字, 在MySQL中與RESTRICFT相同

以上參照操作都是指 在創建好外鍵列的時候, 在更新表的時候, 字表是否也進行相應的操作
例子:

  1. 創建車庫表
CREATE TABLE IF NOT EXISTS t_garage(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_CREMENT,
garage_name VARCHAR(20) NOT NULL
);
  1. 創建車表
CREATE TABLE IF NOT EXISTS t_cars(
id SMALLINT UNSINGED PRIMARY KEY AUTO_CREMENT,
car_name VARCHAR(20) NOT NULL,
garage_id SMALLINT UNSIGNED,
FOREIGN KEY (garage_id) REFERENCES t_garage (id) ON DELETE CASCADE
);

因為車庫表為父表,車表為字表 所以現在要父表中插入數據,再在子表中插入數據.

  1. t_garage插入數據
INSERT t_garage (garage_name) VALUES('A');
INSERT t_garage (garage_name) VALUES('B');
INSERT t_garage (garage_name) VALUES('C');

使用SELECT * FROM t_garage;查看表中數據

t_garage表中數據
  1. t_cars插入數據
INSERT t_cars (car_name, garage_id) VALUES ('紅旗', 3);
INSERT t_cars (car_name, garage_id) VALUES ('models', 1);
INSERT t_cars (car_name, garage_id) VALUES ('吉利', 3);

使用SELECT * FROM t_cars;查看表中數據

t_cars中數據
  1. 刪除父表中的記錄
DELETE FROM t_garage where id = 3;

查看t_garage表中的數據 SELECT * FROM t_garage;

t_garage中的數據

查看t_cars表中的數據SELECT * FROM t_cars;

t_cars中的數據

由此可以看出 只要是父表中刪除了數據,字表中的記錄也會被刪除。
由于在實際項目中不常使用參照操作,所以也不過多進行了~

表級約束與列級約束
  • 對于一個數據列建立的約束,稱之為列級約束
  • 對多個數據列建立的約束, 稱之為表級約束
  • 列級約束可以在列定義時聲明,也可以在列定義后聲明
  • 表級約束只能在列定義后聲明
修改數據表
  • 添加單列
ALTER TABLE table_name ADD [COLUMN] column_name column_definition [FIRST | AFTER column_name]
  • 添加多列
ALTER TABLE table_name ADD [COLUMN] (column_name, column_definition, ...)

添加多列的時候不能指定位置關系, 只能在字段的后方。

  • 刪除列
ALTER TABLE table_name DROP [COLUMN] column_name
  • 刪除多列
ALTER TABLE t_name DROP [COLUMN] c_name, DROP c_name

用一個例子演示一下:

  1. 創建表格
CREATE TABLE IF NOT EXISTS t_action(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL
);
  1. 添加salary字段
ALTER TABLE t_action ADD salary FLOAT(8,2) UNSIGNED;
  1. 查看表結構
SHOW CLOUMNS FROM t_action;
表結構
  1. 添加age字段
ALTER TABLE t_action ADD age SMALLINT UNSIGNED AFTER username;
  1. 查看表結構
SHOW COLUMNS FROM t_action;
表結構

可以看到使用AFTER把age字段添加到了username字段的后方.

  1. 刪除salary字段
ALTER TABLE t_action DROP salary;
  1. 查看表結構
SHOW COLUMNS FROM t_action;
表結構
  1. 刪除username 添加 area_name
ALTER TABLE t_action DROP username, ADD area_name VARCHAR(20) NOT NULL;
  1. 查看表結構
SHOW COLUMNS FROM t_action;
表結構

由此可見如果想進行多個字段的添加和刪除只需要用,隔開即可。

  • 添加主鍵
ALTER TABLE tbl_name ADD [CONSTRAINT[symbol]] PRIMARY KEY [index_type] (index_col_name, ...)

用一個例子說明:

  1. 創建一個t_user_test
CREATE TABLE IF NOT EXISTS t_user_test(
id SMALLINT UNSIGNED,
username VARCHAR(20) NOT NULL
);
  1. id添加主鍵約束
ALTER TABLE t_user_test ADD CONSTRAINT PK_user_test PRIMARY KEY (id);

CONSTRAINT 為設置別名,目前還不知道

  • 添加唯一約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE KEY [INDEX|KEY] [index_name] [index_type] (index_col_name);
  • 添加外鍵約束
ALTER TABLE tb_name ADD [CONSTRINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) reference_definition
  • 添加/刪除默認約束
ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal| DROP DEFAULET}
  • 刪除主鍵約束
ALTER TABLE tbl_name DROP PRIMARY KEY;
  • 刪除唯一約束
ALTER TABLE tbl_name DROP {INDEX | KEY} index_name;
  • 刪除外鍵約束
ALTER TABLE tbl_name  DROP FOREIGN KEY fk_symbol;
  • 修改列定義
ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST|AFTER col_name]

修改列定義需要注意的是 如果修改的數據類型是由大往小了更改 那么會造成部分數據丟失。

  • 修改列名稱
ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]
  • 數據表更名
    方法一
ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name

方法二

RENAME TABLE tbl_name TO new_tbl_name [, tbl_name2 TO new_tbl_name2] ...

方法二可以更換多個表的名稱

插入 insert

第一種方法
INSERT [INTO] tbl_name [(col_name1, ...)] {VALUES|VALUE} ({expr | DEFAULT}, ...), (...),...

舉個??:

  1. 創建't_user'表
CREATE TABLE IF NOT EXISTS t_user(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL,
password VARCHAR(32) NOT NULL,
age SMALLINT UNSIGNED NOT NULL DEFAULT 10,
sex BOOLEAN
);

ps: 這里聲明age字段時如果沒有設置NOT NULL設置默認約束的時候 會出現語法錯誤

  1. 插入數據
  • 簡單插入
INSERT t_user VALUES(NULL, 'Tom', '123', 13, 1);
插入結果
  • 插入(函數)
INSERT t_user VALUES (DEFAULT,'Join', md5('123456'), 14, 2);
插入結果
  • 插入(表達式)
INSERT t_user VALUES (DEFAULT, 'left', '123456', 5*6-5, 1);
插入結果
  • 插入(多條)
INSERT t_user VALUES (DEFAULT,'right', md5('123456'), 20, 1), (NULL, 'big', '123456', 21, 3);
插入結果

由此可見 mysql即支持表達式還支持函數, 對于自增字段可以使用'DEFAULT'或者NULL默認值。對于多條插入可以以','隔開。

第二種方法
INSERT [INTO] tbl_name  SET col_name={expr| DEFAULT }, ...

第二種方法較第一種方法來說,此方法可以使用子查詢, 但是只能插入一條數據。

  • 插入t_user表數據
INSERT t_user SET  username='haha',password='123456';

因為id 和 age 都有默認值, sex允許為空 所以可以不賦值。

插入結果
第三種方法
INSERT [INTO] tbl_name [(column_name, ..)] SELECT ...

該方法可以把查詢出的數據,插入到數據表中.

更新

  • 更新記錄(單表)
    UPDATE [LOW_PRIORITY] [IGNORE] tbl_refrenece SET col_name1={expr1|DEFAULT} [, col_name2={expr2}|DEFAULT]... [WHERE where_condition]
UPDATE t_user SET age = age+10, sex = 0;

刪除

  • 刪除記錄(單表)
DELETE FROM t_user where id = 6;

查詢

  • where 查詢表達式

  • GROUP BY
    查詢結果分組

[GROUP BY {col_name|position} [ASC|DESC], ...]

ASC為升序 為默認
DESC為降序
??

  1. 創建t_users表格
CREATE TABLE IF NOT EXISTS t_users(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL,
password VARCHAR(40) NOT NULL,
age TINYINT UNSIGNED NOT NULL DEFAULT 10,
sex BOOLEAN
);
users表結構
  1. 插入數據
INSERT t_users VALUES (DEFAULT, 'tom', '123456', 20,1), (DEFAULT, 'alex', '123456', 20, 1), (DEFAULT, 'tornado', '123', 19, 1), (DEFAULT, 'fdfd', '123', 10, 0);
插入結果
  1. sex分組
SELECT sex FROM t_users GROUP BY sex;
分組結果
  • HAVING分組條件
    分組可以對全部記錄做分組 也可以指定部分記錄作為分組。
    ??
  1. 插入基礎數據
INSERT t_users VALUES (DEFAULT,'pp', '123456', 10, 0),
 (DEFAULT,'dd', '123456', 26, 0);
  1. group by
SELECT sex,age FROM t_users GROUP BY sex,age having age >10;
  • order by排序
[ORDER BY {col_name|expr|position} [ASCC|DESC], ...]

??

  1. 按照id降序排列
SELECT *  FROM t_users ORDER BY id DESC;
排序結果
  1. 按照age 降序如果相同按照id升序
SELECT * FROM t_users ORDER BY age DESC , id;
排序結果
限制查詢LIMIT
[LIMIT{[offset,] row_cout|row_cout OFFSET offset}]

還是使用t_users來做例子

  1. 查詢兩條數據
SELECT * FROM t_users LIMIT 2;
  1. 從第三條數據開始 查詢兩條
SELECT * FROM t_users LIMIT 2,2;

因為數據庫中記錄的索引從0開始 所以索引為2的記錄是第三條數據

  1. limit只按照查詢結果來計算索引 不管id為大還是小
    =========================================
    暫存有空做修改
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容