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

歡迎訪問 生活随笔!

生活随笔

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

数据库

【MySQL学习】DQL语言的学习 Data Query Language

發布時間:2023/12/16 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【MySQL学习】DQL语言的学习 Data Query Language 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

DQL結構化查詢語言

  • 基礎查詢
      • 基礎查詢1:查詢常量
      • 基礎查詢2:查詢表達式運行結果
      • 基礎查詢3: 函數的返回值
      • 基礎查詢4:返回表中單個列
      • 基礎查詢5: 查詢返回多個列
      • 基礎查詢6: 查詢返回所有列
        • 練習
      • 基礎查詢7:給列起別名
  • 條件查詢
      • 條件查詢1:關系表達式
      • 條件查詢2:邏輯表達式
        • 練習
      • 條件查詢3:模糊查詢
        • 練習
  • 排序查詢
      • 排序查詢1:單個列排序
      • 排序查詢2:多個列排序
  • 常見函數
      • 常見函數1:字符函數
          • 1.1 UPPER/LOWER 轉大/小寫函數
          • 1.2 CONCAT 拼接字符串函數
          • 1.3 SUBSTR 截取子字符串
          • 1.4 LENGTH 參數字符串的字節數
          • 1.5 INSTR 檢索目標串在源串中第一次出現的索引位置
          • 1.6 LPAD/RPAD 左填充和右填充
          • 1.7 TRIM
          • 1.8 REPLACE 取代
      • 常見函數2:數學函數
          • 2.1 CEIL 向上取整
          • 2.2 FLOOR 向上取整
          • 2.3 ROUND 四舍五入
          • 2.4 RAND 取隨機數
          • 2.5 ABS 取絕對值
          • 2.6 MOD 取余數
      • 常見函數3:日期函數
          • 取系統時間
      • 常見函數4:流程控制函數
          • 4.1 判斷控制函數
          • 4.2 多重判斷(區間類型)
          • 4.3 多重判斷(等值類型)
      • 常見函數5:其他函數
  • 分組函數
      • 分組函數1:AVG() 取平均值
      • 分組函數2:SUM()求總和
      • 分組函數3:MAX() 取最大值
      • 分組函數4: MIN()取最小值
      • 分組函數5: COUNT()統計行數
      • 分組函數6:分組查詢子句 group by
  • 連接查詢
      • 連接查詢1: 內連接
        • 練習:
      • 連接查詢2: 外連接
  • 子查詢
  • 分頁查詢

基礎查詢

SELECT 開頭 查詢的內容 FROM 表或者結果集

select 查詢的結果是一個虛擬的表格,保存在客戶端的內存中,這個虛擬的結果叫做查詢結果集

基礎查詢1:查詢常量

USE myemployees; SELECT 110; #### 查詢數值型:直接寫值,不需要寫單引號或者雙引號,加上引號也可以 SELECT '110'; SELECT '管理員'; #### 查詢字符型和日期型:必須要寫單引號或者雙引號

小結:既然如此,查詢常量的時候都加上單引號

基礎查詢2:查詢表達式運行結果

SELECT 999 + 110; # 如果 + 兩端都是數值,那么就直接相加,結果集中是結果 # 如果 + 兩端有一端是字符,那么首先會將字符轉換為數值,如果轉化成功則相加,并且返回結果,如果轉化失敗,則變為 0 再加 SELECT 999 + 'abc'; # 這個例子是轉換失敗的例子 SELECT 999 + '123'; # 這個例子是轉化成功的例子 SELECT '999' + '110'; # 這個例子也是轉化成功的例子 SELECT 111 + NULL; # + 號兩端有一端是 NULL,那么返回結果就一定是 NULL:SELECT CONCAT('999','abc'); # 如果想執行兩個字符串的拼接需要使用 CONCAT() 函數。

基礎查詢3: 函數的返回值

SELECT VERSION(); # 返回當前 MySQL 數據庫的版本信息 SELECT DATABASE(); # 返回當前的數據庫的名稱

基礎查詢4:返回表中單個列

