??????🔥個人主頁:尋星探路
🎬作者簡介:Java研發方向學習者
📖個人專欄:《從青銅到王者,就差這講數據結構!!!》、?《JAVA(SE)----如此簡單!!!》、《數據庫那些事!!!》
??人生格言:沒有人生來就會編程,但我生來倔強!!!
目錄
一、Retrieve 檢索
1、where條件查詢
1.1語法
1.2比較運算符
1.3邏輯運算符
1.4示例
1.4.1基本查詢
1.4.2AND和OR
1.4.3范圍查詢
1.4.4模糊查詢
1.4.5NULL的查詢
2、Order by排序
2.1語法
2.2示例
續接上一話:
一、Retrieve 檢索
1、where條件查詢
????????查詢的時候,指定條件,符合條件的行被查詢出來,不符合條件的就跳過~~
1.1語法
SELECTselect_expr [, select_expr] ... [FROM table_references]WHERE where_condition
1.2比較運算符
#注:
(1)NULL可以參與運算,但是運算結果都是NULL
(2)(NULL==NULL=>NULL=>false)(NULL<=>NULL=>true)
(3)我們談到區間,大多數時候都是“前閉后開”,但是between and是“前閉后閉”!!!
1.3邏輯運算符
1.4示例
1.4.1基本查詢
????????查詢英語不及格的同學及英語成績(<60)
select name, english from exam where english < 60;
條件查詢執行過程:
????????1)遍歷這個表的每一行數據~~
????????2)把這一行數據, 代入到條件中
????????3)如果條件成立(true),此時把這個行加入到結果集合中,如果條件不成立(false),這一行直接跳過
????????4)當完成所有的遍歷過程之后,此時得到了結果集合,還需要根據 select 指定的列/表達式/別名/去重操作
????????5)再針對結果集合做進一步處理~~
????????查詢語文成績高于英語成績的同學
select name, chinese, english from exam where chinese > english;
????????總分在200分以下的同學
select name, chinese + math + english as 總分 from exam where chinese + math + english < 200;
1.4.2AND和OR
????????查詢語文成績大于80分且英語成績大于80分的同學
select * from exam where chinese > 80 and english > 80;
????????查詢語文成績大于80分或英語成績大于80分的同學
select * from exam where chinese > 80 OR english > 80;
????????觀察AND和OR的優先級
select * from exam where chinese > 80 or math > 70 and english > 70;
select * from exam where (chinese > 80 or math > 70) and english > 70;
? ? ? ? 由此可見,and優先級要更高一些,但是和前面一樣,盡量加括號,不要去記優先級
1.4.3范圍查詢
????????語文成績在[80,90]分的同學及語文成績
# 使?BETWEEN AND 實現
select name, chinese from exam where chinese between 80 and 90;
# 使? AND 實現
select name, chinese from exam where chinese >= 80 and chinese <= 90;
????????數學成績是78或者79或者98或者99分的同學及數學成績
# 使?IN實現
select name, math from exam where math in (78, 79, 98, 99);
# 使?OR實現
select name, math from exam where math = 78 or math = 79 or math = 98 or math = 99;
#注:
? ? ? ? between and 描述的是連續的區間~~
????????in 描述的是離散的集合~~
1.4.4模糊查詢
%:0個或者任意個任意字符
_:1 個任意字符
????????查詢所有姓孫的同學
select * from exam where name like '孫%';
????????查詢姓孫且姓名共有兩個字同學
select * from exam where name like '孫_';
#注:SQL 使用 like 進行模糊匹配, 通常是一個"低效操作"
????????SQL 的模糊匹配功能其實是非常弱的~~
????????編程圈子中,對于模糊匹配, 有一套成熟的解決方案,正則表達式~~
例:
1.4.5NULL的查詢
????????構造數據
# 寫??條數據,英語成績為NULLinsert into exam values (8, '張?', 27, 0, NULL);
????????查詢英語成績為NULL的記錄?????
????????查詢英語成績不為NULL的記錄
# 使?is not null
select * from exam where english is not null;
????????NULL與其他值進行運算結果為NULL
# 觀察結果中的總分
select name, chinese + math + english as 總分 from exam;
#注:
(1)WHERE條件中可以使用表達式,但不能使用別名
(2)AND的優先級高于OR,在同時使用時,建議使用小括號()包裹優先執行的部分
(3)過濾NULL時不要使用等于號(=)與不等于號(!=,<>)
(4)NULL與任何值運算結果都為NULL
2、Order by排序
????????sql 執行結果,得到的順序,mysql是不做任何承諾的,咱們在編程的時候,不能依賴返回結果的默認順序,后續一系列的增刪改查操作,就可能破壞默認的順序!!!
2.1語法
-- ASC 為升序(從?到?)
-- DESC 為降序(從?到?)
-- 默認為 ASC
SELECT ... FROM table_name [WHERE ...] ORDER BY {col_name | expr } [ASC | DESC], ... ;
2.2示例
????????按數學成績從低到高排序(升序)
select name, math from exam order by math asc;
????????按語?成績從高到低排序(降序)
select name, chinese from exam order by chinese desc;
????????按英語成績從高到低排序
select name, english from exam order by english desc;
????????查詢同學各門成績,依次按數學降序,英語升序,語?升序的方式顯示
select name, math, english, chinese from exam order by math desc, english asc, chinese asc;
#注:
????????查詢同學及總分,由高到低排序
select name, chinese + math + english from exam order by chinese + math + english desc;
????????可以使用列的別名進行排序
select name, chinese + math + english as 總分 from exam order by 總分 desc;
#注:sql 帶有 order by, order by 執行是在列的表達式求值之后的~~
(1)遍歷表,取出每一行~~
(2)把當前行代入到條件中,判定這一行是否要保留~~
(3)根據 select 的列名,把這里的列篩選出來/計算表達式的值/定義別名~~
(4)order by 排序~~
????????所有英語成績不為NULL的同學,按語文成績從高到低排序
select * from exam where english is not null order by chinese desc;
#注:
(1)查詢中沒有order by子句,返回的順序是未定義的,永遠不要依賴這個順序
(2)ORDERBY子句中可以使用列的別名進行排序
(3)NULL進行排序時,視為比任何值都小,升序出現在最上面,降序出現在最下面
(4)order by 的排序是針對臨時表來展開的,和數據庫服務器保存的原始數據,無關~~
????????由于內容較多,會分為多篇講解,預知后續內容,請看后續博客!!!