1. 程式人生 > 其它 >學習筆記 2021.12.8

學習筆記 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階段將表取別名後再在其他的地方進行使用。

各種連線相關

等值連線和非等值連線

即連線條件時看是不是等號,前面的情況都是等值連線的例子。

非等值連線的例子:

即寫連線條件的時候做好對應就好了。

自連線與非自連線

自連線即自己表連線自己的情況,之前的情況都屬於非自連線。

自連線的情況:

此時就要注意必須標明具體的表。

內連線和外連線