日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql数据库入门教程(4):查询讲解大全

發布時間:2024/9/30 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 last_name AS 姓,first_name AS 名 FROM employees;

SELECT 100%98 AS 結果;
#方式二:使用空格

SELECT last_name 姓,first_name 名 FROM employees;

如果別名中有特殊符號,如空格,則應該把別名加上引號。否則報錯
#案例:查詢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拼接
#案例:查詢員工名和姓連接成一個字段,并顯示為 姓名

#基礎查詢 USE myemployees;SELECT CONCAT(last_name,first_name) AS 姓名 FROM employees;

顯示出表employees的全部列,各個列之間用逗號連接,列頭顯示成OUT_PUT

SELECTCONCAT(`first_name`,',',`last_name`,',',`job_id`,',',IFNULL(commission_pct,0)) AS out_put FROMemployees;

因為空值
IFNULL(commission_pct,0) 如果commission為空則為0,如果不為空就是原值

SELECT IFNULL(commission_pct,0) AS 獎金率,commission_pct FROM employees;

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的員工信息

USE myemployees; #案例1:查詢工資>12000的員工信息 SELECT * FROM employees WHERE salary>12000;

#案例2:查詢部門編號不等于90號的員工名和部門編號

USE myemployees; #案例2:查詢部門編號不等于90號的員工名和部門編號 SELECT last_name,department_id FROM employees WHERE department_id<>90;

2.按邏輯表達式篩選
#案例1:查詢工資在10000到20000之間的員工名、工資以及獎金

USE myemployees; #案例1:查詢工資z在10000到20000之間的員工名、工資以及獎金 SELECT last_name,salary, commission_pct FROM employees WHERE salary>=10000 AND salary<=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中的一個員工名和工種編號
原始方法

SELECTlast_name,job_id FROMemployees WHEREjob_id = 'IT_PROT' OR job_id = 'AD_VP' OR JOB_ID ='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)) 年薪計算

USE myemployees; #案例:查詢員工信息 按年薪降序 SELECT *,salary*12*(1+IFNULL(commission_pct,0)) FROM employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;

#4、按別名排序

#4、按別名排序 #案例:查詢員工信息 按年薪升序SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees ORDER BY 年薪 ASC;

#5、按函數排序
#案例:查詢員工名,并且按名字的長度降序

USE myemployees; #案例:查詢員工名,并且按名字的長度降序SELECT LENGTH(last_name),last_name FROM employees ORDER BY LENGTH(last_name) DESC;

#6、按多個字段排序
#案例:查詢員工信息,要求先按工資降序,再按employee_id升序

USE myemployees; #案例:查詢員工信息,要求先按工資降序,再按employee_id升序 SELECT * FROM employees ORDER BY salary DESC,employee_id ASC;

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 替換

USE myemployees; #1.length SELECT LENGTH('余登武'); #2.concat 拼接字符串SELECT CONCAT(last_name,'-',first_name) AS 姓名 FROM employees;#3 upper lower SELECT UPPER('yu'); SELECT LOWER('YU'); SELECT CONCAT(UPPER(last_name),LOWER(first_name)) AS 姓名 FROM employees;#姓大寫,名小寫,并拼接#4。substr 截取字符 SELECT SUBSTR('楊冪李冰冰范爺',3); #索引從1開始,截取索引3后面的字符 ,即截取出李冰冰范爺 SELECT SUBSTR('楊冪李冰冰范爺',1,2); #索引從1開始,截取索引1后面長度為2的字符,即截取出楊冪 #5.instr 返回子串第一次出現的索引,如果沒找到,返回0 SELECT INSTR('楊不悔愛上了殷六俠愛', '愛') AS output; #結果4 #6.trim 去前后空格 SELECT LENGTH(TRIM(' 余登武 ')) AS outout;#結果為9 SELECT TRIM('a' FROM 'aaaaa余aaa登aa武aaaaaaaaaaaa') AS output;#結果余aaa登aa武#7.Lpad 左填充,指定元素填充,指定總長度 #Rpad 右填充 SELECT LPAD('李倩',10,'*') AS output;#結果 ********李倩 SELECT RPAD('李倩',10,'*') AS output;#結果 李倩********# 8.replace 替換SELECT REPLACE('總裁余喜歡高小姐','高小姐','李女士')AS output; #將高小姐替換為李女士

二,數學函數

round 四舍五入
ceil 向上取整,返回大于等于該數的最小整數
floor 向下取整,返回小于等于該參數的最大整數
truncate 截斷,小數點后面保留幾位
mod 取余

