Mysql基礎編寫sql案例(一)

數據庫裏面的數據庫sql文件:http://www.javashuo.com/article/p-xgltbtkn-bx.htmlsql

#基礎查詢
/*
    語法:、
        select 查詢列表
        from 表名;
        
查詢列表能夠是,表中的字段,常量值 表達式,函數
查詢的表格是一個虛擬的表
*/

# 查詢單個字段
select last_name from employees

# 查詢多個字段
select last_name ,salary,email from employees

#查詢表中的全部字段(儘可能不要使用*若是字段明確使用字段)使用*號的順序是和原始表的順序是同樣的
select * from employees

#查詢常量值
SELECT 100 as 這個是100

#查詢函數
select VERSION()

#起別名(在查詢的時候若是有重名的狀況,能夠經過別名來區分)
select 100 as 這裏是別名
select 100 這裏是別名
> 若是別名裏面包含了關鍵字最好經過引號引用起來

#去重:經過DISTINCT來去重
SELECT DISTINCT department_id from employees

# +號的做用
#sql中的+號的做用只是作爲運算符
/*
* select 100+90兩個操做數都是數值型,則作加法運算
* select '123' + 90 若是一方爲字符串類型,字符數值轉換成數值類型
*    若是轉換成功就進行加法運算
*         若是轉換失敗就將字符型數值置爲0
* select null + 90 在加法運算中無論那一方爲Null結果都是null
*/
SELECT  FROM employees

#字符串拼接(在字符串拼接的時候使用的是CONCAT)
select CONCAT(last_name,first_name) from employees

# 條件查詢
/*
select 查詢列表 From 表名 where 篩選條件
*/

# 按條件表達式篩選
select * from employees where salary > 12000

#查詢員工部門編號不是90的員工我姓名和部門的ID
select CONCAT(last_name,first_name) as 員工名,e.department_id from employees e WHERE department_id <> 90

#查詢工資在10000到20000之間的員工名,工資以及獎金
SELECT
    CONCAT( last_name, first_name ) AS 員工名,
    salary AS 工資,
    commission_pct * salary AS 獎金 
FROM
    employees 
WHERE
    salary > 10000 
    AND salary < 20000
    
# 查詢部門編號不是在90到110之間,或者工資高於15000的員工信息
SELECT
    * 
FROM
    employees 
WHERE
    department_id < 90 AND department_id > 110 
    OR salary > 15000

# 模糊查詢
/*
* like
* between and
* in
* is null |is not null
*/
# LIKE
/*
* %任意多的字符包含0個
* _ 任意單個字符
*/
SELECT
    * 
FROM
    employees 
WHERE
    last_name LIKE ( '%a%' )
#查詢員工名字第三個字符爲e每5個字符爲a的
SELECT * from employees WHERE last_name LIKE '__e_a%'
#查詢第二個字符是_的
SELECT last_name FROM employees WHERE last_name LIKE '_\_%';
SELECT last_name FROM employees WHERE last_name LIKE '_$_%' ESCAPE '$';

#between and
# 包含兩個臨界值的
# 兩個臨界值不能夠互換的
#查詢員工編號在100    到120之間的員工信息
SELECT * FROM employees WHERE department_id BETWEEN 100 and 120

# in
# 查詢員工的工種編號
SELECT
    last_name,
    job_id 
FROM
    employees 
WHERE
    job_id IN ( 'AD_PRES', 'AD_VP', 'IT_PROT' )

# is null
# 案例:查詢沒有獎金的員工名和獎金率
SELECT
    last_name,
    commission_pct 
FROM
    employees 
WHERE
    commission_pct IS NULL
#案例:查詢有獎金的員工名和獎金率
SELECT
    last_name,
    commission_pct 
FROM
    employees 
WHERE
    commission_pct IS NOT NULL
    
# 案例:查詢員工號爲176的員工的姓名和部門號和年薪
SELECT
    last_name,
    salary * 12 *(1+IFNULL(commission_pct,0))
    FROM employees
    WHERE employee_id = '176'
    
# 查詢沒有獎金,且工資小於18000的salay,last_name
SELECT
    salary,
    last_name 
FROM
    employees 
WHERE
    commission_pct IS NULL 
    AND salary < 18000
    
# 查詢employees表中,job_id不爲'IT'或者工資爲12000的員工信息
SELECT
    * 
FROM
    employees 
WHERE
    job_id <> 'IT' 
    OR salary = 12000
    
# 查看Departments結構
DESC departments
    
# 查詢departments表中涉及到了哪些位置的編號
SELECT DISTINCT
    location_id 
FROM
    departments 
WHERE
    location_id IS NOT NULL
    
