-
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
我們可以使用一個小例子來進行測試
- 創建t_null表
CREATE TABLE IF NOT EXISTS t_null(
username VARCHAR(20) NOT NULL,
age TINYINT UNSIGNED NULL
);
- 插入正常數據
INSERT t_null VALUES('Tom', NULL);
- 插入非法數據
INSERT t_null VALUES(NULL, 12);
自增約束
AUTOINCREMENT
- 自動編號, 并且必須與主鍵組合使用
- 默認情況下 起始為1, 每次的增量為1
主鍵
PRIMARY KEY
- 每張表只能存一個主鍵
- 主鍵保證記錄的唯一性
- 主鍵自動為NOT NULL
- 自增約束必須組合主鍵使用, 但是主鍵不一定要組合自增使用
可以使用例子證明:
- 創建表格 (主鍵自增)
CREATE TABLE IF NOT EXISTS t_primary(
t_id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(20) NOT NULL
);
- 插入數據
INSERT t_primary (username) VALUES('c');
INSERT t_primary (username) VALUES('oc');
- 查看數據
SELECT * FROM t_primary;
ps: 這里的*
號為過濾的字段 如果為*
則表示顯示全部的字段
顯示10的那里是因為我為主鍵t_id賦值為10, 因為是自增所以下面為11 , 12, 13..
唯一約束
UNQUE KEY
- 唯一約束
- 唯一約束可以保證記錄的唯一性
- 唯一約束的字段可以為空值(NULL)
- 每張數據表可以存在多個唯一約束
還是以一個例子來解釋:
- 創建表格
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
);
- 插入數據
INSERT t_unique (username, age) VALUES('tom', 20);
INSERT t_unique (username, age) VALUES('tom', 20);
- 錯誤
默認約束
DEFAULT
- 當插入記錄時,如果沒有明確賦值,則自動賦予默認值
例子:
- 創建表格
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'
);
- 插入數據
INSERT t_default (username) values ('tom');
- 查看表中數據
SELECT * FROM t_default;
- 數據返回結果
外鍵約束
- 父表和字表必須使用相同的存儲引擎,而且禁止使用臨時表
- 數據表的存儲引擎只能是INNODB
- 外鍵列和參照列必須具有相同的數據類型,其中數字類型的長度或者是否有符號位必須相同,而字符的長度則不同.
- 外鍵列和參照列必須創建索引,如果外鍵列不存在索引的話,MySQL將自動創建.
關于最后一條, 如果參照列沒有所以MySQL不會創建外鍵列的索引
例子:
- 創建城市表
CREATE TABLE IF NOT EXISTS t_province(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
p_name VARCAHR(20) NOT NULL
);
- 創建用戶表
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_users
表中的索引
SHOW INDEXES FROM t_users\G;
外鍵約束的參照操作
- CASCADE: 從父表刪除或者更新 時自動刪除或者更新子表中匹配的行
- SET NULL: 從父表刪除或者更新行,并設置字表中的外鍵列為NULL。如果使用該選項, 必須保證字表列沒有指定為NOT NULL
- RESTRICT: 拒絕對父表的刪除或更新操作
- NO ACTION : 標準的SQL 的關鍵字, 在MySQL中與RESTRICFT相同
以上參照操作都是指 在創建好外鍵列的時候, 在更新表的時候, 字表是否也進行相應的操作
例子:
- 創建車庫表
CREATE TABLE IF NOT EXISTS t_garage(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_CREMENT,
garage_name VARCHAR(20) NOT NULL
);
- 創建車表
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
);
因為車庫表為父表,車表為字表 所以現在要父表中插入數據,再在子表中插入數據.
-
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_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;
查看表中數據
- 刪除父表中的記錄
DELETE FROM t_garage where id = 3;
查看t_garage
表中的數據 SELECT * FROM t_garage;
查看
t_cars
表中的數據SELECT * FROM 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
用一個例子演示一下:
- 創建表格
CREATE TABLE IF NOT EXISTS t_action(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL
);
- 添加
salary
字段
ALTER TABLE t_action ADD salary FLOAT(8,2) UNSIGNED;
- 查看表結構
SHOW CLOUMNS FROM t_action;
- 添加
age
字段
ALTER TABLE t_action ADD age SMALLINT UNSIGNED AFTER username;
- 查看表結構
SHOW COLUMNS FROM t_action;
可以看到使用AFTER把age字段添加到了username字段的后方.
- 刪除
salary
字段
ALTER TABLE t_action DROP salary;
- 查看表結構
SHOW COLUMNS FROM t_action;
- 刪除
username
添加area_name
ALTER TABLE t_action DROP username, ADD area_name VARCHAR(20) NOT NULL;
- 查看表結構
SHOW COLUMNS FROM t_action;
由此可見如果想進行多個字段的添加和刪除只需要用,
隔開即可。
- 添加主鍵
ALTER TABLE tbl_name ADD [CONSTRAINT[symbol]] PRIMARY KEY [index_type] (index_col_name, ...)
用一個例子說明:
- 創建一個
t_user_test
表
CREATE TABLE IF NOT EXISTS t_user_test(
id SMALLINT UNSIGNED,
username VARCHAR(20) NOT NULL
);
- 為
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}, ...), (...),...
舉個??:
- 創建'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
設置默認約束的時候 會出現語法錯誤
- 插入數據
- 簡單插入
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
為降序
??
- 創建
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
);
- 插入數據
INSERT t_users VALUES (DEFAULT, 'tom', '123456', 20,1), (DEFAULT, 'alex', '123456', 20, 1), (DEFAULT, 'tornado', '123', 19, 1), (DEFAULT, 'fdfd', '123', 10, 0);
- 以
sex
分組
SELECT sex FROM t_users GROUP BY sex;
-
HAVING
分組條件
分組可以對全部記錄做分組 也可以指定部分記錄作為分組。
??
- 插入基礎數據
INSERT t_users VALUES (DEFAULT,'pp', '123456', 10, 0),
(DEFAULT,'dd', '123456', 26, 0);
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], ...]
??
- 按照id降序排列
SELECT * FROM t_users ORDER BY id DESC;
- 按照age 降序如果相同按照id升序
SELECT * FROM t_users ORDER BY age DESC , id;
限制查詢LIMIT
[LIMIT{[offset,] row_cout|row_cout OFFSET offset}]
還是使用t_users
來做例子
- 查詢兩條數據
SELECT * FROM t_users LIMIT 2;
- 從第三條數據開始 查詢兩條
SELECT * FROM t_users LIMIT 2,2;
因為數據庫中記錄的索引從0開始 所以索引為2的記錄是第三條數據
-
limit
只按照查詢結果來計算索引 不管id為大還是小
=========================================
暫存有空做修改