SELECT 后面是列表 FROM 后面是表名,查詢單個列就只寫一個列名 SELECT employee_id FROM employees;

基礎查詢5: 查詢返回多個列

SELECT 后面是列名(多個列名用逗號分隔) FROM 后面是表名(查詢多個列就寫多個列名 ) SELECT employee_id,first_name,last_name FROM employees;

基礎查詢6: 查詢返回所有列

SELECT 后面是所有列名(用逗號分隔) FROM 后面是表名select * FROM 后面是表名 # 查詢的時候 select 后面寫 * 代表 查詢所有的列 SELECT * FROM employees; SELECTemployee_id,first_name,last_name,email,phone_number,job_id,salary,commission_pct,manager_id,department_id FROM employees; # P.S:在Java 里面是不允許寫成用 * 取所有列的,這個是規定

練習

# 查所有員工的編號, 名字 ,和年薪 SELECTemployee_id,first_name,last_name,(salary * 12 * (1 + IFNULL(commission_pct,0))) FROM employees; /* salary 是月薪 commission_pct 是獎金系數 IFNULL(a,b) # 這個函數的作用是判斷 a 是不是NUL,如果是的化則返回 默認的 b */

P.S:IFNULL(a,b)

  • 這個函數的作用是判斷 a 是不是NUL,如果是的化則返回 默認的 b

基礎查詢7:給列起別名