# 排序查詢
/*
* select 查詢列表 from 表 【where篩選】 order by 排序列表[asc 升序|desc 降序]
* 默認是asc asc能夠不寫
*/
# 案例:查詢員工的信息,要求工資從高到低排序
SELECT
    * 
FROM
    employees 
ORDER BY
    salary DESC
    
# 案例:查詢部門編號 >= 90 的員工信息,按入職時間
SELECT * FROM employees WHERE department_id >= 90 
ORDER BY
    hiredate DESC
    
# 案例:按年薪的高低顯示員工的信息和年薪【按表達式】
SELECT
    *,
    salary * 12 + ( 1+ IFNULL( commission_pct, 0 ) ) a 
FROM
    employees 
ORDER BY
    a DESC
    
# 查詢姓名的長度來顯示員工的姓名和工資【按函數排序】
SELECT LENGTH(last_name) a,salary FROM employees ORDER BY a DESC

# 查詢員工信息,要求先按員工資排序,再按員工編號排序
SELECT
    * 
FROM
    employees 
ORDER BY
    salary ASC,
    employee_id DESC
    
# 查詢員工的姓名和部門號和年薪,按年薪降序,按姓名升序
SELECT
    last_name,
    department_id,
    12 * salary + ( 1+ IFNULL( commission_pct, 0 ) ) 年薪
FROM
    employees
ORDER BY 年薪 DESC,last_name ASC

# 選擇工資不在8000到17000的員工的姓名和工資,按工資降序
SELECT
    last_name,
    salary 
FROM
    employees 
WHERE
    !(salary BETWEEN 8000 
    AND 17000)
ORDER BY
    salary DESC
    
# 查詢郵箱中包含e的員工信息,並按郵箱的字節數降序,再按部門號升序
SELECT
    * 
FROM
    employees 
WHERE
    email LIKE '%e%' 
ORDER BY
    LENGTH( email ) DESC,
    department_id ASC
    
# 常見函數
/*
*    單行函數:
*            字符函數
*                    length、concat、upper、lower、substr、instr、trim、lpad、rpad、replace
*            數學函數
*                    round、ceil、floor、truncate
*            日期函數
*                    now、curdate、curtime、year、day、month、monthname、str_to_date、date_format
*            其它函數
*                    version、database、user
*         流程控制函數
*                    if、case
*
*/
# 案例:將姓變大寫,名就能小寫,而後拼接
SELECT CONCAT(UPPER(first_name),'_',LOWER(last_name)) FROM employees;
    
# 姓名中首字母大寫,其它的字符小寫,而後經過_拼接,顯示出來
SELECT
    CONCAT(
    UPPER( SUBSTR( last_name, 1, 1 ) ),
    '_',
    LOWER( SUBSTR( last_name, 1 ) ) 
    ) 
FROM
    employees;
    
# instr用於返回子串在父串裏面的起始索引(第一次出現的索引)
    
# trim 去掉先後面的空格
# 案例去掉字符串裏面的先後的a
SELECT TRIM('a' FROM 'aaaaaaaBaaaa')
    
# lpad 若是字符串的長度不爲二參值,就會經過&來填滿左側
SELECT lpad('兔兔',10,'&')
# rpad 若是字符串的長度不爲二參值,就會經過&來填滿左側
SELECT rpad('兔兔',10,'&')
#把下面字符串中的cc替換成zz
SELECT replace('bbccaa','cc','zz')

#四捨五入
SELECT ROUND(-1.5)
#小數點後面保留兩位
SELECT ROUND(-1.5456,2)

