1. 程式人生 > >MySQL基礎知識(三)——資料表記錄讀寫操作

MySQL基礎知識(三)——資料表記錄讀寫操作

首先建立一個users表,後續我們都對這個表的資料進行操作。

// 建立users表。
// 包含欄位編號id;使用者名稱username;密碼password;年齡age;薪水salary;性別sex,預設值為‘3’
CREATE TABLE IF NOT EXISTS users(id INT(2) UNSIGNED AUTO_INCREMENT PRIMARY KEY,username VARCHAR(20),pasword VARCHAR(60),age TINYINT UNSIGNED,salary FLOAT(9,2) UNSIGNED,sex ENUM('1','2','3') DEFAULT '3');

一.資料庫寫操作 

1.插入記錄

(1)第一種方式:

語法:INSERT [INTO] tbl_name [col_name,...] {VALUES|VALUE} ({expr | DEFAULT},...),...

// 給所有欄位賦值。
// 不寫列名,則要給每個欄位對應的值,id為自增欄位,可以直接賦值為NULL。
INSERT users VALUES (NULL,'tian','123',18,9000000,'1');
// id為自增欄位,也可以直接賦值為DEFAULT
INSERT users VALUES (DEFAULT,'kimtian','234',19,990000.00,'1');
// 有預設值的欄位想使用預設值可以使用DEFAULT
INSERT users VALUES (DEFAULT,'tjj','345',21,880000.00,DEFAULT);
// 也可以使用數學表示式
INSERT users VALUES (DEFAULT,'pony','456',22,2000+3000+2300*2,'2');
// 一次插入多條資料
INSERT users VALUES (DEFAULT,'wiwi','567',23,50000,'1'),(DEFAULT,'messi',MD5('messi'),24,50000*1.5+3000,'1');

(2)第二種方式:

