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為大還是小
    =========================================
    暫存有空做修改
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容