#向上取整
SELECT ceil(1.10)
#向下取整
SELECT FLOOR(1.1)
# truncate 截斷
SELECT TRUNCATE(1.8999,1)
# mod取餘
SELECT MOD(10,3)
# now返回當前系統日期+時間
SELECT now();
# curdate返回當彰系統的日期 不包含時間
SELECT CURDATE()
#curtime 返回當前的時間,不包含日期
SELECT CURTIME()
#能夠獲取指定的部分
SELECT year(NOW())
SELECT MONTH(NOW()
SELECT DAY(now())
SELECT MONTHNAME(NOW())

# 將字符串的日期轉換成date格式
SELECT STR_TO_DATE('2020-07-9','%Y-%c-%d')
#將日期轉換成字符
SELECT DATE_FORMAT(NOW(),'%y年%c月%d日')
#查詢有獎金的員工名和入職日期(xx月/xx日 xx年)
    SELECT
        last_name,
        DATE_FORMAT( hiredate, '%m月/%d日 %Y年' ) 
    FROM
        employees 
    WHERE
        commission_pct IS NOT NULL

    # 查詢員工是否有獎金有就顯示有沒有就顯示沒有
    SELECT
        last_name,
        commission_pct,
    IF
        ( commission_pct, '有', '沒有' ) 
    FROM
    employees
    
# 查詢員工名,姓名,工資,以及工資提升百分之20%後的結果
SELECT last_name,salary,salary * 1.2 FROM employees 
# 將員工的姓名按首字符排序,並寫出姓名的長度(length)
    SELECT
        last_name
    FROM
        employees ORDER BY SUBSTR( last_name, 1, 1 ) ASC
#分組函數
/*
* 功能:用做統計使用,又稱爲聚合函數或統計函數或組函數
*	分類:
*			sum求和 avg 平均 Max min count
*			sum avg 不能夠放字符類型 日期也不能夠
*			max min 是可使用字符的  日期也支持
*     count 計算不爲null個數,支持全部的類型 myisam存儲引擎下效率最高,由於它有一個內部的計數器
*/
# 查詢員工表中的最大入職時間和最小入職時間,並計算出它們的相差的天數
SELECT
	DATEDIFF( MAX( hiredate ), MIN( hiredate ) ) 
FROM
	employees;
# 查詢員工編號爲90的員工個數
SELECT
	COUNT( * ) 
FROM
	employees 
WHERE
	department_id = 90;
	
# 分組查詢
#查詢每一個部門的平均工資
SELECT
	AVG( salary ) 平均工資,
	department_id 部門編號 
FROM
	employees 
GROUP BY
	department_id;
# 查詢每一個工種的最高工資
SELECT
	MAX( salary ) 最高工資,
	job_id 
FROM
	employees 
GROUP BY
	job_id
#查詢郵箱中包含a字符的,每一個部門的平均工資
SELECT
	AVG( salary ),
	department_id
FROM
	employees 
WHERE
	email LIKE '%a%'
GROUP BY department_id
#查詢有獎金的每一個領導手下員工的最高工資
SELECT
	MAX( salary ),
	manager_id
FROM
	employees 
WHERE
	commission_pct IS NOT NULL
GROUP BY manager_id
	
# 查詢那個部門的員工個數大於2
SELECT
	count( * ) a,
	department_id 
FROM
	employees 
GROUP BY
	department_id 
HAVING
	a > 2
# 查詢每一個工種有獎金的員工的最高工資>12000的工種編號和最高工資
# 1. 查詢每一個工種有獎金的員工的最高工資
SELECT
	MAX( salary ),
	job_id 
FROM
	employees 
	WHERE
commission_pct is not NULL
GROUP BY
	job_id
# 在1的基礎上結果上篩選 最高工資大於12000的
SELECT
	MAX( salary ) a,
	job_id 
FROM
	employees 
WHERE
	commission_pct IS NOT NULL 
GROUP BY
	job_id 
HAVING
	a > 12000
# 查詢領導編號>102的每一個領導手下的最低工資>5000的領導編號是哪一個,
#以及其最低工資
SELECT
	MIN( salary ) a,
	manager_id 
FROM
	employees 
WHERE
	manager_id > 102 
GROUP BY
	manager_id 
HAVING
	a > 5000
	
# 案例:按員工姓名的長度分組,查詢每一組的員工個數,
# 篩選員工個數大於5的有那些
SELECT
	count(*) c,LENGTH(last_name)
FROM
	employees 
GROUP BY
	LENGTH( last_name )
HAVING c > 5
	
# 查詢每一個部門每一個工種的員工的平均工資
SELECT AVG(salary) a,department_id,job_id
FROM employees
GROUP BY department_id,job_id
# 查詢每一個部門每一個工種的員工的平均工資 根據平均工資的高低來排序
SELECT AVG(salary) a,department_id,job_id
FROM employees
GROUP BY department_id,job_id
ORDER BY a DESC
#查詢各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
	
# 查詢員工最高工資和最低工資的差距
SELECT MAX(salary) - MIN(salary) FROM employees;
#查詢各管理者手下員工的最低工資,其中最低工資不能低於6000
# 沒有管理者的員工不能計算在內
SELECT
	MIN( salary ) m,
	manager_id 
FROM
	employees 
WHERE
	manager_id IS NOT NULL 
GROUP BY
	manager_id 
HAVING
	m > 6000
	
# 查詢全部部門的編號,員工數量和工資平均值,並按平均工資降序
SELECT
	department_id,
	COUNT( * ) , AVG( salary ) a
FROM
	employees 
GROUP BY
	department_id 
ORDER BY
	a DESC
# 選擇具備各個job_id 的員工人數
SELECT
	COUNT(*) 
FROM
	employees 
GROUP BY
	job_id
相關文章
相關標籤/搜索