如何使用DQL查詢數據

本篇文章給大家介紹一下使用dql查詢數據的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。

如何使用DQL查詢數據

使用DQL查詢數據

DQL語言

DQL( Data Query Language 數據查詢語言 )

  • 查詢數據庫數據 , 如select語句

  • 簡單的單表查詢或多表的復雜查詢和嵌套查詢

  • 是數據庫語言中最核心,最重要的語句

  • 使用頻率最高的語句

SELECT語法

SELECT?[ALL?|?DISTINCT] {*?|?table.*?|?[table.field1[as?alias1][,table.field2[as?alias2]][,...]]} FROM?table_name?[as?table_alias] ????[left?|?right?|?inner?join?table_name2]??--?聯合查詢 ????[WHERE?...]??--?指定結果需滿足的條件 ????[GROUP?BY?...]??--?指定結果按照哪幾個字段來分組 ????[HAVING]??--?過濾分組的記錄必須滿足的次要條件 ????[ORDER?BY?...]??--?指定查詢記錄按一個或多個條件排序 ????[LIMIT?{[offset,]row_count?|?row_countOFFSET?offset}]; ????--??指定查詢的記錄從哪條至哪條

注意 : [ ] 括號代表可選的 , { }括號代表必選得

指定查詢字段

--?查詢表中所有的數據列結果?,?采用?**"?*?"**?符號;?但是效率低,不推薦?.  --?查詢所有學生信息 SELECT?*?FROM?student;  --?查詢指定列(學號?,?姓名) SELECT?studentno,studentname?FROM?student;

AS 子句作為別名

作用:

  • 可給數據列取一個新別名

  • 可給表取一個新別名

  • 可把經計算或總結的結果用另一個新名稱來代替

--?這里是為列取別名(當然as關鍵詞可以省略) SELECT?studentno?AS?學號,studentname?AS?姓名?FROM?student;  --?使用as也可以為表取別名 SELECT?studentno?AS?學號,studentname?AS?姓名?FROM?student?AS?s;  --?使用as,為查詢結果取一個新名字 --?CONCAT()函數拼接字符串 SELECT?CONCAT('姓名:',studentname)?AS?新姓名?FROM?student;

DISTINCT關鍵字的使用

作用 : 去掉SELECT查詢返回的記錄結果中重復的記錄 ( 返回所有列的值都相同 ) , 只返回一條

--?#?查看哪些同學參加了考試(學號)??去除重復項 SELECT?*?FROM?result;?--?查看考試成績 SELECT?studentno?FROM?result;?--??查看哪些同學參加了考試 SELECT?DISTINCT?studentno?FROM?result;?--?了解:DISTINCT?去除重復項?,?(默認是ALL)

使用表達式的列

數據庫中的表達式 : 一般由文本值 , 列值 , NULL , 函數和操作符等組成

應用場景 :

  • SELECT語句返回結果列中使用

  • SELECT語句中的ORDER BY , HAVING等子句中使用

  • DML語句中的 where 條件語句中使用表達式

--?selcet查詢中可以使用表達式 SELECT?@@auto_increment_increment;?--?查詢自增步長 SELECT?VERSION();?--?查詢版本號 SELECT?100*3-1?AS?計算結果;?--?表達式  --?學員考試成績集體提分一分查看 SELECT?studentno,StudentResult+1?AS?'提分后'?FROM?result;
  • 避免sql返回結果中包含 ‘ . ‘ , ‘ * ‘ 和括號等干擾開發語言程序.

where條件語句

作用:用于檢索數據表中 符合條件 的記錄

搜索條件可由一個或多個邏輯表達式組成 , 結果一般為真或假.

邏輯操作符

如何使用DQL查詢數據

測試

--?滿足條件的查詢(where) SELECT?Studentno,StudentResult?FROM?result;  --?查詢考試成績在95-100之間的 SELECT?Studentno,StudentResult FROM?result WHERE?StudentResult&gt;=95?AND?StudentResult=95?&amp;&amp;?StudentResult<p>模糊查詢 :比較操作符</p><p style="text-align:center;"><img alt="" src="https://img.php.cn/upload/article/000/000/062/61fffc298fb0e88bfc93c6735c95941d-3.png"></p><p>注意:</p>
  • 數值數據類型的記錄之間才能進行算術運算 ;

  • 相同數據類型的數據之間才能進行比較 ;

