最近剛剛開始學習Mysql
,然而學習MySql
必經的一個過程就是SQL語句
,只有按照文件從頭開始學習SQL
語句。學習的過程是痛苦的,但是學完的成果是甘甜的。
SQL 語法
所有的 SQL 語句都以下列關鍵字之一開始:SELECT、INSERT、UPDATE、DELETE、ALTER、DROP、CREATE、USE、SHOW
,並以一個分號(;
)結束。
有一點需要特別注意:SQL
不區分大小寫,也就是說SELECT
和select
在SQL
語句中有相同的含義。然而,MySQL
在表的名稱方面並不遵循此規定。所以,如果你在使用MySQL
的話,你需要在程式中嚴格按照它們在資料庫中名字進行使用。
SQL語句
中使用*
代表萬用字元。
SELECT
SELECT
關鍵字用來從資料中查詢資料。
語法
SELECT 查詢欄位 FROM 表名;
// 在 loglists 表中查詢 id,name 兩個欄位
SELECT id,name FROM `loglists`;
SELECT DISTINCT
SELECT DISTINCT
語句用於返回唯一不同的值。
語法
SELECT DISTINCT 查詢欄位 FROM 表名;
// 查詢 loglists 表中 content,name 全部不相同資料
SELECT DISTINCT content,name FROM `loglists`;
若SELECT DISTINCT
查詢多個欄位的話,會根據當前的這些欄位中的值全部不相同的資料。在使用時需要注意的是,不要把唯一主鍵作為查詢條件。
WHERE
WHERE
子句用於提取那些滿足指定標準的記錄。
語法
SELECT 查詢欄位 FROM 表名 WHERE 查詢條件;
// 查詢 loglists 表中 content為111 的資料,查詢欄位包括 content,name,id
SELECT content,name,id FROM loglists WHERE content="111";
AND
第一個條件和第二個條件都成立,則AND
運算子顯示一條記錄。
語法
SELECT 查詢欄位 FROM 表名 WHERE 條件 AND 條件;
// 查詢 loglists 表中 content="111" 並且 id<=150 的資料,查詢欄位包括 id,content,name
SELECT id,content,name FROM loglists WHERE content="111" AND id<=150;
如果有多個條件可以連續AND
查詢。
OR
第一個條件和第二個條件中只要有一個成立,則OR
運算子顯示一條記錄。
語法
SELECT 查詢欄位 FROM 表名 WHERE 條件 OR 條件;
// 查詢 loglists 表中 content="111" 或 id<=150 的資料,查詢欄位包括 id,content,name
SELECT id,content,name FROM loglists WHERE content="111" OR id<=150;
如果有多個條件可以連續OR
查詢。
AND
與OR
同時使用。
// 查詢 loglists 表中 content="111" 並且 id<=150 或者 name="111" 的資料,查詢資料包括 id,content,name
SELECT id,content,name FROM loglists WHERE content="111" AND id<=150 OR name="111";
ORDER BY
ORDER BY
關鍵字用於對結果集進行排序。
- 先將查詢值這一列排序,同為
CN
的排前面,同屬USA
的排後面。 - 然後在同屬
CN
的這些多行資料中,再根據alexa
值的大小排列。 ORDER BY
排列時,不寫明ASC DESC
的時候,預設是ASC
。
ASC
降序
DESC
升序
語法
SELECT 欄位 FROM 表名 ORDER BY 欄位 ASC|DESC;
// 查詢 loglists 包括欄位 id,content,name
// 先將 name 降序排列,把查詢的資料再按照content查詢分割槽塊,按升序排序
SELECT id,content,name FROM loglists ORDER BY name ASC,content DESC;
INSERT INTO
INSERT INTO
語句用於向表中插入新記錄。
語法
INSERT INTO 表名 (新增欄位) VALUES (值);
// 向 loglists 中新增一條資料 欄位為 name,content,text 值為 "aaron","my's aaron","haha"
INSERT INTO loglists (name,content,text) VALUES ("aaron","my's aaron","haha");
下面這種也是插入一條資料帶有條件查詢
// 向 loglists 中插入一條資料
// 插入的資料為 loglists 表中 content = 123 的結構
INSERT INTO loglists SELECT * FROM loglists WHERE content = "123";
上面這種寫寫法需要注意:
- 插入表中與查到的表中的
主鍵
不能相同,一旦相同則會丟擲錯誤 - 若查詢表中有多條資料,則會重複新增多條資料
- 要求表必須存在
UPDATE
UPDATE
語句用於更新表中的記錄。
語法
UPDATE 表明 SET 更新資料(name="liergou") WHERE 條件;
// 更新loglists表
// name="liergou",text="eroguzi",content="ok"
// 根據 id=1 或 text="999"
// 查詢資料並更新
UPDATE loglists SET name="liergou",text="eroguzi",content="ok" WHERE id=1 OR text="999";
DELETE
DELETE
語句用於刪除表中的記錄。
語法
DELETE FROM 表名 WHERE 查詢條件;
// 刪除 loglists 中 id=1 或 text="angie" 的資料
DELETE FROM loglists WHERE id=1 OR text="angie";
刪除所有資料:
DELETE FROM table_name;
DELETE * FROM table_name;
++友情提示:在刪除記錄時要格外小心!因為不能重來!++
LIMIT
擷取查詢資料。
語法
SELECT 欄位 FROM 表名 ORDER BY 查詢欄位 ASC LIMIT 擷取位數;
// 在 loglists 表中
// 按id降序排列,擷取1-3位
SELECT * FROM loglists ORDER BY id ASC LIMIT 3;
如果LIMIT
後面只有一個數則預設為1-n
之間。
在看SQL
語句的時候看到有個一TOP
語句,但是在Mysql
使用的時候,報錯。
Mysql
中實現類似TOP
語句:
SELECT * FROM loglists ORDER BY id ASC LIMIT 1,3;
LIKE
LIKE
操作符用於在WHERE
子句中搜尋列中的指定模式。
語法
SELECT 欄位 FROM 表名 WHERE 搜尋欄位 LIKE 條件;
// 查詢 loglists 表中 text 欄位
// text含有a字母
// 包含所有欄位
SELECT * FROM loglists WHERE name LIKE "%a%";
模糊搜尋規則:
- '%a':以
a
結尾的資料 - 'a%':以
a
開頭的資料 - '%a%':含有
a
的資料
- '_a_':三位且中間字母是
a
的
- '_a':兩位且結尾字母是
a
的
- 'a_':兩位且開頭字母是
a
的
IN
IN
操作符允許在WHERE
子句中規定多個值。
語法
SELECT 欄位 FROM 表名 WHERE 查詢欄位 in 查詢條件;
// 在 loglists 查詢 name 欄位為 a 或 b的資料
SELECT * FROM loglists WHERE name in ("a","b");
若不使用IN
操作符也是可以實現的:
SELECT * FROM loglists WHERE name="a" OR name="b";
這樣的寫法與上面是等價的。
BETWEEN
BETWEEN
操作符用於選取介於兩個值之間的資料範圍內的值。
語法
SELECT 欄位 from 表明 WHERE 條件欄位 BETWEEN 條件1 AND 條件2;
// 在 loglists 表中查詢 id 為 9-11之間的資料
SELECT * from loglists WHERE id BETWEEN 9 AND 11;
JOIN 與 INNER JOIN
join
用於把來自兩個或多個表的行結合起來。INNER JOIN1
產生的結果集中,是表1和表二2的交集。
語法
SELECT 欄位(loglists.id) FROM 表1 INNER JOIN 表2 ON 條件;
// 查詢 loglists 與 children 表
// loglists.id 與 children.cid 相同的資料
// 查詢欄位為
// loglists.id,
// loglists.name,
// children.age,
// loglists.content,
// loglists.text
SELECT
l.id,
l.name,
c.age,
l.content,
l.text
FROM
loglists AS l
INNER JOIN
children AS c
ON
l.id = c.cid;
LEFT JOIN
LEFT JOIN
關鍵字從左表(table1
)返回所有的行,即使右表(table2
)中沒有匹配。如果右表中沒有匹配,則結果為NULL
。
語法
SELECT 欄位 FROM 表1 LEFT JOIN 表二 ON 條件;
// 查詢 loglists 與 children 表
// loglists.id 與 children.cid 相同的資料
// 查詢欄位為
// loglists.id,
// loglists.name,
// children.age,
// loglists.content,
// loglists.text
SELECT
l.id,
l.`name`,
c.age,
l.text,
l.content
FROM
loglists AS l
LEFT JOIN
children AS c
ON
l.id = c.age;
查詢資料如下:
id | name | age | text | content |
---|---|---|---|---|
12 | aaron | 12 | 簡介 | 什麼都沒有 |
13 | angie | null | 簡介 | 有點東西 |
RIGHT JOIN
RIGHT JOIN
關鍵字從右表(table2
)返回所有的行,即使左表(table1
)中沒有匹配。如果左表中沒有匹配,則結果為NULL
。
語法
SELECT 欄位 FROM 表1 RIGHT JOIN 表二 ON 條件;
// 查詢 loglists 與 children 表
// loglists.id 與 children.cid 相同的資料
// 查詢欄位為
// loglists.id,
// loglists.name,
// children.age,
// loglists.content,
// loglists.text
SELECT
l.id,
c.age,
l.`name`,
l.text,
l.content
FROM
loglists AS l
RIGHT JOIN
children AS c
ON
l.id=c.age;
查詢資料如下:
id | name | age | text | content |
---|---|---|---|---|
12 | aaron | 12 | 簡介 | 什麼都沒有 |
null | null | 55 | null | null |
null | null | 77 | null | null |
總結
簡單的做了一些筆記,雖然很基礎個人覺得很實用,如果哪裡有錯誤,請在下方留言指正,我會盡快做出修改。