USE myemployees; #1.round 四舍五入 SELECT ROUND(1.65);#結果2 SELECT ROUND(1.65,1);#結果1.7,第二個參數為小數點后面保留幾位#2 ceil 向上取整,返回大于等于該數的最小整數 SELECT CEIL(1.2);#結果2 #3.floor 向下取整,返回小于等于該參數的最大整數 SELECT FLOOR(1.2);#結果1#4.truncate 截斷 小數點后面保留幾位 SELECT TRUNCATE(12.321,2);#結果12.32 #5.mod 取余 SELECT MOD(10,3); #結果1

三.其他函數

version 版本號
database 查看當前數據庫
user 查看當前用戶

#version 版本號 SELECT VERSION(); #查看當前數據庫 SELECT DATABASE(); #查看當前用戶 SELECT 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
*/

USE myemployees; /*案例:查詢員工的工資,要求部門號=30,顯示的工資為1.1倍 部門號=40,顯示的工資為1.2倍 部門號=50,顯示的工資為1.3倍 其他部門,顯示的工資為原工資*/SELECT salary 原始工資,department_id, CASE department_id WHEN 30 THEN salary*1.1 WHEN 40 THEN salary*1.2 WHEN 50 THEN salary*1.3 ELSE salary END AS 新工資 FROM employees;

mysql中:
case
when 條件1 then 要顯示的值1或語句1
when 條件2 then 要顯示的值2或語句2
。。。
else 要顯示的值n或語句n
end
*/

USE myemployees; /* 案例:查詢員工的工資的情況 如果工資>20000,顯示A級別 如果工資>15000,顯示B級別 如果工資>10000,顯示C級別 否則,顯示D級別 */SELECT salary, CASE WHEN salary>20000 THEN 'A' WHEN salary>15000 THEN 'B' WHEN salary>10000 THEN 'C' ELSE 'D' END AS 工資級別 FROM employees;

這里case后面沒有語句

分組函數

/*
功能:用作統計使用,又稱為聚合函數或統計函數或組函數
分類:
sum 求和、avg 平均值、max 最大值 、min 最小值 、count 計算個數
特點:
1、sum、avg一般用于處理數值型
max、min、count可以處理任何類型
max,min對字符排序是根據字的字母順序
2、以上分組函數都忽略null值
3、可以和distinct搭配實現去重的運算

#1、簡單 的使用 SELECT SUM(salary) FROM employees; SELECT AVG(salary) FROM employees; SELECT MIN(salary) FROM employees; SELECT MAX(salary) FROM employees; SELECT COUNT(salary) FROM employees; #一起查詢 SELECT SUM(salary),AVG(salary) 平均,MAX(salary) 最高,MIN(salary) 最低,COUNT(salary) 個數 FROM employees;SELECT SUM(salary),ROUND(AVG(salary),2) 平均,MAX(salary) 最高,MIN(salary) 最低,COUNT(salary) 個數 FROM employees; #和distinct搭配 SELECT SUM(DISTINCT salary),SUM(salary) FROM employees;SELECT COUNT(DISTINCT salary),COUNT(salary) FROM employees; #5、count函數的詳細介紹SELECT COUNT(salary) FROM employees;SELECT COUNT(*) FROM employees;SELECT COUNT(1) FROM employees;#1表示序號如表格里默認的行數效率: MYISAM存儲引擎下 ,COUNT(*)的效率高 INNODB存儲引擎下,COUNT(*)和COUNT(1)的效率差不多,比COUNT(字段)要高一些 #和分組函數一同查詢的字段有限制 因為得到的行數不同,表格不好展示SELECT AVG(salary),employee_id FROM employees;

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;

可以實現分組前的篩選
如果根據原始表可以篩選,就是分組前篩選

#案例1:查詢郵箱中包含a字符的 每個部門的最高工資SELECT MAX(salary),department_id FROM employees WHERE email LIKE '%a%' GROUP BY department_id; #案例2:查詢有獎金的每個領導手下員工的平均工資SELECT AVG(salary),manager_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY manager_id;

添加分組后篩選
如果原始表不能篩選,就是分組后篩選。
分組后篩選的數據源是分組后的數據

USE myemployees;#案例:查詢哪個部門的員工個數>5SELECT COUNT(*),department_id FROM employees GROUP BY department_id HAVING COUNT(*)>5; #案例2:每個工種有獎金的員工的最高工資>12000的工種編號和最高工資SELECT job_id,MAX(salary) FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING MAX(salary)>12000;

關于分組前和分組后的選擇,建議先寫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):查询讲解大全的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。