學習筆記 2021.12.8
2021.12.8
運算子
整章都是一個對應的問題,也沒有啥思考的地方,都是記憶一下即可。儘快過了。
算數運算子
下面是一些使用的小例子,也沒啥演示的必要了:
-
一個整數型別的值對整數進行加法和減法操作,結果還是一個整數;
-
一個整數型別的值對浮點數進行加法和減法操作,結果是一個浮點數;
-
加法和減法的優先順序相同,進行先加後減操作與進行先減後加操作的結果是一樣的;
-
在Java中,+的左右兩邊如果有字串,那麼表示字串的拼接。但是在MySQL中+只表示數值相加。如果遇到非數值型別,先嚐試轉成數值,如果轉失敗,就按0計算。(補充:MySQL中字串拼接要使用字串函式CONCAT()實現)
-
一個數乘以整數1和除以整數1後仍得原數;
-
一個數乘以浮點數1和除以浮點數1後變成浮點數,數值與原數相等;
-
一個數除以整數後,不管是否能除盡,結果都為一個浮點數;
-
一個數除以另一個數,除不盡時,結果為一個浮點數,並保留到小數點後4位;
-
乘法和除法的優先順序相同,進行先乘後除操作與先除後乘操作,得出的結果相同。
-
在數學運算中,0不能用作除數,在MySQL中,一個數除以0為NULL。
比較運算子
通過比較後的值1和0來標識結果的真假。其他的情況則為NULL。
前面where篩選的就是結果為1的情況。
符號型別的比較:
-
等號運算子(=)判斷等號兩邊的值、字串或表示式是否相等,如果相等則返回1,不相等則返回0。
-
在使用等號運算子時,遵循如下規則:
- 如果等號兩邊的值、字串或表示式都為字串,則MySQL會按照字串進行比較,其比較的是每個字串中字元的ANSI編碼是否相等。
- 如果等號兩邊的值都是整數,則MySQL會按照整數來比較兩個值的大小。
- 如果等號兩邊的值一個是整數,另一個是字串,則MySQL會將字串轉化為數字進行比較。
- 如果等號兩邊的值、字串或表示式中有一個為NULL,則比較結果為NULL。
安全等於運算子(<=>)與等於運算子(=)的作用是相似的,唯一的區別
是‘<=>’可以用來對NULL進行判斷。在兩個運算元均為NULL時,其返回值為1,而不為NULL;當一個運算元為NULL時,其返回值為0,而不為NULL。
即實現將NULL也看作一個數來比較,為NULL而生。
其他的就略了。
通過欄位比較
IS NULL和IS NOT NULL這種就是一眼懂了,沒必要更多的演示了。
最小值運算子
語法格式為:LEAST(值1,值2,...,值n)。其中,“值n”表示引數列表中有n個值。在有兩個或多個引數的情況下,返回最小值。
mysql> SELECT LEAST (1,0,2), LEAST('b','a','c'), LEAST(1,NULL,2);
+---------------+--------------------+-----------------+
| LEAST (1,0,2) | LEAST('b','a','c') | LEAST(1,NULL,2) |
+---------------+--------------------+-----------------+
| 0 | a | NULL |
+---------------+--------------------+-----------------+
1 row in set (0.00 sec)
由結果可以看到,當引數是整數或者浮點數時,LEAST將返回其中最小的值;當引數為字串時,返回字母表中順序最靠前的字元;當比較值列表中有NULL時,不能判斷大小,返回值為NULL。
最大值運算子
語法格式為:GREATEST(值1,值2,...,值n)。其中,n表示引數列表中有n個值。當有兩個或多個引數時,返回值為最大值。假如任意一個自變數為NULL,則GREATEST()的返回值為NULL。
mysql> SELECT GREATEST(1,0,2), GREATEST('b','a','c'), GREATEST(1,NULL,2);
+-----------------+-----------------------+--------------------+
| GREATEST(1,0,2) | GREATEST('b','a','c') | GREATEST(1,NULL,2) |
+-----------------+-----------------------+--------------------+
| 2 | c | NULL |
+-----------------+-----------------------+--------------------+
1 row in set (0.00 sec)
由結果可以看到,當引數中是整數或者浮點數時,GREATEST將返回其中最大的值;當引數為字串時,返回字母表中順序最靠後的字元;當比較值列表中有NULL時,不能判斷大小,返回值為NULL。
BETWEEN運算子使用的格式通常為SELECT D FROM TABLE WHERE C BETWEEN A AND B,此時,當C大於或等於A,並且C小於或等於B時,結果為1,否則結果為0。
IN運算子
IN運算子用於判斷給定的值是否是IN列表中的一個值,如果是則返回1,否則返回0。如果給定的值為NULL,或者IN列表中存在NULL,則結果為NULL。
LIKE運算子
LIKE運算子主要用來匹配字串,通常用於模糊匹配,如果滿足條件則返回1,否則返回0。如果給定的值或者匹配條件為NULL,則返回結果為NULL。
LIKE運算子通常使用如下萬用字元:
“%”:匹配0個或多個字元。
“_”:只能匹配一個字元。
SQL語句示例如下:
mysql> SELECT NULL LIKE 'abc', 'abc' LIKE NULL;
+-----------------+-----------------+
| NULL LIKE 'abc' | 'abc' LIKE NULL |
+-----------------+-----------------+
| NULL | NULL |
+-----------------+-----------------+
1 row in set (0.00 sec)
SELECT first_name
FROM employees
WHERE first_name LIKE 'S%';
SELECT last_name
FROM employees
WHERE last_name LIKE '_o%';
%的具體用法就是可以省略指代的意思
比如像上面這麼寫就是指後面可以隨意多少個。
其餘的都用到再看吧,太沒意義了。
邏輯運算子
注意:
OR可以和AND一起使用,但是在使用時要注意兩者的優先順序,由於AND的優先順序高於OR,因此先對AND兩邊的運算元進行操作,再與OR中的運算元結合。
位運算子
運算子的優先順序
排序與分頁
排序:
首先要知道沒有按照排序操作話,預設情況下查詢返回的資料是按照新增資料的順序排序的。
因此sql中具體的排序實現:
- 使用 ORDER BY 子句排序
- ASC(ascend): 升序(預設情況)
- DESC(descend):降序
- ORDER BY 子句在SELECT語句的結尾。
單列排序
注意此時對於列的重名只有在order by中才能使用,在where中是沒法使用別名的。 也是函式的返回值能在order關鍵字後進行使用。
格式的強調:where需要宣告在from後面,order by前面。
多列排列
就是在order行中多加個物件即可。
- 可以使用不在SELECT列表中的列排序。
- 在對多列進行排序的時候,首先排序的第一列必須有相同的列值,才會對第二列進行排序。如果第一列資料中所有值都是唯一的,將不再對第二列進行排序。
分頁
-
分頁原理
所謂分頁顯示,就是將資料庫中的結果集,一段一段顯示出來需要的條件。
-
MySQL中使用 LIMIT 實現分頁
-
格式:
LIMIT [位置偏移量,] 行數
第一個“位置偏移量”引數指示MySQL從哪一行開始顯示,是一個可選引數,如果不指定“位置偏移量”,將會從表中的第一條記錄開始(第一條記錄的位置偏移量是0,第二條記錄的位置偏移量是1,以此類推);第二個引數“行數”指示返回的記錄條數。
下面例子即是顯示了第二頁的資料
公式如下:
- 注意:LIMIT 子句必須放在整個SELECT語句的最後!
- limit 0,條目數=limit 條目數
- 使用 LIMIT 的好處
約束返回結果的數量可以減少資料表的網路傳輸量
,也可以提升查詢效率
。如果我們知道返回結果只有 1 條,就可以使用LIMIT 1
,告訴 SELECT 語句只需要返回一條記錄即可。這樣的好處就是 SELECT 不需要掃描完整的表,只需要檢索到一條符合條件的記錄即可返回。
多表查詢
多表查詢,也稱為關聯查詢,指兩個或更多個表一起完成查詢操作。
前提條件:這些一起查詢的表之間是有關係的(一對一、一對多),它們之間一定是有關聯欄位,這個關聯欄位可能建立了外來鍵,也可能沒有建立外來鍵。比如:員工表和部門表,這兩個表依靠“部門編號”進行關聯。
需求所在:當需要通過多個表之間相關聯的資料進行查詢的話,如果只使用單表查詢,就會導致請求的次數增多,此時使用多表查詢可以明顯的降低查詢次數。
笛卡兒積錯誤
笛卡爾乘積是一個數學運算。假設我有兩個集合 X 和 Y,那麼 X 和 Y 的笛卡爾積就是 X 和 Y 的所有可能組合,也就是第一個物件來自於 X,第二個物件來自於 Y 的所有可能。組合的個數即為兩個集合中元素個數的乘積數。
錯誤的原因即是缺少了多表的連線條件。會導致每個都交叉連線了。
笛卡爾積的錯誤會在下面條件下產生:
- 省略多個表的連線條件(或關聯條件)
- 連線條件(或關聯條件)無效,要保證存在著相同的欄位。
- 所有表中的所有行互相連線
- 在表中有相同列時,在列名之前加上表名字首。
正確的處理方式:
此時會發現依然無法處理NULL值對應的情況。
其他的一些注意的:
且起了別名,就必須用,即原來的名字直接無效了。
此時注意一個小的編寫細節就是可以現在from階段將表取別名後再在其他的地方進行使用。
各種連線相關
等值連線和非等值連線
即連線條件時看是不是等號,前面的情況都是等值連線的例子。
非等值連線的例子:
即寫連線條件的時候做好對應就好了。
自連線與非自連線
自連線即自己表連線自己的情況,之前的情況都屬於非自連線。
自連線的情況:
此時就要注意必須標明具體的表。
內連線和外連線