MySQL學習筆記超級詳細 從0開始

@

MySQL學習筆記

Linux下安裝MySQL:Linux安裝mysql阿里雲下安裝MySQL
配套數據庫創建語句見:數據庫創建sql語句

安裝步驟

  1. 確保服務器系統處於最新狀態:yum -y update

  2. 重啓服務器:或者yum makecache

  3. 首先檢查是否已經安裝,如果已經安裝先刪除以前版本,以免安裝不成功

    yum list installed | grep mysql

  4. 下載MySql安裝包:

    第一種;rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rp 直接下載安裝

    第二種:找到mysql yum包下載地址:https://dev.mysql.com/downloads/repo/yum/

    選擇對應版本得Linux ---> download 右鍵複製下圖得連接地址在這裏插入圖片描述

    weget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm,下載rmp包後經行rmp -ivh 包名 安裝

  5. 安裝完後運行:yum makecache

  6. yun -y install mysql-community-server

  7. 安裝完成後使用:systemctl start mysqld 啓動mysql。然後使用grep “password” | grep /var/log/mysql.log來獲取初始密碼。

  8. mysql -u root -p 密碼

  9. SET PASSWORD = PASSWORD('Abc123!_');修改當前用戶密碼,出於保護密碼太簡單會有如下錯誤
    在這裏插入圖片描述
    set global validate_password_policy=LOW;設置安全等級

    set global validate_password_length=6;設置密碼長度

  10. 添加一個root用戶,允許任意Ip訪問'%'

    GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY '你的密碼不能太簡單' WITH GRANT OPTION;

    最後刷新權限flush privileges;

    OK完成!

  11. 最後要去服務器控制檯安全組開啓mysql端口,不然遠程連不到。

***可能會用到得指令***

檢查並且顯示Apache相關安裝包
[root@localhost ~]# rpm -qa | grep mysql

# 刪除MySql
[root@localhost ~]# yum remove -y mysql mysql mysql-server mysql-libs compat-mysql51

[root@localhost ~]# rpm -e mysql-community-libs-5.7.20-1.el7.x86_64 --nodeps

[root@localhost ~]# yum -y remove mysql-community-libs-5.7.20-1.el7.x86_64

# 查看MySql相關文件
[root@localhost ~]# find / -name mysql

# 重啓MySql服務
[root@localhost ~]# service mysqld restart

# 查看MySql版本
[root@localhost ~]# yum repolist all | grep mysql

# 查看當前的啓動的 MySQL 版本
[root@localhost ~]# yum repolist enabled | grep mysql

# 通過Yum來安裝MySQL,會自動處理MySQL與其他組件的依賴關係
[root@localhost ~]# yum install mysql-community-server

# 查看MySQL安裝目錄
[root@localhost ~]# whereis mysql

# 啓動MySQL服務
[root@localhost ~]# systemctl start mysqld

# 查看MySQL服務狀態
[root@localhost ~]# systemctl status mysqld

# 關閉MySQL服務
[root@localhost ~]# systemctl stop mysqld

# 測試MySQL是否安裝成功
[root@localhost ~]# mysql

# 查看MySql默認密碼
[root@localhost ~]# grep 'temporary password' /var/log/mysqld.log

# 查看所有數據庫
mysql>show databases;

# 退出登錄數據庫
mysql>exit;

# 查看所有數據庫用戶
mysql>SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user

數據庫卸載

  1. 通過軟件管家或者自帶得卸載
  2. 刪除安裝目錄下得文件
  3. C盤刪除Appdata下得mysql文件夾

數據庫的概念

  • DB:數據庫(database)存儲一系列有組織的數據
  • DBMS:數據庫管理系統(database management system),數據庫通過DBMS創建操作的容器。
  • SQL:結構化查詢語言(Structure Query Language):專門用來與數據庫通信的語言。

數據庫特點

  • 將數據放在表裏,數據表在放入數據庫
  • 一個數據庫有多個表,每個表都有一個名字標識,同一數據庫中表名唯一
  • 表由列組成,每個列名也就是字段。
  • 表中的數據是按行存儲

