日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL基础编程

發布時間:2023/12/9 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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出現,則說明運行成功。
%reload_ext sql%sql sqlite:///需要你輸入sql的文件名.sqlite%sql ATTACH '需要你輸入sql的文件名.sqlite' AS e_store_db;

如圖所示:

  • 第三步:對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+23+2=5
select 3/2select 3/2=1
select 3/2.0select 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)

代碼結果如下:

產品_描述產品_售價價格檔位
自動鉛筆152
16開筆記本223
中性筆182
馬克筆102
文件夾203

3.limit (限制查詢結果個數)

  • 比如對于以下代碼
select s.銷售_訂單_ID, s.銷售數量 from 銷售 as s

其運行的結果就有213行

  • 如果我們指向顯示,比如10行,就可以用以下的代碼實現
select s.銷售_訂單_ID, s.銷售數量 from 銷售 as s **limit 10 -- 限制只顯示10行結果

代碼結果如下:有十行內容

銷售_訂單_ID銷售數量
8000119456
8001619037
8003739582
8004015012
8004719621
8004826637
8006417921
8007523015
8008611860
8010616212
  • limit 之后一般是數字

4.order by(排序)

  • order by XXX desc 降序
  • order by XXX asc 升序
  • 應用舉例:在產品表中,價格檔位,售價降序排列

5.where 綜合條件篩選

where主要為篩選功能,對數據庫進行一定規則的限制,從而達到我們需要得到的數據 (除篩選外還具有連接多表的功能,目前先不展開)

  • 比較運算符:
條件意義表達式舉例1
=判斷相等score = 80你現在學的SQL不是編程語言→ = 在編程語言中是賦值的意思
>判斷大于score > 80
>=判斷大于或相等score >= 80
<判斷小于score < 80
<=判斷小于或相等score <= 80
<>判斷不相等score <> 80有些數據庫 !=
LIKE判斷字符串相似name LIKE 'ab%'%表示任意字符,例如’ab%‘將匹配’ab’,‘abc’,‘abcd’
注意有些數據庫大小寫敏感,有些不敏感
is NULL判斷是否是NULLscore is NULL用來檢測空值
  • LIKE的靈活使用

    • 以X開頭 like 'X%'

    • 以X結尾 like '%X'

    • 包含X like '%X%'

    • eg:使用SQL的條件表達式搜索那個叫做ca...的游戲英雄的全部屬性

select * from hero_data_table as 'h' where h.Hero like 'ca%'

代碼結果:

  • 邏輯運算符
