SQL基础编程
文章目錄
- 一.SQL的環境搭載
- 單機離線環境
- 在線環境
 
- 二.SQL的單表操作
- 1.sql基礎三步
- 2.sql四則運算
- 3.limit (限制查詢結果個數)
- 4.order by(排序)
- 5.where 綜合條件篩選
- 6.SQL常量
- 7.distinct (把結果中重復的行刪除)
- 8.函數
- (1) 聚合函數:
- `sum()` ——求和函數
- `count()`——計數函數
- `avg()`——平均值函數
- `min()| max()`——最小最大值函數
- `group by `——分組函數
 
- (2) 顯示方式控制函數:
- `round`——控制保留位小數的結果
- `concat`——把分開的兩列合成在一個結果中
 
 
 
- 三.SQL的多表操作
- 1.嵌套子循環
- (1).where子查詢
- (2).from子查詢
- (3).from與where子查詢互換
- (4).select子查詢
 
- 2.JOIN——連接多個數據庫(或多表)
- 3.null與內連接與外連接
 
一.SQL的環境搭載
單機離線環境
安裝:下載Beekeeper-studio
 運行:可導入一個簡單數據庫進行實驗
在線環境
- (這是在python基礎下創造的sql環境,在線可用的python:希冀平臺中的在線實驗)
在希冀平臺實驗輸入sql的方法:
- 第一步:把sql拖入
 
- 第二步:將以下代碼輸入運行框并修改一下,點擊Code,點擊運行,如果運行結尾后有done出現,則說明運行成功。
如圖所示:
- 第三步:對sql數據庫進行操作時前提要輸入%%sql,之后再寫你需要編輯的代碼,否則運行不了
二.SQL的單表操作
1.sql基礎三步
-  書寫順序:select…from…where… 
-  from:定位要載入的表 → 定位hero_data_table數據表(hero_data_table為被剪輯的數據名稱) 
-  select:顯示出想要出現的數據,一行一行的按條件篩選出目標行,*代表選中所有的行,運行出的結果是sql的所有數據 
-  拓展: 
 1.對數據庫名稱簡單重命名為h:from 數據庫名稱 as h
 2.選中數據庫中hero一行(可以同時選中多行中間用,隔開):select h.hero
 3.在select中將自己編輯的新的數據命名 eg:h.life + h.speed + h.attack as '顯示數字的總和')
 如圖:
-  where:輸入篩選目標的代碼,顯示出來目標行中的指定列 
 
 以上顯示的是所有speed>350的英雄數據
-  注意事項:大前提是輸入的代碼應全為英文,標點符號也是,在select中不想顯示所有行,可以h.想要選中某一行的名稱,用英文逗號隔開,數據庫命名為h之后,h后面的內容必須是數據庫每一列名稱的內容 
 
2.sql四則運算
sql可以單獨經行運算
| 加法運算 | + | 
| 減法運算 | _ | 
| 乘法運算 | * | 
| 除法運算 | / | 
| 求余運算 | % | 
就好像select語句不需要from就可以獨立成句顯示常量一樣,select語句也可以獨立成句進行簡單四則運算。
| select 3+2 | 3+2=5 | 
| select 3/2 | select 3/2=1 | 
| select 3/2.0 | select 3/2.0=1.5 | 
| select (3*(2+3))/5-6 as ‘復合運算’ | 復合運算 = -3 | 
既然獨立成句語境下支持,那么在更加復雜的使用環境下也同樣支持,比如:
 產品檔位劃分如下
| [0,10) | 1 | 
| [10, 20) | 2 | 
| [20, 30) | 3 | 
使用select和where四則運算得到極簡文具公司數據庫處在2,3檔位的文具
代碼如下:
select p.產品_描述,p.產品_售價, p.產品_售價/10+1 as '價格檔位' from 產品 as p where (p.產品_售價/10+1) in (2,3)代碼結果如下:
| 自動鉛筆 | 15 | 2 | 
| 16開筆記本 | 22 | 3 | 
| 中性筆 | 18 | 2 | 
| 馬克筆 | 10 | 2 | 
| 文件夾 | 20 | 3 | 
3.limit (限制查詢結果個數)
- 比如對于以下代碼
其運行的結果就有213行
- 如果我們指向顯示,比如10行,就可以用以下的代碼實現
代碼結果如下:有十行內容
| 80001 | 19456 | 
| 80016 | 19037 | 
| 80037 | 39582 | 
| 80040 | 15012 | 
| 80047 | 19621 | 
| 80048 | 26637 | 
| 80064 | 17921 | 
| 80075 | 23015 | 
| 80086 | 11860 | 
| 80106 | 16212 | 
- limit 之后一般是數字
4.order by(排序)
- order by XXX desc 降序
- order by XXX asc 升序
- 應用舉例:在產品表中,價格檔位,售價降序排列
 
