<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          初級程序員的SQL拾遺(增刪改查)

          共 3677字,需瀏覽 8分鐘

           ·

          2022-04-27 23:37

          作者:LYX6666

          來源:SegmentFault  思否社區(qū) 


          前言



          雖然平時開發(fā)中經常接觸MySQL,但大多數(shù)的數(shù)據(jù)庫操作都是通過ORM實現(xiàn)的(SpringDataJPA),自己并沒有從底層接觸SQL。


          再加上筆者非專業(yè)的身份,對于原生的SQL語句幾乎完全不了解。

          本文是寫給自己的,關于原生SQL的一篇筆記。

          學習應該掌握邊界,由于這部分不是編程核心,所以不需要背代碼,只需要能理解會粘貼修改即可。

          小Tip:

          初學者如何調試SQL代碼呢?可以用Navicat或PHPMyAdmin可視化練習。

          先用圖形界面建幾張表,再練習用SQL語句操作數(shù)據(jù)表即可。

          這樣就避免了前期就用純命令行難度過高。

          一、增刪改查(CRUD)



          在REST規(guī)范中寫到:查詢使用GET、增加使用POST、修改使用UPDATE、刪除使用DELETE。增刪改查是最常見的搬磚了,那么它們的SQL代碼是什么呢?


          我們先以單表為例(也就是無外鍵情況)。

          單表操作的命令具有很強的規(guī)律。包括以下要素:

          • 指令
          • 字段
          • 目標表
          • 參數(shù)
          • 分號

          指令告訴SQL要執(zhí)行什么操作,是增加?還是修改?還是刪除?

          字段告訴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搭配的操作符


          常規(guī)操作符

          • = 字段等于值
          • > 字段大于值
          • < 字段小于值
          • >= 字段大于等于值
          • <= 字段小于等于值

          特殊操作符

          • LIKE 模糊查詢(字段包含值)
          • IN 屬于(字段的值屬于給定的集合)
          • BETWEEN 區(qū)間(字段的值屬于給定的區(qū)間)

          模糊查詢指的是,被查詢的字段不需要嚴格等于某字符串,只需要包含字符串即可。

          例如,使用LIKE '%zhang%'作為條件,'zhangsan'包括了'zhang',就會被查出來。

          模糊查詢又分為三種:

          • 前綴匹配 開頭必須相同:zhangsan%
          • 中綴匹配 中間相同即可:%zhangsan%
          • 后綴匹配 結尾必須相同:%zhangsan


          WHERE的邏輯運算


          在編程語言中一定會用到邏輯用語(與、或、非),而SQL中也有與、或。

          邏輯運算符連接兩個條件。
          與運算使用AND,表示兩個條件都滿足才有效。
          或運算使用OR,表示任一個條件滿足則有效。
          實際使用場景可以多個邏輯符連續(xù)使用,并用括號定義優(yōu)先級。

          寫法:

          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),而多對多使用中間表關聯(lián)。

          對于外鍵關聯(lián)的三種情況,在查詢時,往往需要通過table1把與之關聯(lián)的table2一并查出來。

          這時候可以使用JOIN,把兩張表拼成一張表。

          關聯(liá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,也就是取并集。


          四、總結



          借助編程語言強大的ORM(實體關系映射),增刪改查的操作幾乎不再需要手寫SQL來完成,但我們不能對ORM形成依賴而忘記了原生SQL怎么寫。

          這也是一門必修課,至少能看懂增刪改查的基本寫法,才能在一些特殊需求中知道如何變通,也能在JPA出問題時通過查看生成的SQL語句來順利的Debug。

          文章中提到的內容基本覆蓋日常增刪改查的需要,而對于如何定義主鍵、外鍵,如何建表、刪表,如何添加、編輯字段,這些非高頻操作,以后再說。

          參考資料



          菜鳥教程:https://www.runoob.com/sql/sql-tutorial.html



          點擊左下角閱讀原文,到 SegmentFault 思否社區(qū) 和文章作者展開更多互動和交流,掃描下方”二維碼“或在“公眾號后臺回復“ 入群 ”即可加入我們的技術交流群,收獲更多的技術文章~

          - END -


          瀏覽 35
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  午夜爱爱动态视频欧美 | 亚洲精品国产精品国自产在线 | 成人久久电影 | 国产又粗又大 | 国产成人毛片18女人18精品 |