學習MySQL:六:從表中檢索信息+修改指定的一條記錄的一個字段值+檢索特定行列數據+ 檢索每個唯一的+排序行

目錄

一:目的

1、想:從表中檢索信息

二、參考

1、MySQL 8 的學習——4從表中檢索信息

1、MySQL解決讀取TXT時候因爲空格等問題無法讀取的情況

三、操作

1、檢索所有數據+修改指定的一條記錄的一個字段值+查詢是否更改成功,可以看到,生日更改了

2、檢索特定行數據:

①檢索特定行數據:特定出生日期:

②檢索特定行數據:特定雌性狗:注意使用and 

①檢索特定行數據:where限制範圍,可以使用括號,前面的查詢使用 AND 邏輯運算符。還有一個 OR 運算符

3、檢索特定列數據

①檢索特定列數據:只查看 name, birth

②檢索特定列數據:要找出誰擁有寵物,請使用此查詢

③檢索特定列數據:要找出誰擁有寵物,上面的查詢有重複的記錄,要最小化輸出,可以通過添加關鍵字 DISTINCT 檢索每個唯一的輸出記錄

④檢索特定列數據:顯示列名字name、species、birth從pet數據庫,並且從種類中選擇dog、cat種類

4、排序行數據

①排序行數據:動物的生日,按日期排序,默認從小到大

②排序行數據:動物的生日,按日期排序,從大到小;默認排序順序爲升序,首先是最小值。要按反向(降序)順序排序,請將DESC關鍵字添加到要排序 的列的名稱

③排序行數據:您可以對多個列進行排序,並且可以按不同方向對不同列進行排序。例如,要按動物類型按升序排序,然後按動物類型中的出生日期按降序排序(最年輕的動物首先),請使用以下查詢:上面的 DESC 關鍵字僅適用於緊鄰其前面的列名(birth); 它不會影響species列排序順序。

5、日期計算

①通過名字、現在時間,計算出年齡

②按名稱對輸出進行排序:

③計算death和 birth值之間的差值:

④找到和現在月份一樣的名字、出生日期:

⑤計算以後幾個月和現在時間月份相同的人:

⑥日期取餘:找到1、2、3個月後同月份生日的人

6、使用NULL值

①概念: IS NULL和IS NOT NULL運算符

② =, <或 <>以測試NULL

③0或NULL 代表 false,除此之外的值代表 true。布爾運算的默認真值是1

7、模式匹配

① 要查找以字母 b 開頭的 name:'b%'

②要查找以字母fy結尾的name:'%fy'

③要查找包含w的name:

④要找到包含五個字符的name:'五個下劃線'

⑤模式匹配(使用擴展的正則表達式)

⑥因爲REGEXP_LIKE再程序裏面一直提示報錯,因爲直接跳過,爲了演示擴展正則表達式的工作原理,先前顯示  LIKE 的查詢將在此處重寫以供使用 REGEXP_LIKE()。

8、計數行

①COUNT(*)計算行數,因此計算動物的查詢如下所示;

②COUNT()如果你想了解每位業主擁有多少寵物,你可以使用:述查詢中使用GROUP BY 將每個記錄根據owner進行分組

③查詢每種動物的數量

④每性別的動物數量:

⑤每種物種和性別組合的動物數量:

⑥使用無需檢索每個表COUNT().例如,以前的查詢,只在狗和貓上執行時,如下所示:

⑦如果您想要每性別的動物數量只對已知性別的動物;

9、使用多個表

①CREATE TABLE EVENT:在pet數據庫中再創建表格事件

②導入數據:與pet表一樣,最簡單的方法是通過創建包含以下信息的製表符分隔文本文件來加載初始記錄。

③找到pet表和event表中正在litter事情的:暫時看不懂

④同種類動物配對:暫時看不懂

 



 

一:目的

1、想:從表中檢索信息

 

二、參考

1、MySQL 8 的學習——4從表中檢索信息

https://blog.csdn.net/zjy_android_blog/article/details/81609303

①總結:good:親測有效,我的實測就是按照這個博客進行操作的

a、SELECT 語句用於從表中提取信息。聲明的一般形式是:

SELECT what_to_select
FROM which_table
WHERE conditions_to_satisfy;
  1. what_to_select  表示想要看到的內容(可以是列名或者* ,* 代表所有列);
  2. which_table 表示要從哪一個表檢索數據;
  3. where條件是可選的。如果存在,則 conditions_to_satisfy 指定行必須滿足的一個或多個條件纔有資格進行檢索。

 

1、MySQL解決讀取TXT時候因爲空格等問題無法讀取的情況

https://blog.csdn.net/qq_40544338/article/details/106321250

①總結:good:解決了MySQL加載txt時候,加載位置不對的問題。

 

三、操作