MySQL配置文件

my.ini

  • port=3306:端口
  • datadir=“c:/”:數據庫文件保存位置
  • charater-ser-server=utf8:數據庫字符編碼
  • default-storage-engine=INNODB:默認數據引擎
  • sql-mode=“”:語法模式
  • max_connections=100:數據庫最大鏈接數

改完配置文件後數據庫服務需要重啓!!!

MySQL服務啓動與停止

  • 打開服務:找到MySQLXXX啓動和關閉。
  • 命令行方式:以管理員身份打開命令行:net start/stop mysqlXXX(windows下)

MySQL登錄與退出

命令行完整命令

mysql [-h locahost(地址) -P 3306(端口號)] -u root -p

MySQL常見命令

基礎庫介紹:

information_schema:保存源數據信息

performance_schema:保存性能信息

test:空的

  1. show database :查看數據庫
  2. use 庫名 :使用數據庫
  3. show table:查看數據庫裏面的數據表
  4. desc tablename:查看數據表結構
  5. select database():查看所在數據庫
  6. select version():查看數據庫版本 命令行mysql --version
  7. 查看數據庫使用的字符集:show variables like '%char%'

MySQL語法規範

  1. 不區分大小寫,但建議關鍵字大寫,表名、列名小寫

  2. 每條命令最好用分號結尾“;”(\g)

  3. 每條命令根據需要、可以進行縮進或換行,建議關鍵字一行

  4. 註釋

    單行註釋:#註釋文字 或者 -- (空格)註釋文字

    多行註釋:/*註釋文字*/

SQL語言

  • DQL(Data Query Languge):數據查詢語言

    select、

  • DML(Data Manipulation Languge):數據操作語言

    增刪改

  • DDL(Data Define Languge):數據定義語言

    創建修改庫表

  • TCL(Transaction Control Language):事務控制語言

  • DCL(Data Control Language):數據控制語言

DQL(數據查詢語言)

練習對應練習數據庫

基礎查詢語言

語法:select 查詢列表 from 表名;

特點:

  1. 查詢列表可以是表中字段、常量值、表達式、函數
  2. 查詢結果是一個虛擬得表格(臨時表格)

