mysql数据库入门教程(4):查询讲解大全
SQL腳本導入
開始
在進行查詢之前,必須得有寫好的sql文件吧。
先導入寫好的sql腳本
打開sqlyang客戶端
右擊root@localhost
選擇執行sql腳本
選擇文件,點擊執行,最后點擊完成
刷新,發現主頁面多啦一個數據庫
介紹
myemployees:員工
l里面有四張表departments,employees,jobs,locations
該資源鏈接:
myemployees所在地鏈接
這是官方給出的資源
1基礎查詢
語法
select 查詢列表 from 表名;
查詢列表可以是:表中的字段,常量值,表達式,函數。
查詢結果的表格是一個虛擬表格。
DESC 表名;
顯示表結構
1查詢表中的單個字段
#基礎查詢 USE myemployees;#進入數據庫 SELECT last_name FROM employees;#查詢名字可以在左邊點擊表格字段,右邊即顯示出來。
2查詢表中的多個字段
#基礎查詢 USE myemployees;#進入數據庫 SELECT last_name,salary,email FROM employees;#查詢名字,運行,郵箱3查詢表中的所有字段
#基礎查詢 USE myemployees;#進入數據庫 SELECT * FROM employees;#查詢所有4 查詢常量
#基礎查詢 USE myemployees; SELECT 100; SELECT 'john';5.查詢表達式
#基礎查詢 USE myemployees; SELECT 100%98;6.查詢函數
USE myemployees;SELECT VERSION();查詢函數即調用該函數,并返回返回值。
7.為字段起別名
方便我們理解
①便于理解
②如果要查詢的字段有重名的情況,使用別名可以區分開來
#方式一:使用as
SELECT 100%98 AS 結果;
#方式二:使用空格
如果別名中有特殊符號,如空格,則應該把別名加上引號。否則報錯
#案例:查詢salary,顯示結果為 out put
SELECT salary AS “out put” FROM employees;
8 去重
#案例:查詢員工表中涉及到的所有的部門編號 SELECT DISTINCT department_id FROM employees;在select 后面加上DISTINCT
DISTINCT:截然不同的
如果不加distinct ,會出現大量重復數據。
9 +號的使用
mysql中的+號:
僅僅只有一個功能:運算符
select 100+90; 兩個操作數都為數值型,則做加法運算
select ‘123’+90;只要其中一方為字符型,試圖將字符型數值轉換成數值型
如果轉換成功,則繼續做加法運算
select ‘john’+90; 如果轉換失敗,則將字符型數值轉換成0
select null+10; 只要其中一方為null,則結果肯定為null
10 concat拼接
#案例:查詢員工名和姓連接成一個字段,并顯示為 姓名
顯示出表employees的全部列,各個列之間用逗號連接,列頭顯示成OUT_PUT
SELECTCONCAT(`first_name`,',',`last_name`,',',`job_id`,',',IFNULL(commission_pct,0)) AS out_put FROMemployees;因為空值
IFNULL(commission_pct,0) 如果commission為空則為0,如果不為空就是原值
2條件查詢
語法:
select 查詢列表 from 表名 where 篩選條件
分類:
一、按條件表達式篩選
簡單條件運算符:> < = != <> >= <=
二、按邏輯表達式篩選
邏輯運算符:
作用:用于連接條件表達式
&& || !
and or not
&&和and:兩個條件都為true,結果為true,反之為false
||或or: 只要有一個條件為true,結果為true,反之為false
!或not: 如果連接的條件本身為false,結果為true,反之為false
三、模糊查詢
like
between and
in
is null
1、按條件表達式篩選
#案例1:查詢工資>12000的員工信息
#案例2:查詢部門編號不等于90號的員工名和部門編號
USE myemployees; #案例2:查詢部門編號不等于90號的員工名和部門編號 SELECT last_name,department_id FROM employees WHERE department_id<>90;2.按邏輯表達式篩選
#案例1:查詢工資在10000到20000之間的員工名、工資以及獎金
#案例2:查詢部門編號不是在90到110之間,或者工資高于15000的員工信息
USE myemployees; #案例2:查詢部門編號不是在90到110之間,或者工資高于15000的員工信息 SELECT* FROMemployees WHERENOT(department_id>=90 AND department_id<=110) OR salary>15000;3、模糊查詢
like
between and
in
is null|is not null
#1.like
/*
特點:
①一般和通配符搭配使用
通配符:
% 任意多個字符,包含0個字符
_ 任意單個字符
*、
like通常和通配符搭配
%通配符 任意多個字符,包含0個。
_任意單個字符
#案例1:查詢員工名中包含字符a的員工信息
USE myemployees;#案例1:查詢員工名中包含字符a的員工信息 SELECT * FROMemployees WHERElast_name LIKE '%a%';#案例2:查詢員工名中第三個字符為n,第五個字符為l的員工名和工資
USE myemployees;#案例2:查詢員工名中第三個字符為n,第五個字符為l的員工名和工資 SELECTlast_name,salary FROMemployees WHERElast_name LIKE '__n_l%';#特殊情況 案例3:查詢員工名中第二個字符為_的員工名
ESCAPE ‘$’ :指定 美元符號為轉義符號
USE myemployees;#案例3:查詢員工名中第二個字符為_的員工名SELECTlast_name FROMemployees WHERElast_name LIKE '_$_%' ESCAPE '$';last_name LIKE ‘KaTeX parse error: Expected group after '_' at position 1: _?%' ESCAPE '’;
還可以寫成
last_name LIKE '_%’ ;
使用\轉義
#2.between and
/*
①使用between and 可以提高語句的簡潔度
②包含臨界值
③兩個臨界值不要調換順序
*/
#案例1:查詢員工編號在100到120之間的員工信息
USE myemployees;#案例1:查詢員工編號在100到120之間的員工信息SELECT* FROMemployees WHEREemployee_id BETWEEN 100 AND 120;#3.in
/*
含義:判斷某字段的值是否屬于in列表中的某一項
特點:
①使用in提高語句簡潔度
②in列表的值類型必須一致或兼容
③in列表中不支持通配符
*/
#案例:查詢員工的工種編號是 IT_PROG、AD_VP、AD_PRES中的一個員工名和工種編號
原始方法
in
SELECTlast_name,job_id FROMemployees WHEREjob_id IN( 'IT_PROT' ,'AD_VP','AD_PRES');#4、is null
/*
=或<>不能用于判斷null值
is null或is not null 可以判斷null值
#案例1:查詢沒有獎金的員工名和獎金率
SELECTlast_name,commission_pct FROMemployees WHEREcommission_pct IS NULL;#案例1:查詢有獎金的員工名和獎金率
SELECTlast_name,commission_pct FROMemployees WHEREcommission_pct IS NOT NULL;#安全等于 <=>
可以判斷空值
#案例1:查詢沒有獎金的員工名和獎金率
SELECTlast_name,commission_pct FROMemployees WHEREcommission_pct <=>NULL;#案例2:查詢工資為12000的員工信息
#案例2:查詢工資為12000的員工信息 SELECTlast_name,salary FROMemployeesWHERE salary <=> 12000;IS NULL:僅僅可以判斷NULL值,可讀性較高,建議使用
<=> :既可以判斷NULL值,又可以判斷普通的數值,可讀性較低
3排序查詢
/*
語法:
select 查詢列表
from 表名
【where 篩選條件】
order by 排序的字段或表達式;
特點:
1、asc代表的是升序,可以省略
desc代表的是降序
2、order by子句可以支持 單個字段、別名、表達式、函數、多個字段
3、order by子句在查詢語句的最后面,除了limit子句
*/
#1、按單個字段排序
USE myemployees; #1、按單個字段排序 SELECT * FROM employees ORDER BY salary DESC;#2、添加篩選條件再排序
USE myemployees; #案例:查詢部門編號>=90的員工信息,并按員工編號降序SELECT * FROM employees WHERE department_id>=90 ORDER BY employee_id DESC;#3、按表達式排序
salary12(1+IFNULL(commission_pct,0)) 年薪計算
#4、按別名排序
#4、按別名排序 #案例:查詢員工信息 按年薪升序SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees ORDER BY 年薪 ASC;#5、按函數排序
#案例:查詢員工名,并且按名字的長度降序
#6、按多個字段排序
#案例:查詢員工信息,要求先按工資降序,再按employee_id升序
4常見函數
在學習高級查詢之前,先學習下常見函數
概念:類似于java的方法,將一組邏輯語句封裝在方法體中,對外暴露方法名
好處:1、隱藏了實現細節 2、提高代碼的重用性
調用:select 函數名(實參列表) 【from 表】;
分類:
1、單行函數
如 concat、length、ifnull等
2、分組函數
功能:做統計使用,又稱為統計函數、聚合函數、組函數
單行函數
分類:字符函數,數學函數,日期函數,其他函數,控制函數
一.字符函數
length:獲取字節個數(utf-8一個漢字代表3個字節,gbk為2個字節)
concat 拼接字符串
substr #截取字符
instr 返回子串第一次出現的索引,如果找不到返回0
trim 去前后空格
upper #轉大寫
lower #轉小寫
lpad 左填充,指定元素填充,指定總長度
rpad 右填充,指定元素填充,指定總長度
replace 替換
二,數學函數
round 四舍五入
ceil 向上取整,返回大于等于該數的最小整數
floor 向下取整,返回小于等于該參數的最大整數
truncate 截斷,小數點后面保留幾位
mod 取余
三.其他函數
version 版本號
database 查看當前數據庫
user 查看當前用戶
五. 流程控制函數if case
if 第一個參數為條件表達式,如果滿足,返回第二個參數,不滿足返回第三參數。
SELECT IF(10>5,'大','小');結果大
case
mysql中
case 要判斷的字段或表達式
when 常量1 then 要顯示的值1或語句1;
when 常量2 then 要顯示的值2或語句2;
…
else 要顯示的值n或語句n;
end
*/
mysql中:
case
when 條件1 then 要顯示的值1或語句1
when 條件2 then 要顯示的值2或語句2
。。。
else 要顯示的值n或語句n
end
*/
這里case后面沒有語句
分組函數
/*
功能:用作統計使用,又稱為聚合函數或統計函數或組函數
分類:
sum 求和、avg 平均值、max 最大值 、min 最小值 、count 計算個數
特點:
1、sum、avg一般用于處理數值型
max、min、count可以處理任何類型
max,min對字符排序是根據字的字母順序
2、以上分組函數都忽略null值
3、可以和distinct搭配實現去重的運算
5分組查詢
/*
語法:
select 查詢列表
from 表
【where 篩選條件】
group by 分組的字段
【order by 排序的字段】;
特點:
1、和分組函數一同查詢的字段必須是group by后出現的字段
2、篩選分為兩類:分組前篩選和分組后篩選
針對的表 位置 連接的關鍵字
分組前篩選 原始表 group by前 where
分組后篩選 group by后的結果集 group by后 having
問題1:分組函數做篩選能不能放在where后面
答:不能
問題2:where——group by——having
一般來講,能用分組前篩選的,盡量使用分組前篩選,提高效率
3、分組可以按單個字段也可以按多個字段
4、可以搭配著排序使用
*/
沒有篩選
#案例1:查詢每個工種的員工平均工資 SELECT AVG(salary),job_id FROM employees GROUP BY job_id;可以實現分組前的篩選
如果根據原始表可以篩選,就是分組前篩選
添加分組后篩選
如果原始表不能篩選,就是分組后篩選。
分組后篩選的數據源是分組后的數據
關于分組前和分組后的選擇,建議先寫select 和group by部分,最后寫條件部分
添加排序
#案例:每個工種有獎金的員工的最高工資>6000的工種編號和最高工資,按最高工資升序SELECT job_id,MAX(salary) m FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING m>6000 ORDER BY m ;按多個字段分組
#案例:查詢每個工種每個部門的最低工資,并按最低工資降序SELECT MIN(salary),job_id,department_id FROM employees GROUP BY department_id,job_id ORDER BY MIN(salary) DESC;電氣專業的計算機萌新,寫博文不容易。如果你覺得本文對你有用,請點個贊支持下,謝謝。
總結
以上是生活随笔為你收集整理的mysql数据库入门教程(4):查询讲解大全的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 安装第三方包
- 下一篇: 平安福如何全额退保