測試:

--?模糊查詢?between?and??like??in??null  --?============================================= --?LIKE --?============================================= --?查詢姓劉的同學的學號及姓名 --?like結合使用的通配符?:?%?(代表0到任意個字符)??_?(一個字符) SELECT?studentno,studentname?FROM?student WHERE?studentname?LIKE?'劉%';  --?查詢姓劉的同學,后面只有一個字的 SELECT?studentno,studentname?FROM?student WHERE?studentname?LIKE?'劉_';  --?查詢姓劉的同學,后面只有兩個字的 SELECT?studentno,studentname?FROM?student WHERE?studentname?LIKE?'劉__';  --?查詢姓名中含有?嘉?字的 SELECT?studentno,studentname?FROM?student WHERE?studentname?LIKE?'%嘉%';  --?查詢姓名中含有特殊字符的需要使用轉義符號?'' --?自定義轉義符關鍵字:??ESCAPE?':'  --?============================================= --?IN --?============================================= --?查詢學號為1000,1001,1002的學生姓名 SELECT?studentno,studentname?FROM?student WHERE?studentno?IN?(1000,1001,1002);  --?查詢地址在北京,南京,河南洛陽的學生 SELECT?studentno,studentname,address?FROM?student WHERE?address?IN?('北京','南京','河南洛陽');  --?============================================= --?NULL?空 --?============================================= --?查詢出生日期沒有填寫的同學 --?不能直接寫=NULL?,?這是代表錯誤的?,?用?is?null SELECT?studentname?FROM?student WHERE?BornDate?IS?NULL;  --?查詢出生日期填寫的同學 SELECT?studentname?FROM?student WHERE?BornDate?IS?NOT?NULL;  --?查詢沒有寫家庭住址的同學(空字符串不等于null) SELECT?studentname?FROM?student WHERE?Address=''?OR?Address?IS?NULL;

連接查詢

JOIN 對比

如何使用DQL查詢數據

七種Join:

如何使用DQL查詢數據

測試

/* 連接查詢 ????如需要多張數據表的數據進行查詢,則可通過連接運算符實現多個查詢 內連接?inner?join ????查詢兩個表中的結果集中的交集 外連接?outer?join ????左外連接?left?join ????????(以左表作為基準,右邊表來一一匹配,匹配不上的,返回左表的記錄,右表以NULL填充) ????右外連接?right?join ????????(以右表作為基準,左邊表來一一匹配,匹配不上的,返回右表的記錄,左表以NULL填充) ???????? 等值連接和非等值連接  自連接 */  --?查詢參加了考試的同學信息(學號,學生姓名,科目編號,分數) SELECT?*?FROM?student; SELECT?*?FROM?result;  /*思路: (1):分析需求,確定查詢的列來源于兩個類,student??result,連接查詢 (2):確定使用哪種連接查詢?(內連接) */ SELECT?s.studentno,studentname,subjectno,StudentResult FROM?student?s INNER?JOIN?result?r ON?r.studentno?=?s.studentno  --?右連接(也可實現) SELECT?s.studentno,studentname,subjectno,StudentResult FROM?student?s RIGHT?JOIN?result?r ON?r.studentno?=?s.studentno  --?等值連接 SELECT?s.studentno,studentname,subjectno,StudentResult FROM?student?s?,?result?r WHERE?r.studentno?=?s.studentno  --?左連接?(查詢了所有同學,不考試的也會查出來) SELECT?s.studentno,studentname,subjectno,StudentResult FROM?student?s LEFT?JOIN?result?r ON?r.studentno?=?s.studentno  --?查一下缺考的同學(左連接應用場景) SELECT?s.studentno,studentname,subjectno,StudentResult FROM?student?s LEFT?JOIN?result?r ON?r.studentno?=?s.studentno WHERE?StudentResult?IS?NULL  --?思考題:查詢參加了考試的同學信息(學號,學生姓名,科目名,分數) SELECT?s.studentno,studentname,subjectname,StudentResult FROM?student?s INNER?JOIN?result?r ON?r.studentno?=?s.studentno INNER?JOIN?`subject`?sub ON?sub.subjectno?=?r.subjectno