5.where 綜合條件篩選
where主要為篩選功能,對數據庫進行一定規則的限制,從而達到我們需要得到的數據 (除篩選外還具有連接多表的功能,目前先不展開)
- 比較運算符:
| = | 判斷相等 | score = 80 | 你現在學的SQL不是編程語言→ = 在編程語言中是賦值的意思 | 
| > | 判斷大于 | score > 80 | |
| >= | 判斷大于或相等 | score >= 80 | |
| < | 判斷小于 | score < 80 | |
| <= | 判斷小于或相等 | score <= 80 | |
| <> | 判斷不相等 | score <> 80 | 有些數據庫 != | 
| LIKE | 判斷字符串相似 | name LIKE 'ab%' | %表示任意字符,例如’ab%‘將匹配’ab’,‘abc’,‘abcd’ 注意有些數據庫大小寫敏感,有些不敏感 | 
| is NULL | 判斷是否是NULL | score is NULL | 用來檢測空值 | 
-  LIKE的靈活使用 -  以X開頭 like 'X%' 
-  以X結尾 like '%X' 
-  包含X like '%X%' 
-  eg:使用SQL的條件表達式搜索那個叫做ca...的游戲英雄的全部屬性 
 
-  
代碼結果:
 
- 邏輯運算符
| 兩個條件都滿足 | <條件1> and <條件2> | where (h.attack>60) and (h.Hero like 'L%') 攻擊力大于60且名字以L開頭的游戲英雄 | 
| 在閉區間[X , Y]之內 | between X and Y | where h.life between 445 and 580 生命值大于等于445且小于等于580 | 
| 兩個條件至少滿足一個 | <條件1> or <條件2> | where (h.life > 600) or (h.armor = 20) 生命值大于600 或者 護甲等于20 | 
| 在X, Y, Z 中存在 | IN (X, Y, Z) | where h.Hero in ('Lo', 'Zoe', 'Tariq') 游戲英雄名稱是Lo或者Zoe或者Tariq where h.life in (445,580) 生命值是445或者580 | 
| 條件不滿足 | NOT <條件> | where not h.attack_speed = 1 攻擊速度不是1 where h.Hero not in ('Lo', 'Zoe', 'Tariq') 游戲英雄名稱不是Lo或者Zoe或者Tariq | 
| 指定多復合運算的關系 | ( ) | where (h.life > 500) and (not h.attack_speed = 1) and (not (h.Hero like 'A%')) 生命值大于500且攻擊速度不是1且名稱不以A開頭 | 
6.SQL常量
- select語句不需要from就可以獨立成句顯示常量,而且也能進行四則運算
- 只使用select語句顯示常量
代碼結果
| 1000 | 
代碼結果
| 1000 | 你好 | 2021-03-18 | 
代碼結果
| 1000 | 你好 | 2020-10-28 | 
- 例子:希望在極簡文具數據庫中找到價格<20的產品,并注明商品特征是便宜商品
結果:
| 便宜產品 | 自動鉛筆 | 15 | 
| 便宜產品 | 32開筆記本 | 8 | 
| 便宜產品 | 中性筆 | 18 | 
| 便宜產品 | 橡皮 | 5 | 
| 便宜產品 | 馬克筆 | 10 | 
7.distinct (把結果中重復的行刪除)
如果要得到極簡文具公司數據庫的所有收入超過一百萬的訂單的SQL代碼如下:
selects.銷售訂單_日期_月 as '有超過百萬訂單月' from銷售 as s wheres.銷售數量 * s.產品_價格 > 1000000 order by有超過百萬訂單月代碼結果:
| 1 | 
| 2 | 
| 2 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 5 | 
| 6 | 
| 11 | 
| 12 | 
以上我們發現2月和5月的訂單都有重復超過一萬的,而我們想要的是月份,不讓它有重復,我們只需要在select后加個distinct便可實現
select distincts.銷售訂單_日期_月 as '有超過百萬訂單月' from銷售 as s wheres.銷售數量 * s.產品_價格 > 1000000 order by有超過百萬訂單月代碼結果:
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 11 | 
| 12 | 
注意:如果放在多個列之前,則會只刪除所有列內容都同時重復的行,比如以下代碼:
select distincts.銷售訂單_日期_月 as '有百萬單月',s.銷售數量 * s.產品_價格 as '銷售額' from銷售 as s wheres.銷售數量 * s.產品_價格 > 1000000 order bys.銷售訂單_日期_月, 銷售額結果:
 
