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

歡迎訪問 生活随笔!

生活随笔

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

数据库

一、MySQL查询学习笔记(基础查询、条件查询、排序查询、常见函数、分组查询 详解)

發布時間:2024/7/5 数据库 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一、MySQL查询学习笔记(基础查询、条件查询、排序查询、常见函数、分组查询 详解) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

DQL語言的學習

一、基礎查詢

語法: **SELECT 要查詢的東西 【FROM 表名】;**類似于Java中 :System.out.println(要打印的東西); 特點: ①通過select查詢完的結果 ,是一個虛擬的表格,不是真實存在 ② 要查詢的東西 可以是常量值、可以是表達式、可以是字段、可以是函數 USE myemployees;

1. 查詢表中的單個字段

SELECT last_name FROM employees;

2. 查詢表中的多個字段

SELECT last_name,salary,email FROM employees;

3. 查詢表中的所有字段

#方式一: SELECT `employee_id`,`first_name`,`last_name`,`phone_number`,`last_name`,`job_id`,`phone_number`,`job_id`,`salary`,`commission_pct`,`manager_id`,`department_id`,`hiredate` FROMemployees ; #方式二: SELECT * FROM employees;

4. 查詢常量值

SELECT 100;SELECT 'john';

5. 查詢表達式

SELECT 100%98;

6. 查詢函數

SELECT VERSION();

7. 起別名
①便于理解
②如果要查詢的字段有重名的情況,使用別名可以區分開來

方式一:使用as

SELECT 100%98 AS 結果; SELECT last_name AS,first_name ASFROM employees;

方式二:使用空格

SELECT last_name 姓,first_name 名 FROM employees;

案例:查詢salary,顯示結果為 out put

SELECT salary AS "out put" FROM employees;

8. 去重

案例:查詢員工表中涉及到的所有的部門編號

SELECT DISTINCT department_id FROM employees;

9. +號的作用
1)java中的+號:
①運算符,兩個操作數都為數值型
②連接符,只要有一個操作數為字符串

2)mysql中的+號:
僅僅只有一個功能:運算符

select 100+90; 兩個操作數都為數值型,則做加法運算 select
‘123’+90;只要其中一方為字符型,試圖將字符型數值轉換成數值型 如果轉換成功,則繼續做加法運算 select
‘john’+90; 如果轉換失敗,則將字符型數值轉換成0

select null+10; 只要其中一方為null,則結果肯定為null

案例:查詢員工名和姓連接成一個字段,并顯示為 姓名

SELECT CONCAT('a','b','c') AS 結果;SELECT CONCAT(last_name,first_name) AS 姓名 FROMemployees;

二、條件查詢