自連接

/* 自連接 ????數據表與自身進行連接  需求:從一個包含欄目ID?,?欄目名稱和父欄目ID的表中 ?????查詢父欄目名稱和其他子欄目名稱 */  --?創建一個表 CREATE?TABLE?`category`?( ??`categoryid`?INT(10)?UNSIGNED?NOT?NULL?AUTO_INCREMENT?COMMENT?'主題id', ??`pid`?INT(10)?NOT?NULL?COMMENT?'父id', ??`categoryName`?VARCHAR(50)?NOT?NULL?COMMENT?'主題名字', ??PRIMARY?KEY?(`categoryid`) )?ENGINE=INNODB?AUTO_INCREMENT=9?DEFAULT?CHARSET=utf8  --?插入數據 INSERT?INTO?`category`?(`categoryid`,?`pid`,?`categoryName`) VALUES('2','1','信息技術'), ('3','1','軟件開發'), ('4','3','數據庫'), ('5','1','美術設計'), ('6','3','web開發'), ('7','5','ps技術'), ('8','2','辦公信息');  --?編寫SQL語句,將欄目的父子關系呈現出來?(父欄目名稱,子欄目名稱) --?核心思想:把一張表看成兩張一模一樣的表,然后將這兩張表連接查詢(自連接) SELECT?a.categoryName?AS?'父欄目',b.categoryName?AS?'子欄目' FROM?category?AS?a,category?AS?b WHERE?a.`categoryid`=b.`pid`  --?思考題:查詢參加了考試的同學信息(學號,學生姓名,科目名,分數) SELECT?s.studentno,studentname,subjectname,StudentResult FROM?student?s INNER?JOIN?result?r ON?r.studentno?=?s.studentno INNER?JOIN?`subject`?sub ON?sub.subjectno?=?r.subjectno  --?查詢學員及所屬的年級(學號,學生姓名,年級名) SELECT?studentno?AS?學號,studentname?AS?學生姓名,gradename?AS?年級名稱 FROM?student?s INNER?JOIN?grade?g ON?s.`GradeId`?=?g.`GradeID`  --?查詢科目及所屬的年級(科目名稱,年級名稱) SELECT?subjectname?AS?科目名稱,gradename?AS?年級名稱 FROM?SUBJECT?sub INNER?JOIN?grade?g ON?sub.gradeid?=?g.gradeid  --?查詢?數據庫結構-1?的所有考試結果(學號?學生姓名?科目名稱?成績) SELECT?s.studentno,studentname,subjectname,StudentResult FROM?student?s INNER?JOIN?result?r ON?r.studentno?=?s.studentno INNER?JOIN?`subject`?sub ON?r.subjectno?=?sub.subjectno WHERE?subjectname='數據庫結構-1'

排序和分頁

測試