意義公式舉例
兩個條件都滿足<條件1> and <條件2>where (h.attack>60) and (h.Hero like 'L%')
攻擊力大于60且名字以L開頭的游戲英雄
在閉區間[X , Y]之內between X and Ywhere 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語句顯示常量
  • select 1000

    代碼結果

    1000
    1000
  • select 1000 , '你好' , '2021-03-18'

    代碼結果

    1000‘你好’‘2021-03-18’
    1000你好2021-03-18
  • select1000 as '數字','你好' as '字符串','2020-10-28' as '日期';

    代碼結果

    數字字符串日期
    1000你好2020-10-28
    • 例子:希望在極簡文具數據庫中找到價格<20的產品,并注明商品特征是便宜商品
    select'便宜產品' as '產品特征',p.產品_描述 as '產品名稱',p.產品_售價 as '產品價格' from產品 as p wherep.產品_售價 < 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()——計數函數

    如果我們想要知道第十一月份有多少筆訂單
    代碼如下:

    select count(s.銷售_訂單_ID) as '11月訂單數' from 銷售 as s where s.銷售訂單_日期_月 = 11

    結果:

    avg()——平均值函數

    sum()/count()這種表示運算出的結果不帶小數

    eg:求極簡文具庫11月份的產品單位訂單平均銷量
    avg直接表示:

    select avg(s.銷售數量) as '11月平均每筆訂單銷量' from 銷售 as s where s.銷售訂單_日期_月 = 11

    結果:

    sum()/count()的兩種表示:
    1.

    select sum(s.銷售數量)/count(s.銷售數量) as '11月平均每筆訂單銷量' from 銷售 as s where s.銷售訂單_日期_月 = 11
  • select sum(s.銷售數量)/count(客戶_ID) as '11月平均每筆訂單銷量' from 銷售 as s where s.銷售訂單_日期_月 = 11

    結果:

    min()| max()——最小最大值函數

    在select中篩選出最大最小的數,用where也可以實現,但比直接用最大最小麻煩一些

    eg:使用min()和max()獲得極簡文具公司數據庫中最貴和最便宜的產品售價
    1.min()max()直接實現:

    selectmax(p.產品_售價) as '最高售價',min(p.產品_售價) as '最低售價' from產品 as p

    結果:

    2.where語句實現:
    最高售價:

    select distinct p.產品_價格 from 銷售 as p order by p.產品_價格 desc limit 1

    最低售價:

    select distinct p.產品_價格 from 銷售 as p order by p.產品_價格 asc limit 1

    區別:where語句中主要通過distinct,order by,limit來實現的

    group by ——分組函數

    eg:我們想要得到每個月份的銷量總和(這就需要以月份為對象進行分組,然后再求出每個月份的銷售總和)
    未分組前的數據:

    分組后:代碼如下

    select p.銷售訂單_日期_月,sum(p.銷售數量) as '每月銷售總額' from 銷售 as p group by p.銷售訂單_日期_月

    結果如下:

    (2) 顯示方式控制函數:

    round——控制保留位小數的結果

    由avg()函數中的結果得知,小數點后面有很多位,如果我們想要保留兩位小數可以用round函數實現

    代碼如下:

    selectround(avg(s.銷售數量),2) as '11月平均每筆訂單銷量' from銷售 as s wheres.銷售訂單_日期_月 = 11

    代碼結果:

    concat——把分開的兩列合成在一個結果中

    理解說明:
    在英雄數據庫中Hero和life是獨立的兩個屬性

    而concat的作用是把兩列合并到一起

    concat在sqlite與mysql的表達方法不一樣
    希冀與beekeeper中是sqlite形式
    sqlite中:代碼如下:

    selecth.Hero || ' 的生命值是 ' || h.life as '生命值>580的英雄描述' fromhero_data_table as h whereh.life > 580

    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的速度代碼如下:

    select h1.speed from hero_data_table as h1 where h1.Hero = 'Nesus'

    結果:
    所以以它為條件找到速度比350更快的英雄代碼如下:

    select * from hero_data_table as h2 where h2.speed > ( -- 以下子查詢語句得到Nesus的速度select h1.speedfrom hero_data_table as h1where h1.Hero='Nesus');

    代碼結果:

    (2).from子查詢

    (與where子查詢類似,這次是在from中嵌套一個sql語句)

    舉個栗子:在英雄數據庫中找到比Nesus快的英雄中魔法值大于200的游戲英雄
    大致思路:我們是要在嵌套中再加一個嵌套,我們已經有了比Nesus更快的游戲英雄的代碼了(里面已經包含了一個嵌套了),只需要把它嵌套在from中

    首先,已知比Nesus快的代碼了,只需要寫出魔法值>200的代碼
    代碼如下:

    select * from --比Nesus快的所有的游戲英雄-- where magic>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再回過頭看更清楚一些)
    代碼如下:

    select (select count(h.產品_售價 is null) as '無價格產品個數' from 產品 as h where h.產品_售價 is null) as '無價格產品個數',(select count(h.產品_售價) as '有價格產品個數' from 產品 as h) as '有價格產品個數'

    代碼結果:

    2.JOIN——連接多個數據庫(或多表)

    (簡單來說就是通過表中的相同的部分把表連接起來)

    如上圖,可以把客戶表可以跟銷售表通過客戶_ID連接,產品表跟銷售表可以通過產品_代碼連接,于是最終結果客戶和產品表通過銷售表連接在一起。

    • 兩表連接的代碼如下:
      使用把極簡文具公司數據庫中的客戶表格和產品表格通過關聯列客戶_ID關聯起來
    select c.客戶_名稱, s.銷售訂單_日期,s.銷售數量 * s.產品_價格 as '訂單金額' from客戶 as c JOIN 銷售 as sONc.客戶_ID = s.客戶_ID wherec.客戶_ID = 101

    代碼結果

    客戶_名稱銷售訂單_日期訂單金額
    圖龍信息信息有限公司1/10/2020352632
    圖龍信息信息有限公司1/26/202078112
    圖龍信息信息有限公司1/31/2020771584
    圖龍信息信息有限公司1/7/202050224
    圖龍信息信息有限公司4/17/2020505960
    圖龍信息信息有限公司6/18/2020516990
    圖龍信息信息有限公司6/2/2020809116
    圖龍信息信息有限公司6/29/2020840366
    • 多表連接代碼如下:
    select ... from A JOIN B on A.id1 = B.id1C on A.id2 = C.id2

    應用:通過電子專賣店數據庫,對比2018年6,7,8月份的銷售額,要求保留小數后兩位,總銷售額以億為單位。
    實現結果:
    代碼如下:

    select c.年度,c.月,round(sum(h.銷售單價*s.銷售數量)/100000000,2) as '銷售總額_億元' from 產品明細 as h join 銷售明細 as s on h.產品編號=s.產品編號 join 日期 as c on s.訂單日期=c.日期 where c.月 in (6,7,8) and c.年度=2018 group by c.月,c.年度

    3.null與內連接與外連接

    -null(在有些環境下none與null表達一樣)(null的意思是空值,表示未知)
    應用實例:判斷極簡文具公司數據庫_升級版中是否有產品未定產品_售價,或者缺少產品_代碼
    代碼如下:

    select * from產品 as p wherep.產品_代碼 is NULL or p.產品_售價 is NULL

    代碼結果:
    日常生活中我們可以用null檢測出沒有標價的商品

    • inner join內連接
      理解:通常的內連接表示兩個表中的交集部分
    • 內連接表示的關系最嚴格,即,只返回滿足條件的兩個表格的交集
    • 即:只顯示A和B中A.Key=B.Key的那些行,如果在A中有些A.Key在B中沒有,無法進行匹配,則不顯示,例如空值,A中某一部分如果有空值與B無法匹配,則那一行數據就不會有顯示。
    • 舉個栗子:在極簡文具庫升級版中顯示出,產品_代碼,產品_描述,銷售_訂單_ID所有的信息
      代碼:
    selectp.產品_代碼,p.產品_描述,s.銷售_訂單_ID from產品 as pJOIN 銷售 as s ON p.產品_代碼 = s.產品_代碼 order bys.銷售_訂單_ID

    結果:
    但是,我們發現,它并沒有顯示出有空值的數據
    原因就是inner join 連接的是兩個表中的交集,并不會顯示一個表中的空值部分,如果想要顯示出空值就需要使用外連接。

    • outter join外連接
      理解:
      緊接上一個栗子,顯示出沒有訂單的產品(就是顯示出空值)
      代碼如下:
    select p.產品_代碼,p.產品_描述,s.銷售_訂單_ID from 產品 as p left join 銷售 as son p.產品_代碼 = s.產品_代碼 order by s.銷售_訂單_ID asc

    代碼結果:

    其中里面最核心的地方是 left join (左連接),它顯示出了相交的部分與沒有相交的部分,顯示沒有相交的部分是產品表中的空值部分,同理也有右連接但sqlite不支持,那想要顯示出銷售表中的空值只需要把from中銷售表與產品表中的位置互換就可以。

    總結

    以上是生活随笔為你收集整理的SQL基础编程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。