注意:

  1. 查詢操作之前,需要使用對應的庫:use 庫名
  2. 查詢的字段如果與關鍵字重名,需要用 ` 標明:select `name` from employees
  1. 查詢表中的單個字段

    SELECT last_name FROM employees
    
  2. 查詢多個字段

    SELECT last_name,salary FROM employees
    
  3. 查詢全部

    SELECT * FROM employees
    
  4. 查詢常量值

    SELECT 100;
    SELECT 'john';
    
  5. 查詢表達式、函數

    SELECT 100+20;-- 表達式 --
    SELECT count();-- 函數 --
    
  6. 去重

    select department_id from employees
    
    -- 增加 distinct關鍵字可以去除重複的值 --
    
    select distinct department_id from employees
    
  7. +號作用

    #查詢員工的姓和名組成一個字段,並顯示爲姓名
    select last_name+first_name 姓名 from employees#失敗的操作
    /*mysql中 + 號作用只有一個功能:運算符
    1、若加號兩邊都爲數值,做加法運算
    2、若有字符值,則試圖將字符值轉換爲數值,若成功做加法運算,若失敗字符值設爲0做加法運算。
    3、只要其中一方爲null結果肯定爲null
    */
    
  8. concat連接

    -- concat()可以連接多個值。
    select concat(last_name,'~',first_name) 姓名 from employees
    -- concat()中如果有的字段值爲null,則最終顯示爲null,需要用到下面的ifnull()來判斷 --
    select concat(last_name,first_name,commission_pct) OUT_POT from employees
    select concat(last_name,first_name,ifnull(commission_pct,'0')) OUT_POT from employees
    
    
  9. ifnull判斷字段是否爲空

    select ifnull(commission_pct,'0') as 績點 from employees
    

爲字段起別名

好處:便於理解,方便展示;在字段有重名的情況下可以區分

如果別名有關鍵字可以打雙引號

  1. 在字段名後加 as 別名

    SELECT last_name as 姓,salary as 薪水 FROM employees
    
  2. 直接使用空格

    SELECT last_name 姓,salary 薪水 FROM employees
    

條件查詢

語法:

select 查詢列表 from 表名 where 篩選條件

分類:

  1. 按條件表達式篩選

    條件運算符:> < = !=(<>) >= <=

  2. 按邏輯表達式篩選

    邏輯運算符(用於連接表達式):&& || ! AND OR NOT

  3. 模糊查詢

    like

    between 值 and 值

    in(記錄集)“in 後面是記錄集”

    is null

  1. 條件表達式查詢

    -- 查詢工資大於12000的員工信息
    select * from employees where salary > 12000
    
  2. 按邏輯表達式篩選

    -- 查詢工資在10000到20000之間的員工名、工資以及獎金 --
    select first_name 員工名, salary 工資, commission_pct 獎金 from employees where salary > 10000 and salary <20000; 
    -- 查詢工資不在10000到20000之間的員工名、工資以及獎金 --
    select first_name 員工名, salary 工資, commission_pct 獎金 from employees where salary <10000 OR salary>20000;
    select first_name 員工名, salary 工資, commission_pct 獎金 from employees where salary not between 10000 and 20000;
    
  3. like 模糊查詢

    %:任意多個字符

    _:任意單個字符

\ :轉義字符

自定義轉義字符:定義$ 爲轉義字符——escape '$';

無法匹配null值

-- 查詢員工姓名包含a的員工信息 --
select * from employees where last_name like '%a%';
-- 查詢員工姓名第二個字符爲_的信息,
select * from employees where last_name like '_\_%';
select * from employees where last_name like '_$_%' escape '$';#自定義轉義字符
  1. in 關鍵字

    字符類型要加單引號

    -- 查詢員工工種編號是IT_PROG、AD_VP、AD_PRES --
    select * from employees where job_id in ('IT_PROG','AD_VP','AD_PRES');
    
  2. is null和is not null

    =或<> 不能判斷null值

    is 不能用於判斷具體值,只能和null搭配。

    -- 查詢有獎金的員工和獎金率 --
    select last_name, commission_pct from employees where commission_pct is not null;
    -- 查詢沒有獎金的員工和獎金率 --
    select last_name, commission_pct from employees where commission_pct is  null;
    
  3. 安全等於 <=>(可以判斷null和具體值)

    -- 查詢沒有獎金的員工和獎金率 --
    select last_name, commission_pct from employees where commission_pct <=> null;
    -- 查詢工資等於12000的員工信息 --
    select * from employees where salary <=> 12000;
    
  4. 排序查詢

    order by 排序列 asc|desc:asc 從低到高;desc從高到低

    多級排序:order by 優先排序列 asc|desc,次要排序列 asc|desc;

    order by 子句一般是放在查詢語句的最後面,limit子句除外

    -- 按年薪從高到低顯示員工的信息和年薪 【按表達式排序】--
    select * ,salary*12*(1+ifnull(commission_pct,0)) 年薪 from employees order by salary*12*(1+ifnull(commission_pct,0)) desc;
    -- 按年薪從高到低顯示員工的信息和年薪 【按別名排序】--
    select * ,salary*12*(1+ifnull(commission_pct,0)) 年薪 from employees order by 年薪 desc;
    -- 先按員工工資升序排列和再按員工編號降序排序 --
    select * from employees order by salary asc,employee_id desc;
    
  5. 分組查詢 常和分組函數搭配使用詳情見分組函數

    group by 要分組的列: 分組函數,根據分組列的不同值進行分組

    group by 要在where之後,order by之前

    #將員工按照部門進行分組
    SELECT department_id FROM employees GROUP BY department_id;
    

常見函數

將一組邏輯語句封裝在方法體中,對外暴露方法名

格式:select 函數(實參列表 ) from 表

分類:

  1. 單行函數;

    concat、length、ifnull等

  2. 分組函數 做統計使用、又稱統計函數、聚合函數、組函數

單行函數

  1. 字符函數

    1. length獲取參數值的字節個數,utf8中文佔兩個英文佔一個字節

      select length('十分士hhhh')#10

    2. CHAR_LENGTH獲取參數值的字符個數

      select CHAR_LENGTH('十分士hhhh');#7

    3. concat()拼接字符串

    4. upper()轉大寫、lower()轉小寫

    5. substr、substring切割函數

      #SQL中字符索引從1開始
      #截取從指定索引處開始後面所有字符
      SELECT SUBSTR('123456789',6);#6789
      #截取從指定索引處指定字符長度的字符
      SELECT SUBSTR('123456789',1,3);#123
      
    6. instr查找子串索引

      #返回第一個字串的索引,沒有就返回0
      SELECT INSTR('123456789','6789')#6
      
    7. trim 去掉字符串XXX

      #去掉字符串前後空格
      SELECT TRIM('           jdf       ');#jdf
      #去掉字符串前後的指定值
      SELECT TRIM('a' FROM 'aaaaajdkaaaajffaaaaa');#jdkaaaajff
      
    8. lpad、rpad

      #返回指定長度的字符串,長度不夠用指定值左填充,長度超出則剪取指定長度。
      #這裏的長度指的是字符索引長度,不是lenght的子節長度。
      SELECT LPAD('博傲天',8,'*');#*****博傲天
      SELECT length(LPAD('博傲天',8,'*'));#14
      #RPAD就是右填充
      
    9. replace替換

      #替換,講源字符串的所有要替換的值替換爲新值
      SELECT REPLACE('aaabcd','a','A');#AAAbcd
      
  2. 數學函數

    1. round 四捨五入

      select round(1.16)#2
      select round(1.567,2)#1.57小數點後保留2位
      
    2. ceil 向上取整返回大於等於該參數的最小整數

      select ceil(1.02);#2
      select ceil(-9.99)#-9
      
    3. floor 向下取整,返回小於等於該參數的最大整數

      select floor(1.02);#1
      select floor(-9.99)#-10
      
    4. truncate截斷

      select truncate(1.69999,2);#1.69,保留小數點後2位
      
    5. mod取餘 與%差不多

      mode(a,b): a-a/b*b
      select mod(10,3);#1
      select mod(2,3);#2
      
  3. 日期函數

    #1、now()返回當前系統日期和時間
    select now();#2020-04-08 15:16:18
    #2、curdate 返回當前系統日期,不包含時間
    select curdate();#2020-04-08
    #3、curtime 返回當前時間,不包含日期
    select curtime();#15:18:48
    #4、獲取指定的時間部分
    select year(now()) 年;#2020
    select month(now()) 月;#4
    select monthname(now()) 月英文名;#April
    select day(now()) 日;#8
    select MINUTE(now()) 分鐘;#26
    select SECOND(now()) 秒;
    #5、datediff(日期,日期)前面日期減去後面日期返回天數
    select datediff(now(),'2020-1-24')#77      (2020/4/10)
    
    1. 日期轉換

      1. str_to_date:字符串通過指定格式轉換成日期格式

        select str_to_date('1999-8-23','%Y-%m-%d');#1999-08-23
        select str_to_date('8-23 1999','%m-%d %Y');#1999-08-23
        
      2. data_format:將日期轉換爲字符串

        select date_format(now(),'%y年%m月%d日');#20年04月08日
        #查詢有獎金的員工名和入職日期(格式月/日 年)
        select last_name , DATE_FORMAT(hiredate,'%m月%d日 %Y年') 入職時間 from employees where commission_pct is not null; 
        

    在這裏插入圖片描述

  4. 其他函數

    SELECT VERSION();#查看 版本
    select database();#查看數據庫
    select user();#查看用戶
    
  5. 流程控制函數

    #if函數:if else的效果
    select if(條件,是返回值,否返回值);
    select if(10<5,'是','否')#是
    
    #case函數:
    #####################使用一:類似於switch case,方便使用等值判斷#######
    #case要判斷的字段或表達式 
    #when 常量1 then 要顯示的值1或語句;
    #when 常量2 then 要顯示的值2或語句;
    #else 要顯示的值n或語句;
    #end
    ###################################如果when返回的是值的話就不需要用;
    /*案例: 查詢員工的工資,要求
    部門號=30,顯示的工資爲1.1倍
    部門號=40,顯示的工資爲1.2倍
    部門號=50,顯示的工資爲1.3倍
    其他部門,顯示的工資爲原工資*/
    SELECT department_id 部門編號,salary 原始工資,
    CASE IFNULL(department_id,0)
    	WHEN 30 THEN salary*1.1
    	WHEN 40 THEN salary*1.2
    	WHEN 50 THEN salary*1.3
    	ELSE
    		salary
    END as 實際工資
    FROM employees order by 實際工資 asc;
    #####################使用二:類似於多重if,方便區間判#################
    #case
    #when 常量1 then 要顯示的值1或語句;
    #when 常量2 then 要顯示的值2或語句;
    #else 要顯示的值n或語句;
    #end
    /*案例:查詢員工的工資的情況
    如果工資>20000,顯示A級別
    如果工資>15000,顯示B級別
    如果工資>10000,顯示c級別
    否則,顯示D級別*/
    SELECT department_id 部門編號,salary 原始工資,
    CASE 
    	WHEN salary>20000 THEN 'A'
    	WHEN salary>15000 THEN 'B'
    	WHEN salary>10000 THEN 'C'
    	ELSE
    		'D'
    END as 薪水等級
    FROM employees order by 薪水等級 asc;
    

    感悟通過case方法二的使用,abc可以分開顯示,推測,selec也是一行一行輸出的

分組函數

  1. 功能:用作統計使用、又稱爲聚合函數或者統計函數或組函數

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

  3. 與單行函數區別是:只得到一個值,而單行函數是每一行都會有值

  4. 參數支持類型

    sum、avg:只支持值類型

    max、min:支持可比較的所有類型

    count:計算不爲null的個數,支持所有類型

    以上分組函數都忽略null值

  5. 可以和distinct搭配使用

  1. count函數詳細介紹

    #統計單個列非null個數
    select count(salary) FROM employees;
    #統計表的行數
    select count(*) FROM employees;#一行中只要有非null的就計數
    select count(1) FROM employees;#1是新加了一列全是1,統計1的個數。等於還是統計行數。
    
  2. 使用分組函數查詢要講究一一對應,不能一對多

    和分組函數一起查詢的字段要求是group by 後的字段

  3. 分組查詢

    語法:

    select 分組函數,列(必須是出現在group by後面)

    from 表

    [where 篩選條件]

    group by 分組的列表或函數

    [order by 子句]

    特點 :分組查詢中篩選分爲兩類

    1、分組前篩選 原始表中的條件 where 放在group by前

    2、分組後篩選 分組後的結果集 having 放在group by後

    3、分組函數做條件的肯定放在having子句中

    4、能進行分組前篩選的就儘量使用分組前篩選。

    #查詢每個部門的平均工資
    SELECT AVG(salary),department_id FROM employees GROUP BY department_id;
    #查詢每個工種的最高工資,然後按工資從大到小排序
    SELECT MAX(salary) 最高工資, job_id 工種 FROM employees GROUP BY job_id ORDER BY 最高工資 DESC;
    
    -- 按多個字段分組,將要分組的多個字段都放在group by子句即可,他就會把多個字段當成一個組來分,類似於兩個字段組成一個唯一主鍵 --
    #查詢每個部門每個工種的員工的平均工資
    select avg(salary),department_id,job_id
    from employees
    group by department_id,job_id;
    
  4. having 進行復雜分組查詢,位置放在group by 後面

    oracle可能不支持having後面放別名

    -- 複雜分組查詢 --
    /*
    查詢那個部門的員工個數大於2
    分開查詢,根據分組查詢過後的結果集篩選
    1、將員工按部門分組,使用count進行計算
    2、在1的基礎上進行篩選
    */
    select count(*),department_id 
    from employees 
    group by department_id 
    having count(*)>2;
    
    #查詢每個工種有獎金的員工的最高工資>12000的工種編號和最高工資。
    SELECT MAX(salary) 最高工資,job_id 工種編號 
    FROM employees 
    WHERE commission_pct is not NULL 
    GROUP BY job_id 
    HAVING 最高工資>12000;
    
    -- 練習--
    
    #查詢員工最高工資和最低工資的差距
    select MAX(salary)-MIN(salary) 差距
    from employees;
    
    #查詢各個管理者手下員工的最低工資,其中最低工資不能低於6000,沒有管理者的員工不計算在內
    SELECT min(salary) 最低工資,manager_id 
    FROM employees 
    WHERE manager_id is not NULL 
    GROUP BY manager_id 
    HAVING 最低工資>=6000;
    
    #查詢所有部門的編號,員工數量和工資平均值(保留2位小數),並按平均工資降序
    SELECT ROUND(AVG(salary),2) 平均工資,COUNT(*) 人數,department_id 部門編號 
    FROM employees 
    GROUP BY department_id 
    ORDER BY 平均工資 desc;
    
    #選擇具有各個job_ id的員工人數
    SELECT count(*) 人數,job_id 工種
    FROM employees
    WHERE job_id is not NULL
    GROUP BY job_id;
    

連接查詢

笛卡爾乘積(沒有添加任何字段就完全連接)

表1m行,表2n行,結果m*n行。

如何避免:要添加連接條件進行匹配。

分類:

  1. 按年代分類:sql92標準——僅僅支持內連接;sql99標準——支持內連接+外連接(左外、右外)+交叉連接。僅討論在mysql中
  2. 按功能分:
    1. 內連接:
      • 等值連接
      • 非等值連接
      • 自連接
    2. 外連接
      • 左外連接
      • 右外連接
      • 全連接
    3. 交叉連接
-- 一、sql92標準 --
#【1】等職連接
/*
1、多表連接結果爲所有表的交集
2、n表連接,至少需要n-1個連接條件
3、from子句的多表的順序沒有要求
4、一般需要起別名
5、可以搭配前面介紹的所有子句使用,比如排序、分組、篩選
*/
#查詢每個女生的男朋友名(通過id關聯)
SELECT name 女生姓名,boyName 男生姓名 FROM boys,beauty WHERE beauty.id = boys.id;
#查詢員工姓名、工種號、工種名
#錯誤示範、報錯:Column 'job_id' in field list is ambiguous,job_id有歧義需要指定是哪個表中的job_id
SELECT last_name 姓名,job_id 工種號,job_title 工種名 FROM employees,jobs WHERE employees.job_id = jobs.job_id;
#正確示範
SELECT last_name 姓名,employees.job_id 工種號,job_title 工種名 FROM employees,jobs WHERE employees.job_id = jobs.job_id;
#也可以爲表起別名,方便使用提高簡潔度,跟字段別名類似
#如果起了別名就無法使用原來名字
SELECT last_name 姓名,e.job_id 工種號,job_title 工種名 FROM employees e,jobs j WHERE e.job_id = j.job_id;
#-----------------------可以添加篩選條件
#查詢有獎金的員工名、部門名
SELECT last_name 員工名,department_name 部門名 FROM employees e, departments d WHERE e.department_id = d.department_id AND e.commission_pct IS NOT NULL;
#查詢有獎金的每個部門的部門名和部門的領導編號和該部門的最低工資
SELECT d.department_name 部門名, d.manager_id 領導編號, MIN(salary) 最低工資 FROM employees e,departments d 
WHERE e.department_id = d.department_id AND commission_pct IS NOT NULL 
GROUP BY 領導編號,部門名;#group by子句必須包含select子句的字段除非你非常確認group by 子句與select結果一一對應。
#-----------------------可以添加排序,和having
#查詢每個工種的工種名和員工的個數並且員工數大於3,按員工個數降序
SELECT job_title 工種名, COUNT(*) 個數 
FROM employees e , jobs j 
WHERE e.job_id = j.job_id 
GROUP BY 工種名 HAVING 個數>3 
ORDER BY 個數 DESC;
#-----------------------三表連接
#查詢員工名、部門名和所在的城市
SELECT last_name 員工名, department_name 部門名, city 所在城市 
FROM employees e,departments d,locations l 
WHERE e.department_id = d.department_id AND d.location_id = l.location_id;#其餘添加篩選、分組、排序與兩表連接一樣。

#【2】非等值連接 (不是等於號連接的查詢條件)
#查詢員工的工資和工資級別
SELECT salary 員工工資, grade_level 工資級別 
FROM employees e,job_grades j 
WHERE salary>=j.lowest_sal AND salary<j.highest_sal;

#【3】自連接  (類似於等值連接,不過是自己連接自己)
/*
1、滿足條件,一個表裏有可以連接的字段
2、連接條件,連接字段的順序不同結果也不同,連接前要弄明白連接邏輯
*/
#查看員工的姓名和他的領導名
SELECT e1.employee_id 員工編號, e1.last_name 員工名, e2.employee_id 領導編號, e2.last_name 領導名 
FROM employees e1,employees e2 
WHERE e1.manager_id = e2.employee_id;#注意:要搞清楚連接條件的意義,是從e1的“員工表”裏面的manager_id去對於“領導表”的employee_id,若寫反結果也是反的。

總結

使用等值查詢,要先連接所需要信息的表,然後再使用篩選條件或分組

練習&測試

在這裏插入圖片描述

/*1*/
select concat(last_name,first_name) 姓名, department_id 部門編號, salary*12*(1+IFNULL(commission_pct,0)) 年薪 from employees order by 年薪 desc, 姓名 asc; 
/*2*/
SELECT concat(last_name,first_name) 姓名, salary 工資 FROM employees WHERE salary not BETWEEN 8000 and 17000 ORDER BY salary DESC;
/*3*/
SELECT concat(last_name,first_name) 姓名, email 郵箱 FROM employees WHERE email LIKE '%e%' ORDER BY LENGTH(郵箱) desc,department_id asc;

在這裏插入圖片描述

-- day1 --
#1
select concat(CURDATE(),'+',CURTIME());
#2
SELECT employee_id 員工號,CONCAT(last_name,' ',first_name) 姓名,salary 工資,salary*1.2 newsalary FROM employees;
#3
SELECT last_name 姓名,LOWER(SUBSTR(last_name,1,1)) 姓名首字母,LENGTH(last_name) 姓名長度 FROM employees ORDER BY 姓名首字母 asc;
#4
select CONCAT(last_name,' earns ',salary,' monthly but wants ',salary*3,' Dream Salary') FROM employees;
#5
SELECT job_id 工作編號, 
CASE job_id
	WHEN 'AD_PRES' THEN 'A'
	WHEN 'ST_MAN' THEN 'B'
	WHEN 'IT_PROG' THEN 'C'
	ELSE
		'D'
END 工作等級
FROM employees ORDER BY 工作等級 asc;

-- day2 --
#6.查詢每個國家下的部門個數大於2的國家編號
SELECT country_id 國家編號, count(*) 部門數 
FROM departments d,locations l 
WHERE d.location_id=l.location_id 
GROUP BY 國家編號 HAVING 部門數>2;
#5.查詢每個工種、每個部門的部門名、工種名和最低工資
SELECT j.job_id 工種,department_name 部門名,j.job_title 工種名, MIN(salary) 最低工資 
FROM employees e,departments d, jobs j 
WHERE e.department_id = d.department_id AND e.job_id = j.job_id 
GROUP BY 工種,部門名;
#7、選擇指定員工的姓名,員工號,以及他的管理者的姓名和員工號,結果類似於下面的格式
#employees			Emp			#manager Mgr#
#kochhar 101		king 				100
SELECT CONCAT(e1.last_name,' ',e1.employee_id) employees,e2.last_name Mname,e2.employee_id "#manager Mgr#" 
FROM employees e1,employees e2 
WHERE e1.manager_id = e2.employee_id;

![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200413171309752.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc1MjA3MA==,size_16,color_FFFFFF,t_70#pic_center =1000x)
-------------------------------------------------------------每天進步一點點
最後更新於 2020.4.13
更新中~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章