
1. 基本介紹
sql_store是一個數據庫,而customers是數據庫中的一個表格。
1.1 如何選擇一個數據庫
最簡單的操作就是雙擊圖中的數據庫,另一種方式是輸入命令:
use sql_store;
注:顯示為粗體的數據庫為當前選定的數據庫;輸入命令調用數據庫需要用“;”結束命令。
1.2 如何選擇一個表格
在選定數據庫后,需要選擇特定的表格:
(1)選擇表格所有的列
selcet *
from customers
(2)選擇表格特定的列
例如,選擇客戶的id以及姓氏的兩列:
select customer_id, first_name
from customers
1.3 如何選定特定條件的行
在選定表格之后,選擇客戶id為1的行:
where customer_id = 1
1.4 如何排序
例如,選定表格后,按照姓氏排序
order by first_name
1.5 如何寫注釋
只需要"-- "
-- where customer_id = 1
1.6 語法順序
select *
from customers
where customer_id = 1
order by first_name
最好的邏輯順序是select-from-where-order by
注:上述四行命令可以寫成一行,只需要用空格隔開,但分成四行更清晰直觀
2. select語句
select語句是用於調用所選表格的特定的列,因為數據庫的數據可能成千上萬,如果我們調用無關的列,將會浪費運行的時間和空間。
2.1 命令行排序決定輸出的排序
例如:
select first_name, last_name, points
from customers
返回結果如下

若將姓氏與名字調換順序,則
select last_name, first_name, points
from customers
返回結果如下

2.2 對列進行算術運算
例如我們需要得到“用戶積分×10+100”的列
select
last_name,
first_name,
points,
points * 10 + 100
from customers
結果如下

注:選擇的四列也可寫成一行
(1)加減乘除基本運算
select
last_name,
first_name,
points,
points + 10,
points - 10,
points * 10,
points / 10,
points % 10
from customers

(2)運算順序
對列進行算術運算,優先進行乘除,再進行加減。但我們可以用括號改變運算順序


2.3 為新的列命名
上述產生的新的列的列名沒有表達明確的意義,我們可以為新列重新命名
select
last_name,
first_name,
points,
(points + 10) * 100 as discount_factor
from customers
“as”語法可以為新的列命名,結果如下

如果我們希望列名中包含空格,我們可以用如下的命令
select
last_name,
first_name,
points,
(points + 10) * 100 as 'discount factor'
from customers
結果如下

2.4 顯示一列中不同值
例如客戶來自不同的州,我們想要知道哪些州有我們的客戶,即不查看重復值。
我們發現有重復的州
select state
from customers

我們想要查看非重復的,只需要加入“distinct”語法
select distinct state
from customers

2.5 小結
在select語句中, 我們可以:
(1)用 * 來選擇所有的列,
(2)輸入列名選擇特定的列,
(3)運用算術運算獲得新的列,
(4)用 as 給列重新命名,
(5)用distinct獲得五重復值的結果。
【小練習】
選擇products表格中的產品的名字,單位價格以及新的價格,新的價格需要自己創建,它是單位價格的1.1倍。
3. where語句
where語句是用於調用滿足特定條件的行,在這一節的例子中我們仍舊采用sql_store的數據庫中customers表格的數據。
以下是常用的符號

如果所需要篩選的條件是字符串,需要用引號括起來。
例如,我們需要調取生活在弗吉尼亞州的客戶的所有數據:
select *
from customers
where state = 'VA'

注:使用小寫的va也是可以的
如果所需要篩選的條件是日期,也是只需要用引號括起來。
例如,我們需要調取1990年及以后出生的客戶的所有數據:
select *
from customers
where birth_date > '1990-01-01'

3.1. and,or以及not語句
如果我們調用滿足多種條件的數據,我們需要使用邏輯運算符號and,or和not。
select *
from customers
where birth_date > '1990-01-01' or points > 1000 and state = 'VA'
請問最后一行代碼是篩選出生於1990年及以后或積分大於1000的客戶,且在滿足前面兩種情況的同時,必須滿足顧客生活在弗吉尼亞州;還是篩選出生於1990年及以后的顧客或積分大於1000且生活在弗吉尼亞州的顧客呢?
答案是后者,因為and運算符號具有更高的優先級。雖然如此,但加上括號可以使得命令更清晰明。
3.2 in語句
如果我們需要找生活中特定幾個州的顧客,運用上一節的知識,我們可以這樣寫:
select *
from customers
where state = 'VA' or state = 'GA' or state = 'FL'
但是我們不能寫成如下形式:
select *
from customers
where state = 'VA' or 'GA' or 'FL'
or語句只能並列多個條件,而‘GA’和‘FL’只是字符串,state = ‘VA’則是一個布爾值,因此這行命令是錯誤的。
如果or語句並列的條件是對於同一列的值進行判斷,則可以用in語句來簡化命令:
select *
from customers
where state in ('VA','FL','GA')
我們可以對in語句使用not邏輯運算:
select *
from customers
where state not in ('VA','FL','GA')