/*==============?排序?================ 語法?:?ORDER?BY ????ORDER?BY?語句用于根據指定的列對結果集進行排序。 ????ORDER?BY?語句默認按照ASC升序對記錄進行排序。 ????如果您希望按照降序對記錄進行排序,可以使用?DESC?關鍵字。 ???? */  --?查詢?數據庫結構-1?的所有考試結果(學號?學生姓名?科目名稱?成績) --?按成績降序排序 SELECT?s.studentno,studentname,subjectname,StudentResult FROM?student?s INNER?JOIN?result?r ON?r.studentno?=?s.studentno INNER?JOIN?`subject`?sub ON?r.subjectno?=?sub.subjectno WHERE?subjectname='數據庫結構-1' ORDER?BY?StudentResult?DESC  /*==============?分頁?================ 語法?:?SELECT?*?FROM?table?LIMIT?[offset,]?rows?|?rows?OFFSET?offset 好處?:?(用戶體驗,網絡傳輸,查詢壓力)  推導: ????第一頁?:?limit?0,5 ????第二頁?:?limit?5,5 ????第三頁?:?limit?10,5 ????...... ????第N頁?:?limit?(pageNo-1)*pageSzie,pageSzie ????[pageNo:頁碼,pageSize:單頁面顯示條數] ???? */  --?每頁顯示5條數據 SELECT?s.studentno,studentname,subjectname,StudentResult FROM?student?s INNER?JOIN?result?r ON?r.studentno?=?s.studentno INNER?JOIN?`subject`?sub ON?r.subjectno?=?sub.subjectno WHERE?subjectname='數據庫結構-1' ORDER?BY?StudentResult?DESC?,?studentno LIMIT?0,5  --?查詢?JAVA第一學年?課程成績前10名并且分數大于80的學生信息(學號,姓名,課程名,分數) SELECT?s.studentno,studentname,subjectname,StudentResult FROM?student?s INNER?JOIN?result?r ON?r.studentno?=?s.studentno INNER?JOIN?`subject`?sub ON?r.subjectno?=?sub.subjectno WHERE?subjectname='JAVA第一學年' ORDER?BY?StudentResult?DESC LIMIT?0,10

子查詢

/*==============?子查詢?================ 什么是子查詢? ????在查詢語句中的WHERE條件子句中,又嵌套了另一個查詢語句 ????嵌套查詢可由多個子查詢組成,求解的方式是由里及外; ????子查詢返回的結果一般都是集合,故而建議使用IN關鍵字; */  --?查詢?數據庫結構-1?的所有考試結果(學號,科目編號,成績),并且成績降序排列 --?方法一:使用連接查詢 SELECT?studentno,r.subjectno,StudentResult FROM?result?r INNER?JOIN?`subject`?sub ON?r.`SubjectNo`=sub.`SubjectNo` WHERE?subjectname?=?'數據庫結構-1' ORDER?BY?studentresult?DESC;  --?方法二:使用子查詢(執行順序:由里及外) SELECT?studentno,subjectno,StudentResult FROM?result WHERE?subjectno=( ????SELECT?subjectno?FROM?`subject` ????WHERE?subjectname?=?'數據庫結構-1' ) ORDER?BY?studentresult?DESC;  --?查詢課程為?高等數學-2?且分數不小于80分的學生的學號和姓名 --?方法一:使用連接查詢 SELECT?s.studentno,studentname FROM?student?s INNER?JOIN?result?r ON?s.`StudentNo`?=?r.`StudentNo` INNER?JOIN?`subject`?sub ON?sub.`SubjectNo`?=?r.`SubjectNo` WHERE?subjectname?=?'高等數學-2'?AND?StudentResult&gt;=80  --?方法二:使用連接查詢+子查詢 --?分數不小于80分的學生的學號和姓名 SELECT?r.studentno,studentname?FROM?student?s INNER?JOIN?result?r?ON?s.`StudentNo`=r.`StudentNo` WHERE?StudentResult&gt;=80  --?在上面SQL基礎上,添加需求:課程為?高等數學-2 SELECT?r.studentno,studentname?FROM?student?s INNER?JOIN?result?r?ON?s.`StudentNo`=r.`StudentNo` WHERE?StudentResult&gt;=80?AND?subjectno=( ????SELECT?subjectno?FROM?`subject` ????WHERE?subjectname?=?'高等數學-2' )  --?方法三:使用子查詢 --?分步寫簡單sql語句,然后將其嵌套起來 SELECT?studentno,studentname?FROM?student?WHERE?studentno?IN( ????SELECT?studentno?FROM?result?WHERE?StudentResult&gt;=80?AND?subjectno=( ????????SELECT?subjectno?FROM?`subject`?WHERE?subjectname?=?'高等數學-2' ????) )  /* 練習題目: ????查?C語言-1?的前5名學生的成績信息(學號,姓名,分數) ????使用子查詢,查詢郭靖同學所在的年級名稱 */

相關推薦:《mysql教程

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享