文末有mysql資料mysql
執行順序:spring
from -> join -> on -> where -> groupby -> avg max .. -> having -> select ->order bysql
SQL語言分類:數據庫
data query language服務器
select 字段名 from 表名
select 90
select concat('a', 'bbb');
select 100/1234;
select last_name as '姓名
select DISTINCT department_id
DESC departments;
session
/* 條件運算符: > < <> != >= <= 邏輯運算符: && || ! and or not 模糊查詢 : like ,between ,and ,in ,is null like '%%' 匹配不出null值 通配符: % 任意多個字符,包含0個. _ 任意單個字符 默認轉義\ 自定義轉義: ESCAPE '轉義字符' */ #1 查詢工資在 12000-17000 的員工姓名和工資 SELECT last_name as '姓名',salary as '工資' FROM employees WHERE salary BETWEEN 12000 and 17000 ; #2 查詢員工號爲 176 的員工的姓名和部門號和年薪 SELECT employee_id as '編號',last_name as '姓名',job_id as '部門號',salary*12 as '年薪' FROM employees WHERE employee_id =176 ; #3 選擇工資不在 5000 到 12000 的員工的姓名和工資 SELECT last_name as '姓名',salary as '工資' FROM employees WHERE salary not BETWEEN 5000 and 17000 ; #4 選擇在 20 或 50 號部門工做的員工姓名和部門號 SELECT last_name as '姓名',department_id as '部門號' FROM employees WHERE -- department_id =20 or department_id =50 department_id in(20,50) ; #5 #屬性判空 選擇公司中沒有管理者的員工姓名及 job_id SELECT last_name as '姓名',job_id as '工做號' FROM employees WHERE ISNULL(manager_id) ; #6選擇公司中有獎金的員工姓名,工資和獎金級別 SELECT last_name as '姓名',commission_pct as '獎金',salary as "工資" FROM employees WHERE not ISNULL(commission_pct) ; #7 選擇員工姓名的第三個字母是 a 的員工姓名 SELECT last_name as '姓名' FROM employees WHERE last_name LIKE '__a%' ; #8 選擇姓名中有字母 a 和 e 的員工姓名 SELECT last_name as '姓名' FROM employees WHERE last_name LIKE '%a%e%' or last_name LIKE '%e%a%'; ; #9 顯示出表 employees 表中 first_name 以 'e'結尾的員工信息 SELECT last_name as '姓名' FROM employees WHERE last_name LIKE '%e'; ; #10 顯示出表 employees 部門編號在 80-100 之間 的姓名、職位 SELECT last_name as '姓名',department_id '部門號' FROM employees WHERE department_id BETWEEN 80 AND 100; ; #11 顯示出表 employees 的 manager_id 是 100,101,110 的員工姓名、職位 SELECT last_name as '姓名',job_id as '職位',manager_id FROM employees WHERE manager_id in(100,101,110) ;
#1 查詢員工的姓名和部門號和年薪,按年薪降序 按姓名升序 SELECT last_name as name,department_id as dID ,salary*12 as yearsal FROM employees ORDER BY yearsal DESC,last_name ASC #2 選擇工資不在 8000 到 17000 的員工的姓名和工資,按工資降序 SELECT last_name as name,salary as sal FROM employees WHERE salary not BETWEEN 8000 and 17000 ORDER BY salary DESC #3 查詢郵箱中包含 e 的員工信息,並先按郵箱的字節數降序,再按部門號升序 SELECT department_id as dID,email,LENGTH(email) as '郵箱長度' FROM employees ORDER BY LENGTH(email) DESC,department_id ASC
SELECT LENGTH(TRIM('a' FROM "aaa123aaa")) as '長度'
=> 123SELECT LPAD('aaaaa','10','#')
=> #####aaaaanow :當前時間函數
STR_TO_DATE(str,format):將日期格式的字符轉換成指定格式的日期性能
DATE_FORMAT(date,format) :將日期轉換成字符code
#1顯示系統時間(注:日期+時間) SELECT NOW() #2 計算年薪 SELECT last_name as name,salary,salary*1.2 as newsal FROM employees #3將員工的姓名按首字母排序,並寫出姓名的長度(length) SELECT last_name as name ,LENGTH(last_name) as '長度' FROM employees ORDER BY SUBSTR(name,1,1) ASC,LENGTH(name) DESC #4 輸出 <last_name> earns <salary> monthly but wants <salary*3> SELECT CONCAT(last_name,' earn ',ROUND(salary),' monthly but wants ',ROUND(salary*3)) as 'Dream Salary' FROM employees #5 /* job grade AD_PRES A ST_MAN B IT_PROG C SA_REP D ST_CLERK E Last_name Job_id Grade king AD_PRES A */ SELECT last_name,job_id, #case 也算一個字段,用逗號分隔 CASE job_id WHEN 'AD_PRES' THEN 'A' WHEN 'ST_MAN' THEN 'B' WHEN 'IT_PROG' THEN 'C' WHEN 'SA_REP' THEN 'D' WHEN 'ST_CLERK' THEN 'E' ELSE 'null' END as 'grade' FROM employees ORDER BY grade ASC
特徵:orm
爲何使用推薦使用COUNT(*)統計總記錄數,根據分組函數的特色,null值不計入,當某個字段爲null時,可能會出現漏記.
摘自官網:
InnoDB以相同的方式處理SELECT COUNT(*)和SELECT COUNT(1)操做。沒有性能差別。
1.單子段分組:
select 分組函數,分組後的字段 from 表 【where 篩選條件】 -- 分組前的篩選條件 group by 分組的字段 【having 分組後的篩選】 -- 分組函數,篩選知足條件的組 【order by 排序列表】
2.按函數分組
group by 後還可以使用函數,
例子:按員工姓名長度分組,查詢每一組的員工個數,篩選員工個數>5的有哪些;
SELECT LENGTH(last_name) as 'length', COUNT(*) FROM employees GROUP BY LENGTH(last_name) HAVING COUNT(*) >3
3.多字段分組
例子:查詢每一個部門每一個工種的員工平均工資
SELECT AVG(salary),department_id,job_id FROM employees WHERE not ISNULL(department_id) GROUP BY department_id,job_id ORDER BY AVG(salary) ASC
φ(゜▽゜*)♪
#1.查詢各 job_id 的員工工資的最大值,最小值,平均值,總和,並按 job_id 升序 SELECT job_id, MAX(salary),MIN(salary),AVG(salary),SUM(salary) FROM employees GROUP BY job_id ORDER BY job_id ASC #2.查詢各個管理者手下員工的最低工資,其中最低工資不能低於 6000, 沒有管理者的員工不計算在內 SELECT manager_id, MIN(salary) FROM employees WHERE not ISNULL(manager_id) -- 分組前的篩選條件 GROUP BY manager_id HAVING MIN(salary)>=6000 -- 篩選知足條件的組 ORDER BY manager_id ASC #3.查詢員工表中的最大入職時間和最小入職時間的相差天數 SELECT DATEDIFF(MAX(hiredate),MIN(hiredate)) FROM employees
UNION
when use:查新的結果來自多個表,且多個表沒有直接的鏈接關係,但查詢的信息一致
特色:
SELECT b.*,g.* FROM boys b,beauty g
表1 有m行,表2 有n行,結果=m*n;
緣由:無有效的鏈接條件
避免:可使用WHERE 添加有效的鏈接條件
返回兩張表都知足條件的部分.
#(等值鏈接) #查詢每一個城市的部門個數 SELECT city,COUNT(*) FROM locations l,departments d WHERE l.location_id = d.location_id GROUP BY city # 查詢有獎金的每一個部門的部門名和部門的領導編號和該部門的最低工資 SELECT d.department_name,d.manager_id ,MIN(e.salary) FROM employees e,departments d WHERE e.department_id =d.department_id AND NOT ISNULL(e.commission_pct) GROUP BY e.department_id #查詢每一個國家下的部門個數大於 2 的國家編號 SELECT l.country_id FROM locations l,departments d WHERE l.location_id = d.location_id GROUP BY country_id HAVING COUNT(*)>2 #不等值鏈接 #依據job_grades給每一個員工工資分等級 SELECT e.salary ,jg.grade_level FROM employees e,job_grades jg WHERE e.salary BETWEEN jg.lowest_sal AND jg.highest_sal ORDER BY e.salary ASC #自鏈接 #選擇指定員工的姓名,員工號,以及他的管理者的姓名和員工號,結果相似於下面的格式 # employees Emp manager Mgr SELECT e.last_name as 'employees' ,e.employee_id as 'Emp' ,m.last_name as' manager',m.employee_id as'Mgr' FROM employees e,employees m WHERE e.manager_id =m.employee_id
外連接的查詢結果=主表中的全部記錄+從表匹配值(ifnull 則顯示null)
左外鏈接 left join 左邊的是主表
右外鏈接 right join 右邊的是主表
全外鏈接: FULL JOIN (Mysql不支持
)
select <select_list> from A full join B on A.key=B.key where A.key is null or b.key is null
select -- 查詢列表 from 表1 -- [鏈接類型] join 表2 on 鏈接條件 -- where 篩選條件
#查詢beauty中男友狀況 SELECT g.`name` ,b.id,b.boyName FROM beauty g LEFT JOIN boys b on g.boyfriend_id =b.id #查詢哪個部門沒有員工 SELECT d.* ,e.employee_id,e.manager_id FROM departments d LEFT JOIN employees e on d.department_id = e.department_id WHERE e.manager_id is null #查詢部門名爲 SAL,IT的員工信息 SELECT e.*,d.department_name FROM departments d RIGHT JOIN employees e on d.department_id = e.department_id WHERE d.department_name in('SAL','IT')
即笛卡爾乘積結果
分類:
位置:
特色:
> < <> >= <=
in ,any ,some ,all
#返回job_id與141號員工相同,salary比143號員工多的 員工姓名,job_id,和工資 SELECT last_name,job_id,salary FROM employees WHERE job_id=( SELECT job_id FROM employees WHERE employee_id=141 ) AND salary >( SELECT salary FROM employees WHERE employee_id=143 ) #返回公司工資最少的員工信息,last_name,job_id,salary SELECT last_name,job_id,salary FROM employees WHERE salary =( SELECT MIN(salary) FROM employees )
any:和子查詢返回的某一個比較
In/not in : 等於列表中的任意一個
#返回location_id是1400或1700的部門中全部員工姓名 SELECT last_name FROM employees WHERE department_id in ( SELECT department_id FROM departments WHERE location_id in (1400,1700) ) #返回其餘工種比job_id爲'IT_PROG'工種任一工資低的員工的員工號,姓名,job_id,以及salary SELECT employee_id,last_name,job_id,salary FROM employees WHERE salary < ANY( SELECT salary FROM employees WHERE job_id = 'IT_PROG' ) AND job_id <>'IT_PROG';
#返回員工編號最小,工資最高的信息. SELECT * FROM employees WHERE (employee_id,salary)=( SELECT MIN(employee_id),MAX(salary) FROM employees )
#查詢每一個部門的員工個數,顯示departments表 SELECT d.* ,( SELECT COUNT(*) FROM employees e WHERE d.department_id=e.department_id ) 統計 FROM departments d -- 27 /* 錯誤代碼 why? SELECT d.* ,( SELECT COUNT(*) FROM employees e WHERE d.department_id=e.department_id ) 'ANS' FROM employees e,departments d 2889 */
#查詢每一個部門的平均工資的工資等級 SELECT ag_dep.*,g.grade_level FROM ( SELECT AVG(salary) as ag,department_id FROM employees GROUP BY department_id )ag_dep INNER JOIN job_grades g -- 直接起別名 若是 AS 'g'則會報錯 ON ag_dep.ag BETWEEN g.lowest_sal AND g.highest_sal
/* 語法: EXISTS(完整的查詢語句) 返回: 0或1 */ #查詢沒有女友的boy SELECT bo.* FROM boys bo WHERE NOT EXISTS ( SELECT boyfriend_id FROM beauty g WHERE bo.id =g.boyfriend_id ) #鏈接查詢 SELECT b.* FROM boys b LEFT JOIN beauty g on b.id= g.boyfriend_id WHERE g.name is NULL
-- 1. 查詢和 Zlotkey 相同部門的員工姓名和工資 SELECT last_name,salary,department_id FROM employees WHERE department_id=( SELECT department_id FROM employees WHERE last_name ='Zlotkey' )#34 -- 2. 查詢工資比公司平均工資高的員工的員工號,姓名和工資 SELECT employee_id,last_name,salary FROM employees WHERE salary>( SELECT AVG(salary) FROM employees )#51 -- 3. 查詢各部門中工資比本部門平均工資高的員工的員工號, 姓名和工資 SELECT employee_id,last_name,salary FROM ( SELECT AVG(e.salary) ag_sal,e.department_id eid FROM employees e GROUP BY department_id ) tab1 INNER JOIN employees e1 on e1.department_id = tab1.eid WHERE e1.salary >tab1.ag_sal ORDER BY e1.employee_id #38 -- 4. 查詢和姓名中包含字母 u 的員工在相同部門的員工的員工號和姓名 SELECT employee_id,last_name FROM employees WHERE department_id in( SELECT DISTINCT department_id FROM employees WHERE last_name LIKE '%u%' )#96 -- 5. 查詢在部門的 location_id 爲 1700 的部門工做的員工的員工號 SELECT employee_id FROM employees WHERE department_id in( SELECT department_id FROM departments WHERE location_id=1700 )#18 -- 6. 查詢管理者是 King 的員工姓名和工資 SELECT last_name,salary FROM employees e WHERE manager_id in( SELECT employee_id FROM employees WHERE last_name ='K_ing' )#14 -- 7. 查詢工資最高的員工的姓名,要求 first_name 和 last_name 顯示爲一列,列名爲 姓.名 SELECT CONCAT(first_name,last_name) as "姓名" FROM employees WHERE salary =( SELECT MAX(salary) FROM employees )
select -- 查詢列表 from 表1 [type] join 表2-- [鏈接類型] on 鏈接條件 -- where 篩選條件 group by 分組字段 having 分組後篩選 order by 排序字段 limit offset ,size; offset = (page-1)*size
data manipulation language
insert into 表名(列名,...) values(值1) -- 一 insert into 表名 set 字段=值,字段=值,... -- 二 #1 插入值類型與列類型一致 ,可調換順序 ,不可爲null的值必須插入值 #2 方式一支持 一次插入多行 + 子查詢
update 表名 set 字段=值,字段=值 【where 篩選條件】; -- 1 -- 2 多表更新 update 表1 別名 left|right|inner join 表2 別名 on 鏈接條件 set 字段=值,字段=值 【where 篩選條件】;
delete from 表名 【where 篩選條件】【limit 條目數】 truncate table 表名 #多表刪除 實例 delete g from beauty g inner join boys b on g.boyfriends_id = b.id where b.boyName='xxx';
delete 與 truncate 區別:
data defination language
#建立 CREATE DATABASE if NOT EXISTS boos; #重命名 RENAME DATABASE boos TO books; #設置字符集 ALTER DATABASE boos CHARACTER SET gbk; #刪除庫 DROP DATABASE boos;
drop table if 表名 exists create table 【if not exists】 表名( 字段名 字段類型(長度) 【約束】, 字段名 字段類型 【約束】, .... 字段名 字段類型 【約束】 ) create table if not exists books( id INT(2) AUTO_INCREMENT, bname VARCHAR(20), privce DOUBLE , PRIMARY KEY (id) )
1.添加列
alter table 表名 add column 列名 類型 【first|after 字段名】;
ALTER TABLE books ADD COLUMN author INT;
2.修改列的類型或約束
alter table 表名 modify column 列名 新類型 【新約束】;
alter table books modify column name DOUBLE UNIQUE;
3.修改列名
alter table 表名 change column 舊列名 新列名 類型;
同時可修改類型
alter table books change bname name varchar(30);
4 .刪除列
alter table 表名 drop column 列名;
ALTER TABLE books DROP COLUMN NAME
5.修改表名
alter table 表名 rename 【to】 新表名;
alter table books rename to new_books;
6.表的複製
#一、複製表的結構 create table 表名 like 舊錶; CREATE TABLE copyed LIKE new_books #二、複製表的結構+數據 create table 表名 select 查詢列表 from 舊錶【where 篩選】; CREATE TABLE copy_books SELECT * FROM new_books WHERE 1=1;
整型:tinyint、smallint、mediumint、int/integer、bigint
浮點型:
M = 整數位數+小數位數
D =小數位數
Mysql8中: 若是D=3,插入12.456則會四捨五入爲12.5
字符型:char、varchar、binary、varbinary、enum、set、text、blob
char:char(M),最大長度不能超過M,其中M能夠省略,默認爲1
varchar:可變長度的字符,寫法爲varchar(M),最大長度不能超過M,其中M不能夠省略
日期型:year,date日期 ,time時間, datetime 日期時間
主鍵:一個表至多有一個主鍵,但能夠有多個惟一
外鍵:
支持類型 | 是否可起約束名 | |
---|---|---|
列級約束 | 外鍵約束沒有效果 | 不能夠 |
表級約束 | 除了非空和默認 | 能夠,但對主鍵無效 |
create table 表名( #列級約束 字段名 字段類型 not null,#非空 字段名 字段類型 primary key,#主鍵 字段名 字段類型 unique,#惟一 字段名 字段類型 default 值,#默認 #表級約束 constraint 約束名 foreign key(字段名) references 主表(被引用列), constraint fk_stu_major foreign key(majorid) references major(id), constraint 約束名 [約束](字段), -- 約束名 = 別名 ,變量 constraint pk primary key(id) ) show INDEX FROM 表名
自增加列:
Transaction Control Language 事務控制語言
事務:一條或多條sql語句組成一個執行單位,一組sql語句要麼都執行要麼都不執行
set autocommit=0 start transaction delete from account where id =25 savepoint a #設置保存點 delete from account where id =28 rollback to a; #回滾到a
重點在spring中介紹事務操做
what:虛擬表,經過表動態生成的數據 ,只保存sql邏輯不保存結果
where:
#建立 create VIEW myview1 As SELECT last_name,department_name,job_title FROM employees e join departments d on e.department_id = d.department_id join jobs j on j.job_id = e.job_id SELECT * from myview1 where last_name like '%a%' #修改 create or replace view [視圖名] as [查詢語句] #刪除 drop view [視圖名]
系統變量:
全局變量:服務器層面上的,必須擁有super權限才能爲系統變量賦值,做用域爲整個服務器,也就是針對於全部鏈接(會話)有效
會話變量:服務器爲每個鏈接的客戶端都提供了系統變量,做用域爲當前的鏈接(會話)
show 【global|session 】variables like ''; set 【global|session 】 變量名=值
自定義變量:
用戶變量:針對於當前鏈接(會話)生效
set @變量名=值; select @變量名; set @m =1; set @n = 2; set @sum = @m +@n; select @sum;
局部變量:僅僅在定義它的begin end中有效
declare 變量名 類型 【default 值】;
what :一組預先編譯號的SQL語句集合
why use:
create procedure 存儲過程名(參數列表) begin [sql 語句] end 參數列表: 參數模式 參數名 參數類型 In stuname varchar(20)
調用: call 存儲過程名(實參列表)
delimiter 結束標記:
delimiter $ -- 任意
案例:
IN:
CREATE DEFINER=`root`@`localhost` PROCEDURE `logincheck`(IN username VARCHAR(20),IN password VARCHAR(20)) BEGIN #Routine body goes here... DECLARE result VARCHAR(20) DEFAULT ''; SELECT COUNT(*) INTO result FROM admin WHERE admin.username =username AND admin.`password` =password; SELECT IF (result>0 ,'成功','失敗'); END CALL logincheck('admin1','123') #JDBC中 db.connect( "db_host" ).execute_sql( "CALL logincheck('admin1','123')" );
OUT:
CREATE DEFINER=`root`@`localhost` PROCEDURE `findboy`(In butyName VARCHAR(20),OUT boyName VARCHAR(20)) BEGIN #Routine body goes here... SELECT bo.boyName INTO boyName FROM boys bo JOIN beauty g on bo.id = g.boyfriend_id WHERE g.name = butyName; END CALL findboy('小昭',@boyName); SELECT @boyName
區別:
CREATE FUNCTION `函數名`(參數列表) RETURNS 返回類型 BEGIN #Routine body goes here... RETURN 0; END; -------------------- CREATE DEFINER = CURRENT_USER FUNCTION ``() RETURNS integer BEGIN #Routine body goes here... RETURN 0; END; select 函數名(參數列表)
data control language
分支:
CREATE PROCEDURE casse(IN score INT) BEGIN CASE WHEN scorce>=90 THEN SELECT 'A'; WHEN scorce>=90 THEN SELECT 'B'; ELSE SELECT 'C'; END CASE; END; #--------------------------------- CREATE PROCEDURE casse(IN score INT) BEGIN IF search_condition THEN statement_list ELSEIF search_condition THEN statement_list ELSE statement_list END IF; END; #-------------循環------------------- CREATE PROCEDURE casse(IN cnt INT) BEGIN DECLARE i INT DEFAULT 0; WHILE i<=cnt DO INSERT into admin(username,`password`) VALUES(xxx,xxx) END WHILE; END;
連接:https://pan.baidu.com/s/1EeBnOhgMSJjvn35RZtz5sw 提取碼:3mji 複製這段內容後打開百度網盤手機App,操做更方便哦