初級程序員的SQL拾遺(增刪改查)
作者:LYX6666
來源:SegmentFault 思否社區(qū)
前言
雖然平時開發(fā)中經常接觸MySQL,但大多數(shù)的數(shù)據(jù)庫操作都是通過ORM實現(xiàn)的(SpringDataJPA),自己并沒有從底層接觸SQL。
再加上筆者非專業(yè)的身份,對于原生的SQL語句幾乎完全不了解。
本文是寫給自己的,關于原生SQL的一篇筆記。
學習應該掌握邊界,由于這部分不是編程核心,所以不需要背代碼,只需要能理解會粘貼修改即可。
先用圖形界面建幾張表,再練習用SQL語句操作數(shù)據(jù)表即可。
這樣就避免了前期就用純命令行難度過高。
一、增刪改查(CRUD)
在REST規(guī)范中寫到:查詢使用GET、增加使用POST、修改使用UPDATE、刪除使用DELETE。增刪改查是最常見的搬磚了,那么它們的SQL代碼是什么呢?
指令 字段 目標表 參數(shù) 分號
字段告訴SQL要操作哪幾個列,比如查出所有學生的姓名和年齡。
目標表告訴SQL要操作哪張表,比如刪除班級表某個班級?
查——SELECT
SELECT 字段1,字段2,... FORM 表名 WHERE 條件;
// 從學生表查找ID為1的姓名和年齡
SELECT name, age FORM student where id=1;
此時的指令為SELECT
目標表使用FORM 表名來確定
參數(shù)主要是增加篩選的條件,準確查到想要的數(shù)據(jù)
分頁查——LIMIT參數(shù)(對于MySQL)
SELECT 字段1,字段2,... FORM 表名 WHERE 條件 LIMIT 條數(shù);
// 從學生表查找10條性別是女的學生的所有字段
SELECT * FORM student where sex=1 LIMIT 10;
LIMIT不屬于原生SQL的語法,對于不同的發(fā)行版有著不同的實現(xiàn)。
其中MySQL使用的是LIMIT語句,作用是只取出十條。
這種查詢方法常用于Web的分頁查詢。
增加——INSERT
INSERT INTO 表名 (字段1,字段2,...) VALUES (值1,值2,...);
// 向學生表插入姓名為張三、性別為女、年齡20歲的學生
INSERT INTO student (name, sex, age) VALUES (zhangsan, 1, 20);
對于增加操作,指令就變成了INSERT。
增加操作不僅要給出字段還要給出值,所以需要VALUES。
此時作用表的前綴有一些變化,想象一下:
執(zhí)行查詢時,數(shù)據(jù)從數(shù)據(jù)庫到用戶,所以用FORM;
但插入時,數(shù)據(jù)從用戶到數(shù)據(jù)庫,所以是INTO。
而由于插入會直接插到最后一條數(shù)據(jù),所以沒有WHERE參數(shù)。
修改——UPDATE
UPDATE 表名 SET 字段1=值1,字段2=值2,字段3=值3,... WHERE 條件;
// 在學生表中找到id為1的學生,然后更新姓名=張三、年齡=20、性別=男
UPDATE student SET name=zhangsan,age=20,sex=0,... WHERE id=1;
此時的指令為UPDATE。
由于需要修改字段,需要使用SET
修改只針對一條或幾條數(shù)據(jù),必須使用WHERE條件進行限制,否則會修改整張表的數(shù)據(jù)!
刪除——DELETE
DETELE FORM 表名 WHERE 條件;
刪除的指令為DELETE
由于數(shù)據(jù)從表中被拿出來,所以是FROM
刪除只針對一條或幾條數(shù)據(jù),必須使用WHERE條件進行限制,否則會刪除整張表的數(shù)據(jù)!
二、WHERE參數(shù)
WHERE在SQL定義了查詢條件,但有以下幾個注意的地方:
WHERE搭配的操作符
= 字段等于值 > 字段大于值 < 字段小于值 >= 字段大于等于值 <= 字段小于等于值
LIKE 模糊查詢(字段包含值) IN 屬于(字段的值屬于給定的集合) BETWEEN 區(qū)間(字段的值屬于給定的區(qū)間)
例如,使用LIKE '%zhang%'作為條件,'zhangsan'包括了'zhang',就會被查出來。
模糊查詢又分為三種:
前綴匹配 開頭必須相同:zhangsan% 中綴匹配 中間相同即可:%zhangsan% 后綴匹配 結尾必須相同:%zhangsan
WHERE的邏輯運算
或運算使用OR,表示任一個條件滿足則有效。
SELECT 字段 FROM 表名 WHERE 條件1 AND/OR 條件2;
// 在學生表取出年齡大于18歲的女生的所有字段
SELECT * FROM student WHERE sex=1 AND age > 18;
三、多表查詢(連接/JOIN)
軟件開發(fā)中常見的實體關系包括:
一對一(0…1 : 0…1) 一對多/多對一(0…1 : 0…n) 多對多(0…n : 0…n)
他們的交集就是兩張表中有外鍵關聯(lián)的那部分記錄。

SELECT student.id, student.name, klass.name, klass.count
FROM Students
INNER JOIN Klass
ON Klass.id=Student.klass_id;
我們把使用FORM字段的表定義為左表 把使用JOIN字段的表定義為右表
INNER JOIN 一般連接:只查外鍵關聯(lián)的數(shù)據(jù),也就是取交集 LEFT JOIN 左連接:左表全查,右表隨緣,空數(shù)據(jù)置NULL,也就是取集合A RIGHT JOIN 右連接:右表全查,左表隨緣,空數(shù)據(jù)置NULL,也就是取集合B FULL JOIN 全連接:左右表都全查,兩側空數(shù)據(jù)都置NULL,也就是取并集。
四、總結
參考資料

評論
圖片
表情