1、檢索所有數據+修改指定的一條記錄的一個字段值+查詢是否更改成功,可以看到,生日更改了

①運行結果:

update pet set birth ='1911-12-12' where name='tom';
select *from pet where name='tom';

 

2、檢索特定行數據:

檢索特定行數據:特定出生日期:

a、你可以在任何列上指定條件,而不僅僅是 name。例如,如果您想知道1950-01-02年之後出生的動物:

select *from pet where  birth>='1950-01-02';

 

檢索特定行數據:特定雌性狗:注意使用and 

a、使用and

b、數據、關鍵字大小寫不重要

select *from pet where species='dog' and sex='f';

 

檢索特定行數據:where限制範圍,可以使用括號,前面的查詢使用 AND 邏輯運算符。還有一個 OR 運算符

 select *from pet where (species='cat' and sex='F') or (species='dog'and sex='f');

 

3、檢索特定列數據

檢索特定列數據:只查看 name, birth

SELECT name,birth FROM pet;

 

②檢索特定列數據:要找出誰擁有寵物,請使用此查詢

SELECT owner FROM pet;

 

③檢索特定列數據:要找出誰擁有寵物,上面的查詢有重複的記錄,要最小化輸出,可以通過添加關鍵字 DISTINCT 檢索每個唯一的輸出記錄

SELECT DISTINCT owner FROM pet;

a、因爲之前的數據庫內容太少了,我將內容增加了 

b、注意使用

  1.  fields terminated by '\t' :表示使用tab製表符作爲字段分隔符;
  2.  lines terminated by'\r\n'  :表示使用回車換行符作爲行分隔符
load data local infile "E:\\Test\\MySQLTest\\pet.txt"into table pet fields terminated by '\t'  lines terminated by '\r\n';

 

Fluffy	Harold	cat	f	1993-02-04	0000-00-00	
Claws	Gwen	cat	m	1994-03-17	0000-00-00	
Buffy	Harold	dog	f	1989-05-13	0000-00-00	
Fang	Benny	dog	m	1990-08-27	0000-00-00
Bowser	Diane	dog	m	1979-08-31	1995-07-29 
Chirpy	Gwen	bird	f	1998-09-11	0000-00-00 
Whistler	Gwen	bird	f	1997-12-09	0000-00-00 
Slim	Benny	snake	m	1996-04-29	0000-00-00 
Puffball	Diane	hamster	f	1999-03-30	NULL   

 

檢索特定列數據:顯示列名字name、species、birth從pet數據庫,並且從種類中選擇dog、cat種類

 SELECT name ,species,birth FROM pet WHERE species IN('dog','cat');

運行結果 

 

4、排序行數據

排序行數據:動物的生日,按日期排序,默認從小到大

SELECT name,birth FROM pet ORDER BY birth;

 

排序行數據:動物的生日,按日期排序,從大到小;默認排序順序爲升序,首先是最小值。要按反向(降序)順序排序,請將DESC關鍵字添加到要排序 的列的名稱

SELECT name,birth FROM pet ORDER BY birth DESC;

 

排序行數據:您可以對多個列進行排序,並且可以按不同方向對不同列進行排序。例如,要按動物類型按升序排序,然後按動物類型中的出生日期按降序排序(最年輕的動物首先),請使用以下查詢:上面的 DESC 關鍵字僅適用於緊鄰其前面的列名(birth); 它不會影響species列排序順序。

 SELECT name,species,birth FROM pet ORDER BY species,birth DESC;

 

5、日期計算

①通過名字、現在時間,計算出年齡

 SELECT name,birth,CURDATE(),TIMESTAMPDIFF(year,birth,CURDATE())AS age FROM pet;

 

②按名稱對輸出進行排序:

a、AS作爲別名

b、 ORDER BY NAME

SELECT name,birth,CURDATE(),TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age FROM pet ORDER BY NAME;

 

③計算death和 birth值之間的差值:

a、類似的查詢可用於確定死亡動物的死亡年齡。可以通過檢查death值 是否爲NULL。然後,對於那些具有非NULL值的人,計算death和 birth值之間的差值:

b、此處查詢使用death IS NOT NULL而不是death <> NULL因爲 NULL是一個特殊值,無法使用通常的比較運算符進行比較。

 <> 代表不等於 ,<=> 代表等於

SELECT name,birth,death,TIMESTAMPDIFF(YEAR,birth,death)AS age FROM pet WHERE death IS NOT NULL ORDER BY age;

 

④找到和現在月份一樣的名字、出生日期:

a、如果你想知道哪些動物下個月有生日怎麼辦?對於這種類型的計算,年和日是無關緊要的;您只想提取birth列的月份部分 。MySQL提供了用於提取日期的部分,如一些功能 YEAR(),MONTH()和 DAYOFMONTH()。 MONTH()可用於提取月份。

 SELECT name,birth,MONTH(birth) AS birthMOonth FROM pet WHERE MONTH(birth)<=>MONTH(CURDATE());

 

