mysql 第2次課程筆記
一、MySQL條件查詢
1.查詢結果過濾
資料庫表中一般包含大量的資料,很少需要查詢表中所有行,通常只會根據特定的需要提取表中的一部分資料。這個時候需要指定查詢條件,即過濾條件。
在SELECT語句中,資料根據WHERE子句中指定的搜尋條件進行過濾。
格式:
select 列名 from 表名 where 列滿足的條件;
select 列名1,列名2,列名3,…,列名n from 表名 where 列滿足的條件;
select prod_name,prod_price from products where prod_price=2.5;
【注意】WHERE子句的位置 在同時使用ORDER BY和WHERE子句時,應該讓ORDER BY位於WHERE之後,否則將會產生錯誤。
WHERE語句支援的操作符例項:
(1)檢查單個值
select prod_name,prod_price from products where prod_name = 'fuses';
select prod_name,prod_price from products where prod_price >10;
select * from products where prod_price<10;
select * from products where prod_price<=10;
【注意】單引號用來限定字串。如果將值與串型別的列進行比較,則需要限定引號。用來與數值列進行比較的值不用引號。
(2)不匹配檢查
select * from products where prod_price<>2.5;
select * from products where prod_price!=2.5;
(3)範圍值檢查
select * from products where prod_price between 2.5 and 10;
select * from products where prod_price not between 2.5 and 10;
(4)空值檢查:在一個列不包含值時,稱其為包含空值NULL。
select prod_name,prod_price from products where prod_price is null;
【注意】NULL值實質的意義是代表未知值,它與欄位包含0、空字串或僅僅包含空格不同。因為未知具有特殊的含義,資料庫不知道它們是否匹配,所以對於NULL只能用 IS或者IS NOT進行判斷。
2.WHERE子句中AND/OR操作符
為了進行更強的過濾控制,MySQL允許給出多個WHERE子句。這些子句可以兩種方式使用:以AND子句的方式或OR子句的方式使用。
2.1 AND操作符
MySQL支援在where子句中給出多個條件,這些條件可以使用AND子句表示條件都滿足時返回指定的行。
格式:
select 列名 from 表 where '列1滿足條件1 ' AND ’列2滿足的條件2';
select vend_id, prod_name,prod_price from products where prod_price<10 and vend_id=1003;
select vend_id, prod_name,prod_price from products where vend_id=1003 and prod_price<10;
2.2 OR操作符
MySQL支援在where子句中給出多個條件,這些條件可以使用OR子句表示條件中只需要有一個滿足時返回指定的行。
格式:
select 列名 from 表 where '列1滿足條件1' OR '列2滿足的條件2';
select vend_id, prod_name,prod_price from products where vend_id=1003 or vend_id=1005;
2.3 AND與OR條件組合中的順序
WHERE可包含任意數目的AND和OR操作符。AND的優先順序高於OR,當AND/OR中有多個條件的時候,需要使用()把各個條件明確的分組,防止條件的錯誤組合導致返回的結果不正確。
select vend_id, prod_name,prod_price from products where prod_price<10 and vend_id=1003 or vend_id=1005;
select vend_id, prod_name,prod_price from products where vend_id=1003 or vend_id=1005 and prod_price<10;
select vend_id, prod_name,prod_price from products where (vend_id=1003 or vend_id=1005) and prod_price<10;
3.IN操作符
IN操作符用來指定條件範圍,範圍中的每個條件都可以進行匹配。IN取合法值的由逗號分隔的清單,全都括在圓括號中。
select * from products where vend_id in (1003, 1005);
select * from products where prod_name in ('JetPack 1000', 'Safe');
【注意】IN操作符用來指定條件範圍,範圍中的每個條件都可以進行匹配。上述例子中vend_id in(1003,1005)代表的是vend_id要麼是1003,要麼是1005,只有括號內條件才可以匹配,並不代表值的範圍,不能認為是vend_id在1003與1005值的範圍內進行匹配,不是between and的操作符,注意區分。另外,IN可以多個值進行匹配,如vend_id in(1002,1003,1004,1005),只要把條件放在括號內即可。
IN操作符完成與OR相同的功能。vend_id in(1003,1005)等同於vend_id = 1003 or vend_id = 1005,但是IN操作符一般比OR操作符清單執行更快;IN操作符的語法更清楚且更直觀;IN的最大優點是可以包含其他SELECT語句,使得能夠更動態地建立WHERE子句。
4.NOT操作符
WHERE子句中的NOT操作符有且只有一個功能,那就是否定它之後所跟的任何條件。使用NOT很容易找出與條件列表不匹配的行。
select * from products where vend_id not in (1003, 1005);
select * from products where prod_price not between 2.5 and 10;
【注意】MySQL中的NOT MySQL支援使用NOT對IN、BETWEEN和 EXISTS子句取反,這與多數其他DBMS允許使用NOT對各種條件取反有很大的差別。
5.LIKE操作符
萬用字元(wildcard)用來匹配值的一部分的特殊字元。為在搜尋子句中使用萬用字元,必須使用LIKE操作符。LIKE指示MySQL,後跟的搜尋模式利用萬用字元匹配而不是直接相等匹配進行比較。
5.1百分號 % 萬用字元
在搜尋串中,%表示任何字元出現任意次數。% 代表搜尋模式中給定位置的0個、1個或多個字元。
select * from products where prod_name like 'Jet%' ;
select * from products where prod_name like '%Jet%' ;
【注意】尾空格可能會干擾萬用字元匹配。解決這個問題的一個簡單的辦法是在搜尋模式最後附加一個%。另外,雖然似乎%萬用字元可以匹配任何東西,但有一個例外,即NULL。萬用字元是模糊匹配,是在已知值裡面進行模糊查詢,而NULL代表是的未知值,所以不能用萬用字元進行匹配。
5.2 下劃線 _ 萬用字元
下劃線的用途與%一樣,但下劃線只匹配單個字元,與%能匹配0個字元不一樣,_總是匹配一個字元,不能多也不能少。
select * from products where prod_name like '__ton_anvil' ;
【注意】萬用字元搜尋的處理一般要比前面討論的其他搜尋所花時間更長。
使用萬用字元要記住的技巧:
(1) 不要過度使用萬用字元。如果其他操作符能達到相同的目的,應該使用其他操作符。
(2) 在確實需要使用萬用字元時,除非絕對有必要,否則不要把它們用在搜尋模式的開始處。把萬用字元置於搜尋模式的開始處,搜尋起來是最慢的。
(3) 仔細注意萬用字元的位置。如果放錯地方,可能不會返回想要的資料。
二、MySQL查詢結果處理與函式
1.列的別名
表列名比較繁瑣,為了簡化和方便使用,給列取別名;有些應用中,儲存在表中的資料不是應用所需要的,需要建立新的欄位來表示資料庫中的資料進行通過計算或函式運算轉換後的資料。
AS用法:重新命名列名或者表名
select CONCAT(vend_name,'(',vend_country,')') from vendors;
select CONCAT(vend_name,'(',vend_country,')') as vend_title from vendors;
select CONCAT(vend_name,'(',vend_country,')') vend_title from vendors;
【注意】CONCAT()拼接函式將值聯結到一起構成單個值。另外,雖然AS可以省略,但是為了可讀性,需加上。
2.MySQL支援算術運算子
有的時候儲存在表中的資料都不是應用程式所需要的,所以需要直接從資料庫中檢索出轉換、計算或格式化過的資料;而不是檢索出資料,然後再在客戶機應用程式或報告程式中重新格式化。這就是計算欄位發揮作用的所在了。
select prod_id,quantity,item_price,quantity*item_price as total_price from orderitems where order_num = 20005;
3.常用的文字處理函式
文字處理函式:
(1) Upper()函式/Lower()函式
select prod_name from products where vend_id=1003 or vend_id=1005;
select upper(prod_name) from products where vend_id=1003 or vend_id=1005;
select lower(prod_name) from products where vend_id=1003 or vend_id=1005;
(2) Length()函式
select vend_name,length(vend_name) as vend_name_length from vendors;
(3) SubString()函式
select cust_name,SUBSTRING(cust_name,4) from customers;
【注意】SubString()函式所用是從指定字串中的指定位置提取指定長度的子字串。以“MYSQL SUBSTRING”為例:
函式SUBSTRING(string,position,length)可以指定三個引數,最後一個length如果省略的話,則表示從指定位置到最後的子字串。
要從“MySQL SUBSTRING”字串中獲取子字串:“SUBSTRING”,則子串的位置必須從7開始,語句為select SUBSTRING('MYSQL SUBSTRING', 7);
如果position引數為零,則SUBSTRING函式返回一個空字串,語句為select SUBSTRING('MYSQL SUBSTRING', 0);
要從"MySQL SUBSTRING"獲取"MySQL",語句為select SUBSTRING('MYSQL SUBSTRING', 1,5);
4.常用的日期/時間處理函式
日期和時間採用相應的資料型別和特殊的格式儲存,以便能快速和有效地排序或過濾,並且節省物理儲存空間,但一般情況下應用程式不使用MySQL使用的儲存日期和時間的格式,因此日期和時間函式總是被用來讀取、統計和處理這些值,所以日期和時間函式在MySQL語言中具有重要的作用。
select curdate();
select current_time();
select now();
select date(now());
select year(now());
select month(now());
select day(now());
【注意】Date()函式預設為YYYY-MM-DD的格式,即四位年份的格式,兩位月份的格式,兩位日期的格式,如2021年7月9日,則顯示為2021-07-09,月份和日期不足兩位會補0,但是使用month()函式和day()函式則不會補0至兩位。如month(‘2021-07-09’)則為7,而不是07,同理day(‘2021-07-09’)則為9而不是09。但作為過濾條件可以匹配兩位字串值,如month(order_date)='07'
select cust_id,order_num,order_date,adddate(order_date,30) from orders;
select cust_id,order_num,order_date,datediff(now(),order_date) from orders;
select * from orders where year(order_date)= 2005 and month(order_date)= 9;
select * from orders where year(order_date)='2005'and month(order_date)='09';
select * from orders where date_format(order_date,'%Y-%m')='2005-09';
【注意】
DATE_FORMAT(date,format)函式格式:
%Y 年,4 位
%y 年,2 位
%m 月,數值(00-12)
%d 月的天,數值(00-31)
%H 小時 (00-23)
%i 分鐘,數值(00-59)
%S 秒(00-59)
5.常用的彙總資料處理函式
需要彙總資料而不是實際檢索出來,為此MySQL提供了專門的函式。為方便這種型別的檢索,MySQL給出了5個聚集函式。
AVG()函式 AVG()通過對錶中行數計數並計算特定列值之和,求得該列的平均 值。AVG()可用來返回所有列的平均值,也可以用來返回特定列或行的平均值
select avg(prod_price) as avg_price from products;
COUNT()函式進行計數。可利用COUNT()確定表中行的數目或符合特定條件的行的數目。
COUNT()函式有兩種使用方式。 ‰
(1) 使用COUNT(*)對錶中行的數目進行計數,不管表列中包含的是空值(NULL)還是非空值。 ‰
(2) 使用COUNT(column)對特定列中具有值的行進行計數,忽略 NULL值。
select count(*) from customers;
MAX()返回指定列中的最大值,MAX()要求指定列名。
MIN()返回指定列中的最小值,MIN()要求指定列名。
SUM()用於返回指定列值的總和。
select max(prod_price) from products;
select min(prod_price) from products;
select order_num,sum(quantity) as item_ordered from orderitems where order_num = 20005;
Select語句中可根據需要使用多個函式。
select count(*) as prod_quantity, min(prod_price) as min_price ,max(prod_price) as max_price,avg(prod_price) as avg_price from products;