3.3 between語句
當我們需要調用積分在1000到3000的顧客的信息,我們可以使用and邏輯運算符號:
select *
from customers
where points >= 1000 and points <= 3000

當我們需要選取一定范圍內的數值時,我們可以用between來簡化命令:
select *
from customers
where points between 1000 and 3000
【小練習】
我們需要調用出生日期在1990年至2000年之間的顧客的信息。
3.4 like語句
當我們想要調用具有特定字符串的顧客的信息時,我們可以用like語句。
例如,我們需要調用姓氏以b開頭的客戶:
select *
from customers
where last_name like 'b%'


注:b可以用多個字符串代替,如abc;數字也可以使用,當然是對於電話號碼之類的
%-代表多個字符串
_-代表一個字符串
3.5 regexp語句
like的使用范圍有限,類似於python中的正則表達式,在mysql中也有類似的正則表達式。

正則表達式對於滿足多種條件的查詢非常方便。

例如:
select *
from customers
where last_name regexp 'field|mac|rose'

雖然這並不是正則表達的所有內容,但是以上語法足夠適用於日常生活。
【小練習】
選擇用戶的名字含有ELKA或者AMBUR的
選擇用戶的姓氏以EY或者ON結尾的
選擇用戶的姓氏以MY開始或者包含SE的
選擇用戶的姓氏包含BR或者BU的
3.6 is null語句
查詢某列值為空值的行
select *
from customers
-- 查詢電話信息為空的行
where phone is null
-- 不為空值則使用
where phone is not null
-- 注:這兩行命令只能執行其中一個,否則報錯
3.7 小結

注:日期和字符串一樣,引用時需要用括號括起來,但是在篩選日期區間時,與數字區間一樣使用between語句。
4. order by語句
4.1 查看排序的依據
目前顧客表格customers是根據customer_id排序的

怎么知道是按照customer_id排序的呢?

我們可以點擊左欄中小工具圖標后,出現以下內容

列名中有黃色標志的列為默認排序所依據的列,一般此類列具有可識別性,例如你的學號,在學校不會有人與你的學號重復,那么我們就可以用學號來代替每一個人並且不會一個學號對應兩個人的情況。
如果我們希望表格按名字字母排序:
select *
from customers
order by first_name
-- 注:一定要選擇數據庫,類似於use sql_store

4.2 倒序
如果我們希望按名字字母倒序排序(若數字,則變成從大到小):
order by first_name desc

4.3 多重排序
若要進行多重排序,則按照順序依次寫在order by后面:
order by state desc, first_name desc
該命令指:先根據state的倒敘排序,在state相同的情況下再根據first_name的倒敘排序

4.4 所選擇的列與排序所依據的列的關系
即使我們所選擇的列中並不包含排序依據的列,但也是行得通的
-- 按照州的名稱排序后選擇city的信息
select city
from customers
order by state

我們也可以根據新建的列進行排序
-- 根據新建的列排序,再根據first_name
select first_name, 10 as points
from customers
order by points, first_name
一種簡便的排序方式
select birth_date, first_name, last_name, 10 as points
from customers
order by 1, 2

該命令會根據所選的第一列和第二列依次進行排序,但這種排序的缺點是如果所選的列的先后順序改變,則排序規則也會改變
注:select *也可以使用這種簡便的方法噢。
4.5 根據運算結果排序
我們可以根據列表進行運算后的結果排序
對於order_items表格,如果我們需要對order_id為2的訂單根據總價格(列表中沒有)從低到高排序。

select *
from order_items
where order_id = 2
order by quantity * unit_price desc

4.6 小結

5. limit語句
之前我們學習的都是根據列的信息進行篩選,如果我們需要選擇特定行,例如我們選擇列表前三行的數據,可以執行這樣的命令:
select *
from customers
limit 3

如果我們需要第六行開始的三行數據,則
select *
from customers
limit 6, 3

學習了這些基本語法后,就是最基礎的sql入門啦~
語法結構必須按照以下順序:select, from, where, order by, limit
原文鏈接:https://blog.csdn.net/weixin_39537977/article/details/111625122