⑤計算以後幾個月和現在時間月份相同的人:

  • 如果當前月份是12月,則會出現一個小的複雜情況。你不能只在月份數字(12)中添加一個並查找月份出生的動物 13,因爲沒有這樣的月份。相反,你尋找1月(月1)出生
  • 您可以編寫查詢,以便無論當前月份是什麼,它都可以工作,因此您不必使用特定月份的數字。 DATE_ADD()使您可以將時間間隔添加到給定日期。如果您將值添加一個月CURDATE(),然後使用,則提取月份部分MONTH(),結果將生成查找生日的月份:

 SELECT name,birth FROM pet WHERE MONTH(birth)=MONTH(DATE_ADD(CURDATE(),INTERVAL 3 MONTH));

 

 

⑥日期取餘:找到1、2、3個月後同月份生日的人

a、MONTH()返回1和12之間的數字。並 MOD(something,12)在0和11之間返回一個數字。所以添加1,必須在MOD()之後

SELECT name,birth FROM pet WHERE MONTH(birth)=MOD(MONTH(CURDATE()),12)+3;

 

6、使用NULL值

①概念: IS NULLIS NOT NULL運算符

從概念上講,NULL意味着 “ 缺失的未知值 ”,並且與其他值的處理方式略有不同。
要測試NULL,請使用 IS NULLIS NOT NULL運算符,如下所示:

SELECT 1 IS NULL ,1 IS NOT NULL;

 

=, <或 <>以測試NULL

你使用算術比較操作符,如 =, <或 <>以測試NULL。要自己演示,請嘗試以下查詢:

SELECT 1=NULL,1<>NULL,1<NULL,1>NULL;

 

0或NULL 代表 false,除此之外的值代表 true。布爾運算的默認真值是1

  1. 任何有 NULL 參與的算術比較的結果也是 NULL,因此你無法從此類比較中獲得任何有意義的結果。 在MySQL中,0或NULL 代表 false,除此之外的值代表 true。布爾運算的默認真值是1。
  2. 上述結果顯示,完全可以將零或空字符串插入到NOT NULL列中,因爲這些實際上是 NOT NULL 的
 SELECT 0 IS NULL,0 IS NOT NULL,'' IS NULL,''IS NOT NULL;

 

7、模式匹配

SQL模式匹配使你可以使用 _ (下劃線)匹配任何單個字符,並且 % (百分號)匹配任意數量的字符(包括零個字符)。在MySQL中,SQL模式默認情況下不區分大小寫。這裏顯示了一些例子。使用SQL模式時不要使用 =<>,請改用LIKE或 NOT LIKE比較運算符。

① 要查找以字母 b 開頭的 name:'b%'

SELECT *FROM pet WHERE name LIKE 'b%';

 

 

②要查找以字母fy結尾的name:'%fy'

 SELECT *FROM pet WHERE name LIKE '%fy';

 

 

③要查找包含w的name:

SELECT *FROM pet WHERE name LIKE '%w%';

 

④要找到包含五個字符的name:'五個下劃線'

 SELECT *FROM pet WHERE name LIKE '_____';

 

⑤模式匹配(使用擴展的正則表達式)

MySQL提供的另一種模式匹配(使用擴展的正則表達式)。當你測試此類模式的匹配項時,請使用 REGEXP_LIKE()函數( REGEXP或 RLIKE 運算符,它們是REGEXP_LIKE()的同義詞 )。

以下列表描述了擴展正則表達式的一些特徵:

  • . 匹配任何單個字符。
  • 字符類[...]匹配括號內的任何單個字符。例如, [abc]匹配a, b或c。要代表一系列字符,請使用短劃線。[a-z] 匹配任何字母(擴展正則查詢不區分大小寫),而[0-9] 匹配任何數字。
  • *匹配前面的事物的零個或多個實例。例如,x* 匹配任意數量的x字符, [0-9]*匹配任意數量的數字,並.*匹配任意數量的任何數字。
  • 如果正在測試的值有任何位置匹配正則中規則,則正則表達式模式匹配成功。(這與LIKE模式匹配不同,模式匹配僅在模式匹配整個值時纔會成功。)
  • 使用^在pattern的開頭或$在 pattern 的結尾,使得測試的值必須在開頭或結尾匹配 pattern。
     

⑥因爲REGEXP_LIKE再程序裏面一直提示報錯,因爲直接跳過,爲了演示擴展正則表達式的工作原理,先前顯示  LIKE 的查詢將在此處重寫以供使用 REGEXP_LIKE()

 

8、計數行

①COUNT(*)計算行數,因此計算動物的查詢如下所示;

 SELECT COUNT(*) FROM pet;

 

