南昌有限公司 網站灰色詞排名代做
緒論?
每日激勵:挫折是會讓我們變得越來越強大的重點是我們敢于積極的面對它?!狫ack叔叔
緒論?:
本章是表操作的進階篇章(沒看過入門的這里是傳送門,本章將帶你進階的去學習表的插入insert和查找select,本質也就是學他們后面所帶的一些附加條件(具體請看目錄),通過這些條件去更好的插入和查找你所需要的數據。本章是上篇(全文8000字),下篇將寫道修改和刪除,將快速更新敬請期待。
————————
早關注不迷路,話不多說安全帶系好,發(fā)車啦(建議電腦觀看)。
表的增刪查改
CURD是一個數據庫技術中的縮寫詞,一般的項目開發(fā)的各種參數的基本功能都是CURD。作用是用于處理數據的基本原子操作。(源百度百科)
CURD:
- Create(創(chuàng)建)、
- Retrieve(讀取)、
- Update(更新)、
- Delete(刪除)
1. Create插入數據(Insert細節(jié)操作)
INSERT [INTO] table_name [(column [, column] ...)] VALUES (value_list) [, (value_list)] ...
直接通過實例來學習:
先創(chuàng)建一個學生表(后續(xù)在學生表上進行操作)
1.1 單行數據插入:
- 主要需要理解的結構:
(需要插入的屬性列) values(對應的值)
insert into students (插入中:into可省略,students就是要插入的表名) - 當values右邊列屬性不寫,就是一次性插入所有屬性(全列插入)
1.2 多行插入:
也很簡單直接在插入的數據 用逗號分隔 連續(xù)插入(具體如下圖)
同樣能指定列插入,這里就不過訴了。
1.3 沖突時同步更新:
當插入數據時可能會有主鍵、唯一鍵沖突…等情況,假如直接插入會直接報錯。
那么現在可以通過添加一些語法,讓當有沖突(即已存在該數據)時,對沖突進行處理,讓即使有問題也能插入,而不是直接報錯。
語法:
on duplicate key update
例如:
下述插入許攸的情況,若直接插入,因為主機沖突的情況無法直接插入新的值。
那么我們使用(原SQL)on duplicate key update (更新SQL)這樣就能插入,并且修改即使存在也會將他修改為新的
下面再看具體語法:
在插入語句后面添加:
INSERT ...... ON DUPLICATE KEY UPDATE
column = value [, column = value] ...-- 0 row affected: 表中有沖突數據,但沖突數據的值和 update 的值相等
-- 1 row affected: 表中沒有沖突數據,數據被插入
-- 2 row affected: 表中有沖突數據,并且數據已經被更新select ROW_COUNT()-- 獲取受影響函數
1.4 沖突時同步替換:
語法:
-- 主鍵 或者 唯一鍵 沒有沖突,則直接插入;
-- 主鍵 或者 唯一鍵 如果沖突,則刪除后再插入
replace into students (sn, name) VALUES (20001, '曹阿瞞');
Query OK, 2 rows affected (0.00 sec)-- 1 row affected: 表中沒有沖突數據,數據被插入
-- 2 row affected: 表中有沖突數據,刪除后重新插入
實例:
當插入沖突時,會直接進行替換(此時就會顯示2行影響行數),注意此處是刪除后再插入(id會改變)
具體如下圖:
2. Retireve讀取數據(Select細節(jié)操作)
語法:
SELECT
[DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...
同樣是用實例來學習:
創(chuàng)建表并插入數據:
2.1 全列查詢
通常情況下不建議使用 * 進行全列查詢
1. 查詢的列越多,意味著需要傳輸的數據量越大;
2. 可能會影響到索引的使用。(索引待后面課程講解)
語法:
SELECT * FROM exam_result;
之前講寫了就不過訴了!
2.2 指定列查詢
-- 指定列的順序不需要按定義表的順序來
和插入時類似在前面加上要查詢的列名稱,不同的是此時變成了FROM
SELECT id, name, english FROM exam_result;
2.3 查詢字段為表達式
在select 后可以添加表達式,將會在查詢結果中帶上表達式結果。
表達式不包含字段時:
SELECT id, name, 10 FROM exam_result;
發(fā)現將會直接打印10(其實代表的是該表達式的計算結果)
查詢有字段的表達式時:
并且還能通過as進行重命名:
如求一行中的成績總和
其中as可以省略:
2.4 結果去重 DISTINCT
SELECT DISTINCT math FROM exam_result
很簡單就是將查詢到的重復數據只見一行。
2.5 where條件
比較運算符:
運算符 | 說明 |
---|---|
> , >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,只能用于數值的比較,NULL 不安全(不能比較),例如 NULL = NULL 的結果是 NULL |
<=> | 等于,NULL 安全,例如 NULL <=> NULL 的結果是 TRUE(1) |
!=, <> | 不等于NULL 不安全 |
BETWEEN a0 AND a1 | 范圍匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1) |
IN (option, …) | 如果是 option 中的任意一個,返回 TRUE(1) |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE 模糊匹配 | % 表示任意多個(包括 0 個)任意字符;_ 表示任意一個字符 |
附:
=號,不能用于比較NULL值,比較NULL值需要使用<=>
具體如下:
當直接用 = 進行比較時比較后會為NULL、的使用<=>這樣就能正常比較
邏輯運算符:
運算符 | 說明 |
---|---|
AND | 多個條件必須都為 TRUE(1),結果才是 TRUE(1) |
OR | 任意一個條件為 TRUE(1), 結果為 TRUE(1) |
NOT | 條件為 TRUE(1),結果為 FALSE(0 |
實例:
比較運算符
- 找英語成績不合格的人:
between運算符的使用
- 語文成績在 80 ~ 90 分的同學和成績
上述和使用between a1 and a2 (a1 ~ a2)一樣,但between更方便。
in運算符的使用
in:如果是 option 中的任意一個,返回 TRUE(1)
- 取出數學成績 58 或 59 或 98或99 的同學和成績
可以直接使用 or
也可以使用 math in(58,59,…)
like模糊查詢
使用 like:
%
表示模糊查詢后面任意多個(包括 0 個)任意字符;_
表示模糊查詢后面任意一個字符
- 查詢孫某某(使用%,因為不確定其后面有幾個字)
若寫成_(就只能查孫某):
where后面能使用表達式(和字段)
- 語文好于英語成績
- 總分在200以下的同學
注意其中不能在where后面使用as重命名的變量,這是因為在select中是where是先執(zhí)行的,然后才到篩選列,所以也就是as還未定義,無法使用。
具體執(zhí)行順序:- from(先找表)
- where(篩選條件),
- select(查找的列屬性)
所以因為先where,才到列屬性,所以重命名是不能使用的(列屬性處還未被定義,就不能在where中使用了)
not運算符
-
尋找語文成績大于80且不姓孫
-
是孫某同學,否則要求總成績 > 200 并且 語文成績 < 數學成績 并且 英語成績 > 80
- 要么是孫某
- 否則:要求總成績 > 200 and 語文 < 數學 and 英語 > 80
- 可先把后面一長串的內容先寫 然后 再去加上前面的孫某
NULL的查詢
重新新建一個表test:
- 查詢NULL
- 查詢不為空
- NULL不參與比較運算,要比較只能使用<=> 、<>
2.6 order by語句(結果排序)
- ASC 為升序(Ascending)(從小到大)
- DESC 為降序(Descending)(從大到小)
- 默認為 ASC
- 沒有order by子句的查詢,返回的順序是未定義的,永遠不要依賴這個順序
語法:
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];
實操:
ASC升序:
- 按數學成績升序顯示
- 降序desc
NULL值在排序中,默認設置為比任何值都要小
多字段排序,排序優(yōu)先級隨書寫順序
具體理解如下:
查詢同學各門成績,依次按 數學降序,英語降序,語文升序的方式顯示
上圖中先按數學降序(數學寫在英語前面),當數學相等時才按英語降序,最后才考慮寫到最后的語文
建議就是向上圖一樣,將排序的 方式全部列全出來,不要去使用MySQL默認的情況(無法掌控)
order by默認升序
可以在order by 中使用前面的as別名
因為在order by中需要對數據進行排序,一定要先有適合的數據才排序(所以他是先執(zhí)行前面的列屬性篩選那么它就能排序)
2.7 limit的使用(篩選分頁結果)
- 直接在select后面加上limit表示需要的行數(從開始到第n行)
- 當limit 還能從 指定位置開始,讀取連續(xù)個數(pos,len)(并且注意:開始位置是從0開始的)
如下圖:從第一個開始讀,3個
- 在limit讀取行數的前提下,還能通過offset設置開始的行數(同樣是從0開始)
建議對未知表查詢時,對limit限制為1,防止數據過大
limit的作用,類似于網頁中常見的頁面的1、2、3、4 。。。分頁顯示數據。
如下圖:
limit的執(zhí)行階段會更加靠后,因為只有最后將所有數據都準備好了,才到最終的顯示,而limit的本質功能也就是顯示,所以將排到最后。
結合上面多個讀取數據的方法實例:
獲取班級第一(如下圖):
SELECT name, (english + math + chinese) AS total
FROM exam_result
WHERE english + math + chinese > 200
ORDER BY total DESC
LIMIT 1;
本章完。預知后事如何,暫聽下回分解。
如果有任何問題歡迎討論哈!
如果覺得這篇文章對你有所幫助的話點點贊吧!
持續(xù)更新大量MySQL細致內容,早關注不迷路。
?