兩種形式,

  • 在列的后面加上 as 關鍵字再加上列的別名
  • 列后空格加列的別名,別名可以使用單引號,也可以不使用
  • SELECT employee_id,first_name,last_name.(salary * 12 * (1 + IFNULL(commision_pct,0))) AS 'all_money' FROM employees; SELECTemployee_id,first_name,last_name,(salary * 12 * (1 + IFNULL(commission_pct,0)))AS '年薪' FROM employees; SELECTemployee_id,first_name,last_name,(salary * 12 * (1 + IFNULL(commission_pct,0))) '年 薪' FROM employees; SELECT first_name fname FROM employees; # 也可以直接給列起列名

    P.S:

    • 在列的別名中如果有特殊字符,則別名必須兩端加單引號

    條件查詢

    SELECT 列名 FROM 表名 WHERE 檢索條件

    執行帶有 where 子句的查詢語句時,逐行檢索,匹配每一行的條件,

    • 如果這一行的條件符合 where 子句的表達式,那么就會被提取出來,
    • 如果條件不符合 where 子句,則這一行被過濾掉。
      結果就是結果集中保留的都是符合 where 子句的記錄

    where 子句中可以寫那些形式:

  • 關系運算符組成的表達式
    關系運算: 等于 =,大于 >, 小于 <,大于等于 >=,小于等于 <=,不等于 <> (!= 也可以,但是不推薦使用)
  • 邏輯運算符組成的表達式
    邏輯運算符 : and, or ,not (&, | ,! 不推薦)
  • 模糊查詢
    like,between and ,in, is null ,is not null
  • 條件查詢1:關系表達式

    # 查詢所有工資大于等于 10000 的員工信息 SELECT * FROM employees WHERE salary >= 10000; # 查詢所有隸屬 IT 部門的員工信息 SELECT * FROM employees WHERE department_id = 60; # 所有 manager_id 不是 103 的員工信息 SELECT * FROM employees WHERE manager_id <> 103;

    條件查詢2:邏輯表達式

    # 所有工資在 15000 到 25000 之間的員工信息 , and與 運算符兩端的表達式必須同時滿足條件才能滿足整個條件 SELECT * FROM employees WHERE salary >= 15000 AND salary <= 25000; SELECT * FROM employees WHERE salary >= 15000 AND salary <= 25000;# 所有 manager_id 是103或者 102 的員工信息 or或 運算符兩端的表達式有一端滿足條件,整個表達式就滿足條件 SELECT * FROM employees WHERE manager_id =103 OR manager_id = 102 OR manager_id =114;

    練習

    #工資大于 15000并且部門編號是60,或者 manager_id 是102 的員工信息, and 的優先級高于 or SELECT * FROM employees WHERE manager_id = 102 OR salary > 5000 AND department_id = 60;# manager_id 不是103的所有員工的信息 SELECT * FROM employees WHERE manager_id <> 103; SELECT * FROM employees WHERE NOT(manager_id = 103); # 寫法二:用 NOT 來反轉整個的結果# 工資不在 10000到20000之間的員工信息 SELECT * FROM employees WHERE NOT(salary >= 10000 AND salary <= 20000);

    條件查詢3:模糊查詢

    like模糊查詢
    所有名字以 e 開頭的員工信息:like 關鍵字代表像什么什么的樣子,必須和通配符配合

    # %通配符代表任意長度個任意字符 SELECT * FROM employees WHERE first_name LIKE 'e%';# 所有名字有 e 的員工信息,就是這個 e 可以在開頭,中間和結尾都可以有 SELECT * FROM employees WHERE first_name LIKE '%e%';# 查詢第二個字母是 e 的員工信息:_通配符,一個長度個任意字符 SELECT * FROM employees WHERE first_name LIKE '_e%';# 查詢倒數第三個字母是 f 的員工信息 SELECT * FROM employees WHERE first_name LIKE '%f__';# 查詢第二個字母是 _的員工信息:\轉譯字符 \_ 就不是通配符了,是 _的意思 SELECT * FROM employees WHERE first_name LIKE '_\_%';# 查詢第二個字母是 _的員工信息:任意字符做轉譯字符 $_就不是通配符了,是_的意思,這里的 $ 是自己用 ESCAPE()函數定義的轉義字符,自己定義的轉義字符不推薦使用字母 SELECT * FROM employees WHERE first_name LIKE '_$_%' ESCAPE('$');

    between and模糊查詢
    between and 模糊查詢,一個數值的區間查詢,包含邊界值,必須是小數在前,大數在后

    # 查詢所有工資在 10000 到20000 之間的員工 SELECT * FROM employees WHERE salary <= 120000 AND salary >= 10000; SELECT * FROM employees WHERE salary BETWEEN 10000 AND 20000;

    in模糊查詢
    只要檢索條件匹配 in 后面任何一個條件,就會符合檢索條件
    若干值中只要匹配一個滿足條件,這個匹配的值可以是數值也可以是字符

    # manager_id 是 102、103、114 的員工信息 SELECT * FROM employees WHERE manager_id = 102 OR manager_id = 103 OR manager_id = 114; SELECT * FROM employees WHERE manager_id IN (102,103,114);

    is null和 is not null 模糊查詢

    # 查詢出所有年底有獎金的員工信息 SELECT * FROM employees WHERE commission_pct IS NOT NULL; SELECT * FROM employees WHERE commission_pct IS NOT NULL;

    練習

    # 1.查詢工資大于 12000 的員工姓名和工資 SELECT first_name,last_name,salary FROM employees WHERE salary > 12000;# 2.查詢員工號為 176 的員工的姓名、部門號和年薪 SELECT first_name,last_name,department_id,(salary * 12 * (1 + IFNULL(commission_pct,0))) AS '年薪' FROM employees WHERE employee_id = 176; SELECT first_name,last_name,department_id, (salary * 12 * (1 + IFNULL(commission_pct,0))) 年薪 FROM employees WHERE employee_id = 176;# 3.選擇工資不在 5000 到 12000的員工的姓名和工資 SELECT first_name,last_name,salary FROM employees WHERE NOT ( salary BETWEEN 5000 AND 12000); SELECT first_name,last_name,salary FROM employees WHERE salary NOT BETWEEN 5000 AND 12000;# 4.選擇在 20 或 50 號部門工作的員工姓名和部門號 SELECT first_name,last_name,department_id FROM employees WHERE department_id IN (20,50);# 5.選擇公司里面沒有管理者的員工姓名及 job_id SELECT first_name,last_name,job_id FROM employees WHERE manager_id IS NULL;# 6.選擇公司中有獎金的員工姓名,工資和獎金級別 SELECT first_name,last_name,salary,commission_pct FROM employees WHERE commission_pct IS NOT NULL;# 7.選擇員工姓名的第三個字母是 a 的員工姓名 SELECT first_name,last_name FROM employees WHERE first_name LIKE '__a%' OR last_name LIKE '__a%';# 8.選擇姓名中有字母 a ,也有 e 的員工姓名 SELECT first_name,last_name FROM employees WHERE first_name LIKE '%e%' AND first_name LIKE '%a%'; SELECT first_name,last_name FROM employees WHERE first_name LIKE '%e%a%' OR first_name LIKE '%a%e%';# 9.顯示出來 employees 表中 first_name 以 'e'結尾的員工信息 SELECT * FROM employees WHERE first_name LIKE '%e';# 10.顯示出來 employees 部門編號在 80-100之間的姓名和職位 SELECT first_name,last_name,job_id FROM employees WHERE department_id BETWEEN 80 AND 100;# 11.顯示出表 employees 的manager_id 是 100,101 ,110 的員工姓名,和職位 SELECT first_name,last_name,job_id FROM employees WHERE manager_id IN (100,101,110);

    排序查詢

    排序查詢1:單個列排序

    # 按照員工的工資升序排列,ASC 是按照列的升序排列,如果不寫默認就是 ASC SELECT * FROM employees ORDER BY salary ASC; SELECT * FROM employees ORDER BY salary;# 按照員工的工資降序排列,DESC 是按照列的降序排列 SELECT * FROM employees ORDER BY salary DESC;# 按照員工的名字降序排列,DESC 是按照Z-A的降序排列 SELECT * FROM employees ORDER BY first_name DESC;

    排序查詢2:多個列排序

    # 按照員工的工資降序排列 DESC 是降序排列,如果工資相同就按照名字的升序排列 # 按照多個列表的時候,用逗號進行分隔各排序規則,在前面的就是高排序規則,寫在后面的就是低排序規則,各排序規則單獨制定升序還是降序 SELECT * FROM employees ORDER BY salary DESC,first_name ASC;

    常見函數

    sql語句中的函數
    函數是一個有特定功能的方法和代碼塊,當調用函數的時候,這個函數或者代碼塊就運行,返回結果。
    函數有的有參數,有的沒有參數,但是都有返回值。
    單行函數:

  • 字符函數
  • 數學函數
  • 日期函數
  • 流程控制函數
  • 其他函數
  • 常見函數1:字符函數

    1.1 UPPER/LOWER 轉大/小寫函數
    # 轉大寫函數 SELECT UPPER('abc'); SELECT UPPER(first_name) FROM employees; # 轉小寫函數 SELECT LOWER('ABC'); SELECT LOWER(first_name) FROM employees;
    1.2 CONCAT 拼接字符串函數
    # 拼接字符串函數 SELECT UPPER(CONCAT('a','b','c')); SELECT CONCAT(first_name,'.',last_name) FROM employees;
    1.3 SUBSTR 截取子字符串
    # 截取子字符串 在 MySql的字符串中,索引從`1`開始,從源串截取,第二個參數位置開始一直到字符串末尾 SELECT SUBSTR('hello world',7);截取子字符串,三個參數的形式, 第一個參數源串,第二個參數從這個位置開始截取,第三個參數是截取的長度 SELECT SUBSTR('hello world',7,2); # 截取所有員工名字中的前三個字母 SELECT SUBSTR(CONCAT(first_name,last_name),1,3) FROM employees; SELECT SUBSTR(first_name,1,3) FROM employees;
    1.4 LENGTH 參數字符串的字節數
    # 獲取字符串的字節數,如果是英文字母,一個字母一個字節,如果是中文,一個漢字三個字節 SELECT LENGTH('ABC'); SELECT LENGTH('你好啊');
    1.5 INSTR 檢索目標串在源串中第一次出現的索引位置
    # 獲取目標串在源串中出現的第一次索引,返回 0 代表沒有找到目標串 SELECT INSTR('one world one dream','one'); SELECT INSTR('a step forward, a civilization forward','cuikai');
    1.6 LPAD/RPAD 左填充和右填充
    # LPAD 和 RPAD 左填充和右填充,源串加上填充串的長度是給出的第二個參數 SELECT LPAD('崔凱',10,'*'); # 使用填充串將源串從左側開始填滿長度,這個長度是字符數 SELECT RPAD('李瑞涵',10,'*');# 使用填充串將源串從右側開始填滿長度,這個長度是字符數
    1.7 TRIM
    # 去掉兩端的空格,不能去掉中間的空格 SELECT TRIM(' 張學友 '); SELECT LENGTH(TRIM(' 張學友 '));
    1.8 REPLACE 取代
    # 從源串中用新串替換所有要被取代的串,有幾個替換幾個 SELECT REPLACE('我不認識蔡徐坤','蔡徐坤','劉德華');

    常見函數2:數學函數

    2.1 CEIL 向上取整

    ceil<— 天花板

    SELECT CEIL(-2.6); # 選擇的是大于參數的最小整數 SELECT CEIL(9.3);
    2.2 FLOOR 向上取整

    floor<-- 地板

    SELECT FLOOR(3.15); # 小于參數的最小整數
    2.3 ROUND 四舍五入
    SELECT ROUND(-3,15); SELECT ROUND(3.75);
    2.4 RAND 取隨機數
    SELECT RAND(); # 取 0-1之間的浮點數
    2.5 ABS 取絕對值
    SELECT ABS(-3);
    2.6 MOD 取余數
    SELECT MOD(9,2); # 相當于 9 除以 2

    常見函數3:日期函數

    取系統時間
    SELECT NOW(); # 取系統時間,包括年月日時分秒SELECT CURTIME(); # 取系統時間,只有時分秒SELECT CURDATE(); # 取系統時間,只有年月日

    常見函數4:流程控制函數

    4.1 判斷控制函數

    IF 函數有三個參數,
    第一個參數是條件表達式,表達式返回True,則顯示第二個參數,表達式返回 False,則顯示第三個參數

    SELECT IF(10 = 9,'one','two');
    4.2 多重判斷(區間類型)

    相當于 if-else

    select * case when 條件表達式1 then 表達式1 when 條件表達式2 then 表達式2 ...... else 表達式 n end from xxxx; SELECT first_name,last_name , CASE WHEN salary > 2000 AND salary < 4000 THEN salary * 1.1 WHEN salary >= 4000 AND salary < 8000 THEN salary * 1.2 ELSE salary * 2.5 END '工資' FROM employees;


    P.S: 注意上圖框出來的 ,

    4.3 多重判斷(等值類型)

    相當于 switch-case

    select * case when 等值判斷 then 表達式 when 等值判斷 then 表達式 .... else 表達式n end from xxx; SELECT first_name,last_name , CASE WHEN job_id = 'AD_PRES' THEN salary * 1.1 WHEN job_id = 'AD_VP' THEN salary * 1.5 ELSE salary * 2.0 END '工資' FROM employees;

    常見函數5:其他函數

    SELECT IFNULL('hello','ok'); SELECT IFNULL(NULL,'cuikai');

    分組函數

    分組函數只能返回一行記錄,不要將分組函數和普通列放在一起查,除非這個列就是分組列

    分組函數1:AVG() 取平均值

    # AVG()取平均值的函數 # 查看所有員工的平均工資 SELECT AVG(salary) FROM employees;

    分組函數2:SUM()求總和

    # 查看所有員工的工資和 SELECT SUM(salary) FROM employees;

    分組函數3:MAX() 取最大值

    # 查看工資最高是多少 SELECT MAX(salary) FROM employees;

    分組函數4: MIN()取最小值

    # 查看工資最低的是多少 SELECT MIN(salary) FROM employees;

    分組函數5: COUNT()統計行數

    # 員工信息表中有多少名員工的工資是超過 1000 SELECT COUNT(*) FROM employees WHERE salary > 10000; # 因為這里是統計行數,也就是說任意一行都可以,但是防止隨機選擇的行中有 NULL,就在這里選擇安全的 *

    分組函數6:分組查詢子句 group by

    # 查詢 IT 崗位所有員工的工資 SELECT AVG(salary) FROM employees WHERE job_id = 'IT_PROG';# 查詢所有崗位的員工的平均工資 # group by 后面的列就是分組列,列值相等的數據會被分到一組中 # 分組函數在沒有分組之前是對所全表數據進行檢索,一旦分組,就會按照各個組分別解鎖的方法運算 SELECT job_id, AVG (salary) FROM employees GROUP BY job_id;

    # 查詢每個崗位的員工平均工資大于 5000 # where 是過濾分組前的原表數據 # having 是過濾分組后的組 SELECT job_id, AVG(salary),COUNT(*) FROM employees GROUP BY job_id HAVING AVG(salary) > 5000; SELECT job_id, AVG(salary),COUNT(*) FROM employees GROUP BY job_id HAVING AVG(salary) > 5000;

    P.S:
    where 是過濾分組前的原表數據
    having 是過濾分組后的組

    連接查詢

    多表連接查詢,當需要的數據來自于多張表的時候需要多表連接,內連接和外連接
    本文檔演示的是內連接

    連接查詢1: 內連接

    SQL92 版本

    # 1、等值連接 # 兩表相連必須具備以下幾個條件: 1.倆個表各自擁有 一個列,這倆個列的含義一樣 2.內連接必須要求兩張表中都有匹配記錄才能連接返回,如果一張表中有匹配另一張表沒有則不能返回SELECTemployees.first_name,employees.last_name,employees.job_id,jobs.job_title FROM employees,jobs WHERE employees.job_id = jobs.job_id;# 內連接查詢的規范方式就是表起別名,表名點列名,列起別名 SELECT e.first_name fna ,e.last_name lna ,e.job_id jid ,j.job_title jti FROM employees e ,jobs j WHERE e.job_id = j.job_id;# 可以再加一個條件查詢一下 salary > 10000 SELECT e.first_name fna,e.last_name lna,e.job_id jid,j.job_title jti FROM employees e, jobs j WHERE e.job_id = j.job_id AND e.salary > 10000; # 2、非等值連接,非等值連接就是不需要各自擁有一個含義相同的列,可以讓一個表的列在另一個表的某個區間里。 SELECT e.first_name ,e.job_id,e.salary,j.grade FROM employees e,job_grades j WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal; # 3、自連接 ---> 一張表做出兩張表的效果# 查詢員工名和他的主管id及主管名稱 SELECT e.first_name ename,e.manager_id managerid,m.first_name managername FROM employees e,employees m WHERE e.manager_id = m.employee_id;

    SQL99 版本

    # 1、等值連接 # 使用 inner_join 實現內連接 # 表a (inner) join表b on 連接條件 SELECT e.first_name,e.last_name,j.job_title FROM employees e INNER JOIN jobs j ON e.job_id = j.job_id;# 要是在這里需要再加一條可以加上 where SELECT e.first_name,e.last_name,j.job_title FROM employees e INNER JOIN jobs j ON e.job_id = j.job_id WHERE e.salary > 10000; # 2、非等值連接 SELECT e.first_name,e.job_id,e.salary,j.grade FROM employees e INNER JOIN job_grades j ON e.salary BETWEEN j.lowest_sal AND j.highest_sal; # 3、自連接 SELECT e.first_name ename ,e.manager_id managerid,m.first_name managername FROM employees e INNER JOIN employees m ON e.manager_id = m.employee_id;

    練習:

    # 查出員工的名字,崗位編號、部門編號和部門名 select e.first_name,e.job_id, e.department_id,d.department_name from employees e, departments d where e.department_id = d.department_id;select e.first_name,e.job_id,e.department_id,d.department_name from employees e inner join departments d on e.department_id = d.department_id; # 查出員工的名字,崗位編號,部門編號、部門名稱和部門經理的編號 select e.first_name,e.job_id,e.department_id,d.department_name, d.manager_id from employees e,departments d where e.department_id = d.department_id;select e.first_name,e.job_id,e.department_id,d.department_name,d.manager_id from employees e inner join departments d on e.department_id = d.department_id; # 查出員工的名字,崗位名稱,部門名稱 select e.first_name,j.job_title,d.department_name from employees e,jobs j,departments d where e.department_id = d.department_id and e.job_id = j.job_id;select e.first_name,j.job_title,d.department_name from jobs j inner join employees e on j.job_id = e.job_id inner join departments d on e.department_id = d.department_id;select e.first_name,j.job_title,d.department_name from jobs j inner join employees e on j.job_id = e.job_id inner join departments d on e.department_id = d.department_id;

    連接查詢2: 外連接

    外連接分為:左外連,右外連,全外連

    # 左外連接 # 看看那些部門有那些員工,那些部門沒有員工 # 左外連接首先返回左表全部記錄,然后使用連接條件匹配右表,有匹配的就返回,無匹配的就返回NULL SELECT e.first_name,d.department_name FROM departments d LEFT JOIN employees e ON e.department_id = d.department_id;

    子查詢

    一個查詢語句的數據源是另一個查詢語句的查詢結果集。

    #查看所有沒有員工的部門名稱 #第一步使用左外連接查詢出所有部門并連接員工表找到沒有員工的部門 SELECT e.first_name,d.department_name FROM departments d LEFT JOIN employees e ON e.department_id = d.department_id;#第二步,找到所有first_name is null的部門 SELECT tableone.department_id,tableone.department_name FROM(SELECT e.first_name,d.department_name,d.department_idFROM departments d LEFT JOIN employees eON e.department_id = d.department_id) AS tableone WHERE tableone.first_name IS NULL; #查詢出所有工資比 Adam 高的員工信息 # 1.找出 Adam 員工的工資 SELECT salary FROM employees WHERE first_name = 'Adam'; # 2.找到所有比 Adam 員工工資高的員工 SELECT first_name,salary FROM employees WHERE salary > (SELECT salary FROM employees WHERE first_name = 'Adam');

    分頁查詢

    LIMIT 關鍵字后面需要跟兩個參數,第一個參數是開始顯示的索引位置

    # 一共有50條符合條件的記錄,一頁10條,想看第三頁 # 第一頁 1- 10,第二頁 11- 20,第三頁 21-30,。。。 SELECT * FROM employees; SELECT COUNT(*) FROM employees;# LIMIT 關鍵字后面需要跟兩個參數,第一個參數是開始顯示索引位置,這個索引是從 0 開始 第二個參數是顯示多少條 SELECT * FROM employees LIMIT 20,10;# LIMIT 關鍵字后面需要跟兩個參數,第一個參數是開始顯示的索引位置# 第一頁應該是顯示從第一條到第十條的記錄,但是由于 LIMIT的索引從 0 開始,所以代碼如下 SELECT * FROM employees LIMIT 0,10;# 第二頁應該是顯示從十一條到第二十條的記錄 SELECT * FROM employees LIMIT 10,10;# 第三頁應該是顯示從第二十一條到第三十條的記錄; SELECT * FROM employees LIMIT 20,10;

    做分頁的時候:
    1.頁面尺寸(一頁顯示多少條記錄):pageSize
    2.當前頁碼 currPage
    3.總記錄數(符合檢索條件的所有數據) totalCount
    計算:pageCount = totalCount / pageSize IF totalCount/pageSiZe == 0 ELSE INT(totalCount /PageSize) + 1
    計算:本頁第一條記錄的索引 INDEX = (currPage - 1) * pageSize
    下面這個題目中:
    pageSize = 8
    totalCount = 40
    currPage = 2
    ===>第二頁的第一條記錄的索引為: (2- 1) * 8 = 8,sql語句如下:

    # 一共有 40條匹配條件的記錄,一頁顯示8條,想看第二頁 SELECT * FROM employees LIMIT 8,10;

    總結

    以上是生活随笔為你收集整理的【MySQL学习】DQL语言的学习 Data Query Language的全部內容,希望文章能夠幫你解決所遇到的問題。

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