②COUNT()如果你想了解每位業主擁有多少寵物,你可以使用:述查詢中使用GROUP BY 將每個記錄根據owner進行分組

 SELECT owner,COUNT(*)FROM pet GROUP BY owner;

 

③查詢每種動物的數量

SELECT species,COUNT(*) FROM pet GROUP BY species;

 

 

④每性別的動物數量:

 SELECT sex,COUNT(*) FROM pet GROUP BY sex;

 

⑤每種物種和性別組合的動物數量:

 

SELECT species ,sex,COUNT(*) FROM pet GROUP BY species,sex;

 

⑥使用無需檢索每個表COUNT().例如,以前的查詢,只在狗和貓上執行時,如下所示:

 SELECT species,sex,COUNT(*) FROM pet WHERE species IN ('cat','dog')GROUP BY species,sex;

 

⑦如果您想要每性別的動物數量只對已知性別的動物;

SELECT species,sex,COUNT(*)FROM pet WHERE sex IS NOT NULL GROUP BY species,sex;

 

9、使用多個表

 

該pet表記錄了你擁有的寵物。如果你想記錄有關它們的其他信息,例如生活中的事件,例如獸醫的訪問或者出生時,您需要另一個 表。這個表應該是什麼樣的?它需要包含以下信息:

寵物名稱,以便您瞭解每個事件所屬的動物。

日期,以便您知道事件發生的時間。

描述事件的字段。

如果您希望能夠對事件進行分類,則爲事件類型字段。

鑑於這些注意事項,event 表的CREATE TABLE語句可能如下所示:

①CREATE TABLE EVENT:在pet數據庫中再創建表格事件

CREATE TABLE EVENT(name varchar(20),date date,type varchar(20),remark varchar(255));

 

 DESCRIBE EVENT;

 

②導入數據:與pet表一樣,最簡單的方法是通過創建包含以下信息的製表符分隔文本文件來加載初始記錄。

 LOAD DATA LOCAL INFILE 'E:\\Test\\MySQLTest\\event.txt'INTO TABLE EVENT FIELDS TERMINATED BY '\t'  LINES TERMINATED BY '\r\n';


 

Fluffy	1995-05-15	litter	4 kittens, 3 female, 1 male
Buffy	1993-06-23	litter	5 puppies, 2 female, 3 male
Buffy	1994-06-19	litter	3 puppies, 3 female
Chirpy	1999-03-21	vet	needed beak straightened
Slim	1997-08-03	vet	broken rib
Bowser	1991-10-12	kennel
Fang	1991-10-12	kennel
Fang	1998-08-28	birthday	Gave him a new chew toy
Claws	1998-03-17	birthday	Gave him a new flea collar
Whistler	1998-12-09	birthday	First birthday

 

③找到pet表和event表中正在litter事情的:暫時看不懂

假設你想要找出每隻寵物的窩的年齡。我們之前看到過如何計算兩個日期的年齡。收養的 litter的日期在event 表中,但要計算她在該日期的年齡,您需要她的出生日期,該日期存儲在 pet 表中。這意味着查詢需要兩個表:

 SELECT pet.name,TIMESTAMPDIFF(year,birth,date)AS age,remark FROM pet INNER JOIN EVENT ON pet.name=event.name WHERE event.type='litter';

有關此查詢的注意事項有以下幾點:

  • 該FROM子句連接兩個表,因爲查詢需要從兩個表中提取信息。
  • 組合(連接)來自多個表的信息時,需要指定一個表中的記錄如何與另一個表中的記錄匹配。這很容易,因爲它們都有一個name列。該查詢使用ON子句根據值匹配兩個表中的記錄name。
  • 該查詢使用 INNER JOIN來組合表。當且僅當兩個表都滿足ON子句中指定的條件時,INNER JOIN允許來自任一表的行出現在結果中。在此示例中,ON子句指定pet表中的name列必須與event表中的name列匹配。如果name出現在一個表中但不出現在另一個表中,則該行不會出現在結果中,因爲ON子句中的條件失敗。
  • 由於name列出現在兩個表中,因此你必須具體說明引用該name列時的表。這是通過將表名添加到列名稱來完成的。

 

④同種類動物配對:暫時看不懂

  • 如果要將表中的記錄與同一表中的其他記錄進行比較,有時將表連接到自身會很有用。例如,要在您的寵物中找到繁殖對,您可以pet自己加入表格,以生成類似物種的男性和女性候選對:
  • 在此查詢中,我們爲表名指定別名以引用列,並保持每個列引用與表關聯的表的實例。
 SELECT p1.name,p1.sex,p2.name,p2.sex,p1.species FROM pet AS p1 INNER JOIN pet AS p2 ON p1.species=p2.species AND p1.sex ='f' AND p2.sex='m';

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章