數據庫裏面的數據庫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