8.函數
(函數大致含義:f(x)=y)
- 聚合函數
- 顯示方式控制函數
(1) 聚合函數:
sum() ——求和函數
很多時候我們需要計算搜索出來的數據的綜合,就需要用到sum()函數,比如:
 
 意思是:在銷售表中銷售數量一列的總和
count()——計數函數
如果我們想要知道第十一月份有多少筆訂單
 代碼如下:
結果:
 
avg()——平均值函數
sum()/count()這種表示運算出的結果不帶小數
eg:求極簡文具庫11月份的產品單位訂單平均銷量
 avg直接表示:
結果:
sum()/count()的兩種表示:
 1.
結果:
 
min()| max()——最小最大值函數
在select中篩選出最大最小的數,用where也可以實現,但比直接用最大最小麻煩一些
eg:使用min()和max()獲得極簡文具公司數據庫中最貴和最便宜的產品售價
 1.min()max()直接實現:
結果:
 
 2.where語句實現:
 最高售價:
最低售價:
select distinct p.產品_價格 from 銷售 as p order by p.產品_價格 asc limit 1區別:where語句中主要通過distinct,order by,limit來實現的
group by ——分組函數
eg:我們想要得到每個月份的銷量總和(這就需要以月份為對象進行分組,然后再求出每個月份的銷售總和)
 未分組前的數據:
 
 分組后:代碼如下
結果如下:
 
(2) 顯示方式控制函數:
round——控制保留位小數的結果
由avg()函數中的結果得知,小數點后面有很多位,如果我們想要保留兩位小數可以用round函數實現
 
 代碼如下:
代碼結果:
 
concat——把分開的兩列合成在一個結果中
理解說明:
 在英雄數據庫中Hero和life是獨立的兩個屬性
 
 而concat的作用是把兩列合并到一起
 
 concat在sqlite與mysql的表達方法不一樣
 希冀與beekeeper中是sqlite形式
 sqlite中:代碼如下:
mysql中:代碼如下:
selectconcat(h.Hero,' 的生命值是 ',h.life) as '生命值>580的英雄描述' fromhero_data_table as h whereh.life > 580兩種方式的代碼結果都是一樣的:
 
三.SQL的多表操作
1.嵌套子循環
(1).where子查詢
(簡單來說就是在where里面嵌套一個或者加一個sql的語句)
舉個栗子:在英雄數據庫中找到比Nesus更快的游戲英雄
 思路:首先,要找到Nesus這個英雄的速度,再以它為篩選條件輸入在where中找到比它更快的英雄
 找到Nesus的速度代碼如下:
結果:
 所以以它為條件找到速度比350更快的英雄代碼如下:
代碼結果:
 
(2).from子查詢
(與where子查詢類似,這次是在from中嵌套一個sql語句)
舉個栗子:在英雄數據庫中找到比Nesus快的英雄中魔法值大于200的游戲英雄
 大致思路:我們是要在嵌套中再加一個嵌套,我們已經有了比Nesus更快的游戲英雄的代碼了(里面已經包含了一個嵌套了),只需要把它嵌套在from中
首先,已知比Nesus快的代碼了,只需要寫出魔法值>200的代碼
 代碼如下:
所以將兩個代碼結合:如下
select * from ( -- 以下子查詢得到比Nesus速度快的所有游戲英雄數據select *from hero_data_table as h2where h2.speed > ( -- 以下子查詢語句得到Nesus的速度select h1.speedfrom hero_data_table as h1where h1.Hero='Nesus') ) as h3 where h3.magic > 200;代碼結果:
 
(3).from與where子查詢互換
其實from子查詢是可以直接轉化為where子查詢的,比如針對找到比Nesus快的所有的游戲英雄中魔法值大于200的游戲英雄的例子
我們可以進行如下轉換:
select * from hero_data_table as h3 where h3.magic > 200 and h3.Hero in(select h2.Herofrom hero_data_table as h2where h2.speed > ( -- 以下子查詢語句得到Nesus的速度select h1.speedfrom hero_data_table as h1where h1.Hero='Nesus') )不管那種方式,代碼最后運行的結果都是一樣的:
 
(4).select子查詢
(與where和from子循環一樣與,是在select中嵌套sql語句)
 大致思路:
 eg:統計極簡文具公司數據庫_升級版中無產品_售價1的產品有多少個?
 (需用到null的語法,建議在后續學過null再回過頭看更清楚一些)
 代碼如下:
代碼結果:
2.JOIN——連接多個數據庫(或多表)
(簡單來說就是通過表中的相同的部分把表連接起來)
 
 如上圖,可以把客戶表可以跟銷售表通過客戶_ID連接,產品表跟銷售表可以通過產品_代碼連接,于是最終結果客戶和產品表通過銷售表連接在一起。
- 兩表連接的代碼如下:
 使用把極簡文具公司數據庫中的客戶表格和產品表格通過關聯列客戶_ID關聯起來
代碼結果
| 圖龍信息信息有限公司 | 1/10/2020 | 352632 | 
| 圖龍信息信息有限公司 | 1/26/2020 | 78112 | 
| 圖龍信息信息有限公司 | 1/31/2020 | 771584 | 
| 圖龍信息信息有限公司 | 1/7/2020 | 50224 | 
| 圖龍信息信息有限公司 | 4/17/2020 | 505960 | 
| 圖龍信息信息有限公司 | 6/18/2020 | 516990 | 
| 圖龍信息信息有限公司 | 6/2/2020 | 809116 | 
| 圖龍信息信息有限公司 | 6/29/2020 | 840366 | 
- 多表連接代碼如下:
應用:通過電子專賣店數據庫,對比2018年6,7,8月份的銷售額,要求保留小數后兩位,總銷售額以億為單位。
 實現結果:
 代碼如下:
3.null與內連接與外連接
-null(在有些環境下none與null表達一樣)(null的意思是空值,表示未知)
 應用實例:判斷極簡文具公司數據庫_升級版中是否有產品未定產品_售價,或者缺少產品_代碼
 代碼如下:
代碼結果:
 日常生活中我們可以用null檢測出沒有標價的商品
- inner join內連接
 理解:通常的內連接表示兩個表中的交集部分
 
- 內連接表示的關系最嚴格,即,只返回滿足條件的兩個表格的交集
- 即:只顯示A和B中A.Key=B.Key的那些行,如果在A中有些A.Key在B中沒有,無法進行匹配,則不顯示,例如空值,A中某一部分如果有空值與B無法匹配,則那一行數據就不會有顯示。
- 舉個栗子:在極簡文具庫升級版中顯示出,產品_代碼,產品_描述,銷售_訂單_ID所有的信息
 代碼:
結果:
 但是,我們發現,它并沒有顯示出有空值的數據
 原因就是inner join 連接的是兩個表中的交集,并不會顯示一個表中的空值部分,如果想要顯示出空值就需要使用外連接。
- outter join外連接
 理解:
 緊接上一個栗子,顯示出沒有訂單的產品(就是顯示出空值)
 代碼如下:
代碼結果:
其中里面最核心的地方是 left join (左連接),它顯示出了相交的部分與沒有相交的部分,顯示沒有相交的部分是產品表中的空值部分,同理也有右連接但sqlite不支持,那想要顯示出銷售表中的空值只需要把from中銷售表與產品表中的位置互換就可以。
總結
 
                            
                        - 上一篇: 【转载】别了,摩托罗拉(十):“战争部落
- 下一篇: 静,动态数组总结