條件查詢:根據條件過濾原始表的數據,查詢到想要的數據
  • 語法:
    select 查詢列表 from 表名
    where 篩選條件;

  • 分類:
    一、按條件表達式篩選

    簡單條件運算符:> < = != <> >= <=
    示例:salary>10000

    二、按邏輯表達式篩選

    邏輯運算符:
    作用:用于連接條件表達式
    && || !
    and or not

    &&和and:兩個條件都為true,結果為true,反之為false
    ||或or: 只要有一個條件為true,結果為true,反之為false
    !或not: 如果連接的條件本身為false,結果為true,反之為false

    示例:salary>10000 && salary<20000

    三、模糊查詢
    like
    between and
    in
    is null

    示例:last_name like ‘a%’

  • 一、按條件表達式篩選

    案例1:查詢工資>12000的員工信息

    SELECT * FROMemployees WHEREsalary>12000;

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

    SELECT last_name,department_id FROMemployees WHEREdepartment_id<>90;

    二、按邏輯表達式篩選

    案例1:查詢工資z在10000到20000之間的員工名、工資以及獎金

    SELECTlast_name,salary,commission_pct FROMemployees WHEREsalary>=10000 AND salary<=20000;

    案例2:查詢部門編號不是在90到110之間,或者工資高于15000的員工信息

    SELECT* FROMemployees WHERENOT(department_id>=90 AND department_id<=110) OR salary>15000;

    三、模糊查詢
    like
    between and
    in
    is null | is not null

    1.like
    特點:
    ①一般和通配符搭配使用

    通配符: % 任意多個字符,包含0個字符 _ 任意單個字符

    案例1:查詢員工名中包含字符a的員工信息

    select * fromemployees wherelast_name like '%a%';#abc

    案例2:查詢員工名中第三個字符為e,第五個字符為a的員工名和工資

    selectlast_name,salary FROMemployees WHERElast_name LIKE '__n_l%';

    案例3:查詢員工名中第二個字符為_的員工名

    SELECTlast_name FROMemployees WHERElast_name LIKE '_$_%' ESCAPE '$';

    2.between and

    ①使用between and 可以提高語句的簡潔度
    ②包含臨界值
    ③兩個臨界值不要調換順序

    案例1:查詢員工編號在100到120之間的員工信息

    SELECT* FROMemployees WHEREemployee_id >= 120 AND employee_id<=100; #---------------------- SELECT* FROMemployees WHEREemployee_id BETWEEN 120 AND 100;

    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';#------------------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;#----------以下為× SELECTlast_name,commission_pct FROMemployeesWHERE salary IS 12000;

    案例1:查詢沒有獎金的員工名和獎金率

    #安全等于 <=>SELECTlast_name,commission_pct FROMemployees WHEREcommission_pct <=>NULL;

    案例2:查詢工資為12000的員工信息

    SELECTlast_name,salary FROMemployeesWHERE salary <=> 12000;#is null pk <=>

    IS NULL:僅僅可以判斷NULL值,可讀性較高,建議使用
    <=> :既可以判斷NULL值,又可以判斷普通的數值,可讀性較低

    三、排序查詢

    語法: select要查詢的東西 from表 where 條件 order by 排序的字段|表達式|函數|別名 【asc|desc】特點: 1、asc代表的是升序,可以省略 desc代表的是降序2、order by子句可以支持 單個字段、別名、表達式、函數、多個字段3、order by子句在查詢語句的最后面,除了limit子句

    1、按單個字段排序

    SELECT * FROM employees ORDER BY salary DESC;

    2、添加篩選條件再排序

    案例:查詢部門編號>=90的員工信息,并按員工編號降序

    SELECT * FROM employees WHERE department_id>=90 ORDER BY employee_id DESC;

    3、按表達式排序
    案例:查詢員工信息 按年薪降序

    SELECT *,salary*12*(1+IFNULL(commission_pct,0)) FROM employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;

    4、按別名排序
    案例:查詢員工信息 按年薪升序

    SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees ORDER BY 年薪 ASC;

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

    SELECT LENGTH(last_name),last_name FROM employees ORDER BY LENGTH(last_name) DESC;

    6、按多個字段排序

    案例:查詢員工信息,要求先按工資降序,再按employee_id升序

    SELECT * FROM employees ORDER BY salary DESC,employee_id ASC;

    7、強化練習

  • 查詢員工的姓名和部門號和年薪,按年薪降序 按姓名升序
  • SELECT last_name,department_id,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees ORDER BY 年薪 DESC,last_name ASC;
  • 選擇工資不在8000到17000的員工的姓名和工資,按工資降序
  • SELECT last_name,salary FROM employeesWHERE salary NOT BETWEEN 8000 AND 17000 ORDER BY salary DESC;
  • 查詢郵箱中包含e的員工信息,并先按郵箱的字節數降序,再按部門號升序
  • SELECT *,LENGTH(email) FROM employees WHERE email LIKE '%e%' ORDER BY LENGTH(email) DESC,department_id ASC;

    四、常見函數

    概念:類似于java的方法,將一組邏輯語句封裝在方法體中,對外暴露方法名
    好處:1、隱藏了實現細節 2、提高代碼的重用性
    調用:select 函數名(實參列表) 【from 表】;
    特點:
    ①叫什么(函數名)
    ②干什么(函數功能)

    分類:
    1、單行函數
    如 concat、length、ifnull等
    2、分組函數

    功能:做統計使用,又稱為統計函數、聚合函數、組函數一、單行函數1、字符函數concat拼接substr截取子串upper轉換成大寫lower轉換成小寫trim去前后指定的空格和字符ltrim去左邊空格rtrim去右邊空格replace替換lpad左填充rpad右填充instr返回子串第一次出現的索引length 獲取字節個數2、數學函數round 四舍五入rand 隨機數floor向下取整ceil向上取整mod取余truncate截斷3、日期函數now當前系統日期+時間curdate當前系統日期curtime當前系統時間str_to_date 將字符轉換成日期date_format將日期轉換成字符4、流程控制函數if 處理雙分支case語句 處理多分支情況1:處理等值判斷情況2:處理條件判斷5、其他函數version版本database當前庫user當前連接用戶

    一、字符函數

    1.length 獲取參數值的字節個數

    SELECT LENGTH('john'); SELECT LENGTH('張三豐hahaha');SHOW VARIABLES LIKE '%char%'

    2.concat 拼接字符串

    SELECT CONCAT(last_name,'_',first_name) 姓名 FROM employees;

    3.upper、lower

    SELECT UPPER('john'); SELECT LOWER('joHn');

    示例:將姓變大寫,名變小寫,然后拼接

    SELECT CONCAT(UPPER(last_name),LOWER(first_name)) 姓名 FROM employees;

    4.substr、substring
    注意:索引從1開始
    截取從指定索引處后面所有字符

    SELECT SUBSTR('李莫愁愛上了陸展元',7) out_put;

    截取從指定索引處指定字符長度的字符

    SELECT SUBSTR('李莫愁愛上了陸展元',1,3) out_put;

    案例:姓名中首字符大寫,其他字符小寫然后用_拼接,顯示出來

    SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(last_name,2))) out_put FROM employees;

    5.instr 返回子串第一次出現的索引,如果找不到返回0

    SELECT INSTR('楊不殷六俠悔愛上了殷六俠','殷八俠') AS out_put;

    6.trim

    SELECT LENGTH(TRIM(' 張翠山 ')) AS out_put;SELECT TRIM('aa' FROM 'aaaaaaaaa張aaaaaaaaaaaa翠山aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa') AS out_put;

    7.lpad 用指定的字符實現左填充指定長度

    SELECT LPAD('殷素素',2,'*') AS out_put;

    8.rpad 用指定的字符實現右填充指定長度

    SELECT RPAD('殷素素',12,'ab') AS out_put;

    9.replace 替換

    SELECT REPLACE('周芷若周芷若周芷若周芷若張無忌愛上了周芷若','周芷若','趙敏') AS out_put;

    二、數學函數

    1.round 四舍五入

    SELECT ROUND(-1.55); SELECT ROUND(1.567,2);

    2.ceil 向上取整,返回>=該參數的最小整數

    SELECT CEIL(-1.02);

    3.floor 向下取整,返回<=該參數的最大整數

    SELECT FLOOR(-9.99);

    4.truncate 截斷

    SELECT TRUNCATE(1.69999,1);

    5.mod取余

    /* mod(a,b) : a-a/b*bmod(-10,-3):-10- (-10)/(-3)*(-3)=-1 */ SELECT MOD(10,-3); SELECT 10%3;

    三、日期函數

    1.now 返回當前系統日期+時間

    SELECT NOW();

    2.curdate 返回當前系統日期,不包含時間

    SELECT CURDATE();

    3.curtime 返回當前時間,不包含日期

    SELECT CURTIME();

    4.可以獲取指定的部分,年、月、日、小時、分鐘、秒

    SELECT YEAR(NOW()); SELECT YEAR('1998-1-1');SELECT YEAR(hiredate)FROM employees;SELECT MONTH(NOW()); SELECT MONTHNAME(NOW());

    5.str_to_date 將字符通過指定的格式轉換成日期

    SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d') AS out_put;

    6.查詢入職日期為1992–4-3的員工信息

    SELECT * FROM employees WHERE hiredate = '1992-4-3';SELECT * FROM employees WHERE hiredate = STR_TO_DATE('4-3 1992','%c-%d %Y');

    7.date_format 將日期轉換成字符

    SELECT DATE_FORMAT(NOW(),'%y年%m月%d日') AS out_put;

    8.查詢有獎金的員工名和入職日期(xx月/xx日 xx年)

    SELECT last_name,DATE_FORMAT(hiredate,'%m月/%d日 %y年') 入職日期 FROM employees WHERE commission_pct IS NOT NULL;

    四、其他函數

    SELECT VERSION(); SELECT DATABASE(); SELECT USER();

    五、流程控制函數

    1.if函數: if else 的效果

    SELECT IF(10<5,'大','小');SELECT last_name,commission_pct,IF(commission_pct IS NULL,'沒獎金,呵呵','有獎金,嘻嘻') 備注 FROM employees;

    2.case函數的使用一: switch case 的效果

    java中
    switch(變量或表達式){
    case 常量1:語句1;break;

    default:語句n;break;
    }


    mysql中
    case 要判斷的字段或表達式
    when 常量1 then 要顯示的值1或語句1;
    when 常量2 then 要顯示的值2或語句2;

    else 要顯示的值n或語句n;
    end

    案例:查詢員工的工資,要求
    部門號=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;

    3.case 函數的使用二:類似于 多重if

    java中:
    if(條件1){
    語句1;
    }else if(條件2){
    語句2;
    }

    else{
    語句n;
    }


    mysql中:

    case when 條件1 then 要顯示的值1或語句1
    when 條件2 then 要顯示的值2或語句2

    else要顯示的值n或語句n
    end

    #案例:查詢員工的工資的情況
    如果工資>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;

    4.強化練習:

    1. 顯示系統時間(注:日期+時間)

    SELECT NOW();

    2. 查詢員工號,姓名,工資,以及工資提高百分之20%后的結果(new salary)

    SELECT employee_id,last_name,salary,salary*1.2 "new salary" FROM employees;

    3. 將員工的姓名按首字母排序,并寫出姓名的長度(length)

    SELECT LENGTH(last_name) 長度,SUBSTR(last_name,1,1) 首字符,last_name FROM employees ORDER BY 首字符;

    4. 做一個查詢,產生下面的結果

    <last_name> earns <salary> monthly but wants <salary*3> Dream Salary King earns 24000 monthly but wants 72000SELECT CONCAT(last_name,' earns ',salary,' monthly but wants ',salary*3) AS "Dream Salary" FROM employees WHERE salary=24000;

    二、分組函數

    sum 求和max 最大值min 最小值avg 平均值count 計數特點:1、以上五個分組函數都忽略null值,除了count(*)2、sum和avg一般用于處理數值型max、min、count可以處理任何數據類型3、都可以搭配distinct使用,用于統計去重后的結果4、count的參數可以支持:字段、*、常量值,一般放1建議使用 count(*)

    功能:用作統計使用,又稱為聚合函數或統計函數或組函數

    分類:
    sum 求和、avg 平均值、max 最大值 、min 最小值 、count 計算個數

    特點:
    1、sum、avg一般用于處理數值型
    max、min、count可以處理任何類型

    2、以上分組函數都忽略null值

    3、可以和distinct搭配實現去重的運算

    4、count函數的單獨介紹
    一般使用count(*)用作統計行數

    5、和分組函數一同查詢的字段要求是group by后的字段

    代碼演示:

    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;

    2、參數支持哪些類型

    SELECT SUM(last_name) ,AVG(last_name) FROM employees; SELECT SUM(hiredate) ,AVG(hiredate) FROM employees;SELECT MAX(last_name),MIN(last_name) FROM employees;SELECT MAX(hiredate),MIN(hiredate) FROM employees;SELECT COUNT(commission_pct) FROM employees; SELECT COUNT(last_name) FROM employees;

    3、是否忽略null

    SELECT SUM(commission_pct) ,AVG(commission_pct),SUM(commission_pct)/35,SUM(commission_pct)/107 FROM employees;SELECT MAX(commission_pct) ,MIN(commission_pct) FROM employees;SELECT COUNT(commission_pct) FROM employees; SELECT commission_pct FROM employees;

    4、和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;

    效率:
    MYISAM存儲引擎下 ,COUNT()的效率高
    INNODB存儲引擎下,COUNT()和COUNT(1)的效率差不多,比COUNT(字段)要高一些

    6、和分組函數一同查詢的字段有限制

    SELECT AVG(salary),employee_id FROM employees;

    5:分組查詢

    語法: select 查詢列表 from 表 【where 篩選條件】 group by 分組的字段 【order by 排序的字段】;特點: 1、可以按單個字段分組 2、和分組函數一同查詢的字段必須是group by后出現的字段 3、分組篩選針對的表 位置 關鍵字 分組前篩選: 原始表 group by的前面 where 分組后篩選: 分組后的結果集 group by的后面 having4、分組可以按多個字段分組,字段之間用逗號隔開 5、可以搭配著排序 6、having后可以支持別名

    問題1:分組函數做篩選能不能放在where后面
    答:不能

    問題2:where——group by——having
    一般來講,能用分組前篩選的,盡量使用分組前篩選,提高效率

    引入:查詢每個部門的員工個數

    SELECT COUNT(*) FROM employees WHERE department_id=90;

    1.簡單的分組

    案例1:查詢每個工種的員工平均工資

    SELECT AVG(salary),job_id FROM employees GROUP BY job_id;

    案例2:查詢每個位置的部門個數

    SELECT COUNT(*),location_id FROM departments GROUP BY location_id;

    2、可以實現分組前的篩選

    案例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;

    3、分組后篩選

    案例:查詢哪個部門的員工個數>5

    #①查詢每個部門的員工個數 SELECT COUNT(*),department_id FROM employees GROUP BY department_id;#② 篩選剛才①結果SELECT COUNT(*),department_id FROM employeesGROUP BY department_idHAVING 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;

    案例3:領導編號>102的每個領導手下的最低工資大于5000的領導編號和最低工資

    manager_id>102SELECT manager_id,MIN(salary) FROM employees GROUP BY manager_id HAVING MIN(salary)>5000;

    4.添加排序

    案例:每個工種有獎金的員工的最高工資>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 ;

    5.按多個字段分組

    案例:查詢每個工種每個部門的最低工資,并按最低工資降序

    SELECT MIN(salary),job_id,department_id FROM employees GROUP BY department_id,job_id ORDER BY MIN(salary) DESC;

    6.強化練習

    1.查詢各job_id的員工工資的最大值,最小值,平均值,總和,并按job_id升序

    #1.查詢各job_id的員工工資的最大值,最小值,平均值,總和,并按job_id升序SELECT MAX(salary),MIN(salary),AVG(salary),SUM(salary),job_id FROM employees GROUP BY job_id ORDER BY job_id;

    2.查詢員工最高工資和最低工資的差距(DIFFERENCE)

    #2.查詢員工最高工資和最低工資的差距(DIFFERENCE) SELECT MAX(salary)-MIN(salary) DIFFRENCE FROM employees;

    3.查詢各個管理者手下員工的最低工資,其中最低工資不能低于6000,沒有管理者的員工不計算在內

    #3.查詢各個管理者手下員工的最低工資,其中最低工資不能低于6000,沒有管理者的員工不計算在內 SELECT MIN(salary),manager_id FROM employees WHERE manager_id IS NOT NULL GROUP BY manager_id HAVING MIN(salary)>=6000;

    4.查詢所有部門的編號,員工數量和工資平均值,并按平均工資降序

    #4.查詢所有部門的編號,員工數量和工資平均值,并按平均工資降序 SELECT department_id,COUNT(*),AVG(salary) a FROM employees GROUP BY department_id ORDER BY a DESC; #5.選擇具有各個job_id的員工人數 SELECT COUNT(*) 個數,job_id FROM employees GROUP BY job_id;

    總結

    以上是生活随笔為你收集整理的一、MySQL查询学习笔记(基础查询、条件查询、排序查询、常见函数、分组查询 详解)的全部內容,希望文章能夠幫你解決所遇到的問題。

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