語法:INSERT [INTO] tbl_name SET col_name=({expr | DEFAULT},...

// 這種方式一次只能插入一條資料
INSERT users SET username='luqiong',password='678',age=30,salary=12000*1.2;

(2)第三種方式:

語法:INSERT [INTO] tbl_name [(col_name,...)] SELECT...

先建立另一張空表:

// 建立表名inserttest。包含欄位編號id;使用者名稱username
CREATE TABLE IF NOT EXISTS inserttest(id INT(2) UNSIGNED AUTO_INCREMENT PRIMARY KEY,username VARCHAR(20));

將我們資料表users中的username插入新表 inserttest中。

// 與第一種方法的區別在於:這種方法可以使用子查詢(SubQuery),可以將查詢結果插入到指定資料表
// 只插入一個欄位,要指定欄位名稱。在子查詢加入WHERE條件,只將年齡大於20歲的username插入新表中
INSERT inserttest (username) SELECT username FROM users WHERE age>20;

2.更新記錄

(1) 單表更新

語法:

UPADATE [LOW_PRIORITY][IGNORE] table_reference SET col_name1={expr | DEFAULT}[,col_name2={expr | DEFAULT}]...[WHERE where_condition]

// 如果不加WHERE條件,則將資料表內所有欄位進行更新
UPDATE users SET salary = salary+id*200,sex = 3;
// 加WHERE條件,則根據WHERE條件進行更新
UPDATE users SET salary = salary+2000,sex = 1 WHERE id % 2 = 1;

(2)多表更新

語法:

UPDATE table_references SET col_name1={expr1|DEFAULT} [,col_name={expr2|DEFAULT] ... [WHERE where_condition]

// 使用內連線更新 tbl_goods 中的goods_cate欄位
UPDATE tbl_goods INNER JOIN tbl_goods_cates ON goods_cate = cate_name SET goods_cate = cate_id;

3.刪除記錄

(1)單表刪除

語法:DELETE FROM tbl_name [WHERE where_condition]

// 實際中刪除表資料一定要加上WHERE條件,防止不小心把資料庫中所有資料都刪除掉
// 刪除資料後,再增加資料不會補充刪除的編號,而是在原有最大編號的基礎上+1
DELETE FROM users WHERE id = 4; 

(2)多表刪除 

語法:DELETE tbl_name[.*][,tbl_name[.*]]... FROM table_references [WHERE where_condition]

// 刪除表中重複的資料,刪除id大的,保留重複資料中id小的
DELETE goods 
FROM
	tbl_goods AS goods
	LEFT JOIN ( SELECT goods_id, goods_name FROM tbl_goods GROUP BY goods_name HAVING COUNT( goods_name ) >= 2 ) AS deletetable ON goods.goods_name = deletetable.goods_name 
WHERE
	goods.goods_id > deletetable.goods_id;

二.資料庫讀操作

1.基本查詢

語法:

SELECT select_expr[,select_expr ...]
[
  FROM table_references
    [WHERE where_condition]
    [GROUP BY{col_name | position}[ASC | DESC],...]
    [HAVING where_condition]
    [ORDER BY {col_name | expr|position}[ASC | DESC],...]
    [LIMIT {[offset,]row_count | row_count OFFSET offset}]
]

// 查詢表示式
// 每個表示式表示想要的一列,必須至少有一個;後面可以全部沒有
SELECT NOW();
// 多個列之間以英文逗號分隔, 查詢表示式的順序可以和表中欄位的順序不一致。查詢表示式的順序將影響查詢結果的順序。
SELECT username,id FROM users;
// 查尋所有列 
SELECT * FROM users;
// SELECT tbl_name.*可以表示查詢命名錶的所有列。使用多表連線查詢的時候,有可能存在兩張表中有相同的欄位,加上表名.欄位名,可以清晰分辨出欄位屬於哪張表
SELECT users.*,users.id FROM users;
// 查詢表示式可以使用[AS]alias_name為其賦予別名,欄位的別名也將影響結果集,一般最好加上AS。別名可用於GROUP BY,ORDER BY或HAVING子句。
SELECT id AS uid,username AS uname FROM users;
// 對記錄進行過濾,如果沒有指定WHERE語句,則顯示所有記錄。
SELECT id,username FROM users WHERE username='kimtian';
// 在WHERE表示式中,可以使用MySQL支援的函式或運算子
SELECT id,username FROM users WHERE id%3=2;

(1)GROUP BY 查詢結果分組

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

// 根據性別進行分組,ASC是升序,DESC是降序,預設為升序
SELECT sex FROM users GROUP BY sex DESC;
// 也可以GROUP BY num,表示SELECT語句根據第nun個出現的欄位進行分組,但不建議這樣使用,最好使用欄位名稱
SELECT username,id,age FROM users GROUP BY 2;

(2)HAVING 分組條件

語法:[HAVING where_condition]

// 要保證having後作為條件的欄位必須出現在select語句中
SELECT id,sex,age from users GROUP BY id HAVING age >21;
// 或者使用聚合函式
SELECT sex from users GROUP BY sex HAVING count(id) >4;

(3)ORDER BY 對查詢結果進行排序

語法:[ORDER BY{col_name | expr | position} [ASC|DESC],...]

// 根據年齡對結果進行排序
SELECT * FROM users ORDER BY age;
// 先根據年齡對結果進行排序,年齡重複的再根據id倒序排序
SELECT * FROM users ORDER BY age,id DESC;
// 先根據年齡對結果進行倒序排序,年齡重複的再根據id倒序排序
SELECT * FROM users ORDER BY age DESC,id DESC;

(3)LIMIT 限制查詢結果返回的數量

語法:[LIMIT{[offset,]row_count | row_count OFFSET offset}]

// 只寫一個數字,表示返回從頭開始的前幾條,如2表示返回前兩條
SELECT * FROM users LIMIT 2;
// 想返回第2,3條資料,由於MySQL的select結果是從0開始的,所以offset偏移量為1開始,要寫成1,2。
SELECT * FROM users LIMIT 1,2;
// LIMIT後面的限制條數只與結果集的順序有關,與表中id值無任何關係。
// id倒序排序之後,再輸出的兩條資料變為了7,6這兩條
SELECT * FROM users ORDER BY id DESC LIMIT 1,2;