static關鍵字真能提高Bean的優先順序嗎?答:真能
資料庫的相關概念
**DBMS、DB、SQL**
DB:database資料庫,儲存一系列有組織資料的容器
DBMS:Database Management System資料庫管理系統,使用DBMS管理和維護DB
SQL:StructureQueryLanguage結構化查詢語言,程式設計師用於和DBMS通訊的語言
MySQL服務的登入和退出 ★
**方式一:通過dos命令**
mysql -h主機名 -P埠號 -u使用者名稱 -p密碼
**注意:**
如果是本機,則-h主機名 可以省略
如果埠號是3306,則-P埠號可以省略
**方式二:通過圖形化介面客戶端**
通過sqlyog,直接輸入使用者名稱、密碼等連線進去即可
MySQL的常見命令和語法規範
**①常見命令**
show databases 顯示當前連線下所有資料庫
show tables 顯示當前庫中所有表
show tables from 庫名 顯示指定庫中所有表
show columns from 表名 顯示指定表中所有列
use 庫名 開啟/使用指定庫
**②語法規範**
不區分大小寫
每條命令結尾建議用分號
註釋:
#單行註釋
-- 單行註釋
/*多行註釋*/
補充函式
select version();
select database();
select user();
select ifnull(欄位名,表示式);
select concat(字元1,字元2,字元3);
select length(字元/欄位);獲取位元組長度
邏輯運算子:and or not
模糊查詢
like:一般和萬用字元搭配使用
_ 任意單個字元
% 任意多個字元
between and:一般用於判斷某欄位是否在指定的區間
a between 10 and 100
in:一般用於判斷某欄位是否在指定的列表
a in(10,30,50)
升序,通過asc
降序,通過desc
基礎查詢:
SELECT 查詢列表 FROM 表名;
特點:
1、查詢的結果集 是一個虛擬表
2、SELECT後面跟的查詢列表,可以有多個部分組成,中間用逗號隔開
例如: SELECT 欄位1,欄位2,表示式 FROM 表;
3、執行順序
① FROM子句
② SELECT子句
4、查詢列表可以是:欄位、表示式、常量、函式等
一、查詢常量
SELECT 100 ;
二、查詢表示式
SELECT 100%3;
三、查詢單個欄位
SELECT `last_name` FROM `employees`;
四、查詢多個欄位
SELECT `last_name`,`email`,`employee_id` FROM employees;
五、查詢所有欄位
SELECT * FROM `employees`;
F12:對齊格式
SELECT
`last_name`,
`first_name`,
`last_name`,
`commission_pct`,
`hiredate`,
`salary`
FROM
employees ;
六、查詢函式(呼叫函式,獲取返回值)
SELECT DATABASE();
SELECT VERSION();
SELECT USER();
七、起別名
方式一:使用AS關鍵字
SELECT USER() AS 使用者名稱;
SELECT USER() AS "使用者名稱";
SELECT USER() AS '使用者名稱';
SELECT last_name AS "姓 名" FROM employees;
方式二:使用空格
SELECT USER() 使用者名稱;
SELECT USER() "使用者名稱";
SELECT USER() '使用者名稱';
SELECT last_name "姓 名" FROM employees;
八、+的作用
mysql中+的作用:
1、加法運算
①兩個運算元都是數值型
100+1.5
②其中一個運算元為字元型
將字元型資料強制轉換成數值型,如果無法轉換,則直接當做0處理
'張無忌'+100--->100
③其中一個運算元為NULL
NULL+NULL--->NULL
NULL+100--->NULL
#需求:查詢 first_name 和last_name 拼接成的全名,最終起別名為:姓 名
使用CONCAT拼接函式
SELECT CONCAT(first_name,last_name) AS "姓 名"
FROM employees;
九、DISTINCT的使用(只返回不同的值)
-- 需求:查詢員工涉及到的部門編號有哪些,不重複
SELECT DISTINCT department_id FROM employees;
十、查看錶的結構
①、DESC employees;
②、SHOW COLUMNS FROM employees;
基礎查詢
條件查詢
語法:
SELECT 查詢列表
FROM 表名
WHERE 篩選條件;
執行順序:
①FROM子句
②WHERE子句
③SELECT子句
SELECT last_name,first_name
FROM employees
WHERE salary>20000;
特點:
1、按關係表示式篩選
關係運算符:> < >= <= = <>(不等於)
2、按邏輯表示式篩選
邏輯運算子:AND OR NOT
3、模糊查詢
LIKE
IN
BETWEEN AND
IS NULL
一、按關係表示式篩選
#案例1:查詢部門編號不是100的員工資訊
SELECT *
FROM employees
WHERE department_id <> 100;
#案例2:查詢工資<15000的姓名、工資
SELECT last_name,salary
FROM employees
WHERE salary<15000;
二、按邏輯表示式篩選
#案例1:查詢部門編號不是 50-100之間員工姓名、部門編號、郵箱
方式1:
SELECT last_name,department_id,email
FROM employees
WHERE department_id <50 OR department_id>100;
方式2:
SELECT last_name,department_id,email
FROM employees
WHERE NOT(department_id>=50 AND department_id<=100);
#案例2:查詢獎金率>0.03 或者 員工編號在60-110之間的員工資訊
SELECT *
FROM employees
WHERE commission_pct>0.03 OR (employee_id >=60 AND employee_id<=110);
三、模糊查詢
1、LIKE
功能:一般和萬用字元搭配使用,對字元型資料進行部分匹配查詢
常見的萬用字元:
_ 任意單個字元
% 任意多個字元,支援0-多個
LIKE/NOT LIKE
#案例1:查詢姓名中包含字元a的員工資訊
SELECT *
FROM employees
WHERE last_name LIKE '%a%';
#案例2:查詢姓名中包含最後一個字元為e的員工資訊
SELECT *
FROM employees
WHERE last_name LIKE '%e';
#案例3:查詢姓名中包含第一個字元為e的員工資訊
SELECT *
FROM employees
WHERE last_name LIKE 'e%';
#案例4:查詢姓名中包含第三個字元為x的員工資訊
SELECT *
FROM employees
WHERE last_name LIKE '__x%';
#案例5:查詢姓名中包含第二個字元為_的員工資訊
SELECT *
FROM employees
WHERE last_name LIKE '_\_%';
SELECT *
FROM employees
WHERE last_name LIKE '_$_%' ESCAPE '$';
2、IN
功能:查詢某欄位的值是否屬於指定的列表之內
a IN(常量值1,常量值2,常量值3,...)
a NOT IN(常量值1,常量值2,常量值3,...)
IN/NOT IN
#案例1:查詢部門編號是30/50/90的員工名、部門編號
方式1:
SELECT last_name,department_id
FROM employees
WHERE department_id IN(30,50,90);
方式2:
SELECT last_name,department_id
FROM employees
WHERE department_id = 30
OR department_id = 50
OR department_id = 90;
案例2:查詢工種編號不是SH_CLERK或IT_PROG的員工資訊
#方式1:
SELECT *
FROM employees
WHERE job_id NOT IN('SH_CLERK','IT_PROG');
#方式2:
SELECT *
FROM employees
WHERE NOT(job_id ='SH_CLERK'OR job_id = 'IT_PROG');
3、BETWEEN AND
功能:判斷某個欄位的值是否介於X,X之間
BETWEEN AND/NOT BETWEEN AND
#案例1:查詢部門編號是30-90之間的部門編號、員工姓名
方式1:
SELECT department_id,last_name
FROM employees
WHERE department_id BETWEEN 30 AND 90;
方式2:
SELECT department_id,last_name
FROM employees
WHERE department_id>=30 AND department_id<=90;
#案例2:查詢年薪不是100000-200000之間的員工姓名、工資、年薪
SELECT last_name,salary,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM employees
WHERE salary*12*(1+IFNULL(commission_pct,0))<100000 OR salary*12*(1+IFNULL(commission_pct,0))>200000;
SELECT last_name,salary,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
WHERE salary*12*(1+IFNULL(commission_pct,0)) NOT BETWEEN 100000 AND 200000;
4、IS NULL/IS NOT NULL
#案例1:查詢沒有獎金的員工資訊
SELECT *
FROM employees
WHERE commission_pct IS NULL;
#案例2:查詢有獎金的員工資訊
SELECT *
FROM employees
WHERE commission_pct IS NOT NULL;
SELECT *
FROM employees
WHERE salary IS 10000;(報錯!)
----------------=與IS的對比------------------------------------
= 只能判斷普通的內容
IS 只能判斷NULL值
<=> 安全等於,既能判斷普通內容,又能判斷NULL值,不建議用,閱讀性差
條件查詢
排序查詢
語法:
SELECT 查詢列表
FROM 表名
【WHERE 篩選條件】
ORDER BY 排序列表
執行順序:
①FROM子句
②WHERE子句
③SELECT子句
④ORDER BY 子句
舉例:
SELECT last_name,salary
FROM employees
WHERE salary>20000
ORDER BY salary ;
特點:
1、排序列表可以是單個欄位、多個欄位、表示式、函式、列數、以及以上的組合
2、升序 ,通過 ASC ,預設行為
降序 ,通過 DESC
一、按單個欄位排序
#案例1:將員工編號>120的員工資訊進行工資的升序
SELECT *
FROM employees
ORDER BY salary ;
#案例1:將員工編號>120的員工資訊進行工資的降序
SELECT *
FROM employees
WHERE employee_id>120
ORDER BY salary DESC;
二、按表示式排序
#案例1:對有獎金的員工,按年薪降序
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
三、按別名排序
#案例1:對有獎金的員工,按年薪降序
SELECT *,salary*12*(1+commission_pct,0) 年薪
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY 年薪 DESC;
思考為什麼WHERE不能用別名進行判斷?
因為是程式碼執行順序的問題。
四、按函式的結果排序
#案例1:按姓名的字數長度進行升序
SELECT last_name
FROM employees
ORDER BY LENGTH(last_name);
五、按多個欄位排序
#案例1:查詢員工的姓名、工資、部門編號,先按工資升序,再按部門編號降序
SELECT last_name,salary,department_id
FROM employees
ORDER BY salary ASC,department_id DESC;
六、補充選學:按列數排序
SELECT * FROM employees
ORDER BY 2 DESC;
SELECT * FROM employees
ORDER BY first_name;
排序查詢
注意:
常見函式
函式:為了實現某個功能,將編寫的一系列的命令集合封裝在一起,對外僅僅顯示方法名,供外部呼叫
1、自定義方法(函式)
2、呼叫方法(函式)★
叫什麼 :函式名
幹什麼 :函式功能
常見函式(需掌握):
單行函式
字元函式
CONCAT
SUBSTR
LENGTH(str)
CHAR_LENGTH
UPPER
LOWER
TRIM
LEFT
RIGHT
LPAD
RPAD
INSTR
STRCMP
數學函式
ABS
CEIL
FLOOR
ROUND
TRUNCATE
MOD
日期函式
NOW
CURTIME
CURDATE
DATEDIFF
DATE_FORMAT
STR_TO_DATE
流程控制函式
IF
CASE
#一、字元函式
1、CONCAT 拼接字元
SELECT CONCAT('hello,',first_name,last_name) 備註 FROM employees;
2、LENGTH 獲取位元組長度,位元組長度與數字編碼格式有關
SELECT LENGTH('hello,郭襄');
3、CHAR_LENGTH 獲取字元個數
SELECT CHAR_LENGTH('hello,郭襄');
4、SUBSTRING 擷取子串
/*
注意:起始索引從1開始!!!
substr(str,起始索引,擷取的字元長度)
substr(str,起始索引)沒有第三個引數的話就是擷取索引之後所有的值
*/
SELECT SUBSTR('張三丰愛上了郭襄',1,3);--->張三丰
SELECT SUBSTR('張三丰愛上了郭襄',7);--->郭襄
5、INSTR獲取字元第一次出現的索引
SELECT INSTR('三打白骨精aaa白骨精bb白骨精','白骨精');--->3
6、TRIM去前後指定的字元,預設是去空格
SELECT TRIM(' 虛 竹 ') AS a;--->虛 竹
SELECT TRIM('x' FROM 'xxxxxx虛xxx竹xxxxxxxxxxxxxxxxxx') AS a;--->虛xxx竹
7、LPAD/RPAD 左填充/右填充,10代表總共的字元個數
SELECT LPAD('木婉清',5,'a');--->aa木婉清
SELECT RPAD('木婉清',5,'a');--->木婉清aa
8、UPPER/LOWER 變大寫/變小寫
#案例:查詢員工表的姓名,要求格式:姓首字元大寫,其他字元小寫,名所有字元大寫,且姓和名之間用_分割,最後起別名“OUTPUT”
SELECT CONCAT(UPPER(SUBSTR(first_name,1,1)),LOWER(SUBSTR(first_name,2)),'_',UPPER(last_name)) "OUTPUT"
FROM employees;
9、STRCMP 比較兩個字元大小
SELECT STRCMP('aec','aec');
引數1大於引數2顯示1,小於顯示-1,等於顯示0
10、LEFT/RIGHT 擷取子串
SELECT LEFT('鳩摩智',1);--->鳩
SELECT RIGHT('鳩摩智',1);--->智
#二、數學函式
1、ABS 絕對值
SELECT ABS(-2.4);--->2.4
2、CEIL 向上取整 返回>=該引數的最小整數
SELECT CEIL(-1.09);
SELECT CEIL(0.09);
SELECT CEIL(1.00);
3、FLOOR 向下取整,返回<=該引數的最大整數
SELECT FLOOR(-1.09);
SELECT FLOOR(0.09);
SELECT FLOOR(1.00);
4、ROUND 四捨五入
SELECT ROUND(1.8712345);
SELECT ROUND(1.8712345,2); 2代表小數點後幾位
5、TRUNCATE 截斷
SELECT TRUNCATE(1.8712345,1);引數2表示截斷小數點後幾位
6、MOD 取餘
SELECT MOD(-10,3);
a%b = a-a/b*b
-10%3 = -10 - (-10)/3*3 = -1
SELECT -10%3;
SELECT 10%3;
SELECT -10%-3;
SELECT 10%-3;
#三、日期函式
1、NOW 當前日期,時間
SELECT NOW();
2、CURDATE 當前日期
SELECT CURDATE();
3、CURTIME 當前時間
SELECT CURTIME();
4、DATEDIFF 兩個日期差值,引數1減引數2
SELECT DATEDIFF('1998-7-16','2019-7-13');
5、DATE_FORMAT 將引數1按照轉換成指定格式
SELECT DATE_FORMAT('1998-7-16','%Y年%m月%d日 %H小時%i分鐘%s秒') 出生日期;
1998年07月16日 00小時00分鐘00秒
6、STR_TO_DATE 按指定格式解析字串為日期型別,這樣字串就能和日期比較
SELECT * FROM employees
WHERE hiredate<STR_TO_DATE('3/15 1998','%m/%d %Y');
#四、流程控制函式
1、IF函式
SELECT IF(100>9,'好','壞');
如果 100>9,顯示好,否則顯示壞
#需求:如果有獎金,則顯示最終獎金,如果沒有,則顯示0
SELECT IF(commission_pct IS NULL,0,salary*12*commission_pct) 獎金
FROM employees;
2、CASE函式
情況1 :實現等值判斷
CASE 表示式
WHEN 值1 THEN 結果1
WHEN 值2 THEN 結果2
...
ELSE 結果n
END
案例:
部門編號是30,工資顯示為2倍
部門編號是50,工資顯示為3倍
部門編號是60,工資顯示為4倍
否則不變
顯示 部門編號,新工資,舊工資
SELECT department_id,salary,
CASE department_id
WHEN 30 THEN salary*2
WHEN 50 THEN salary*3
WHEN 60 THEN salary*4
ELSE salary
END newSalary
FROM employees;
②情況2:類似於多重IF語句,實現區間判斷
CASE
WHEN 條件1 THEN 結果1
WHEN 條件2 THEN 結果2
...
ELSE 結果n
END
案例:如果工資>20000,顯示級別A
工資>15000,顯示級別B
工資>10000,顯示級別C
否則,顯示D
SELECT salary,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END AS "級別"
FROM employees;
常見函式
聚合函式
說明:分組函式往往用於實現將一組資料進行統計計算,最終得到一個值,又稱為統計函式
分組函式清單:
SUM(欄位名):求和
AVG(欄位名):求平均數
MAX(欄位名):求最大值
MIN(欄位名):求最小值
COUNT(欄位名):計算非空欄位值的個數
#案例1 :查詢員工資訊表中,所有員工的工資和、工資平均值、最低工資、最高工資、有工資的個數
SELECT SUM(salary),AVG(salary),MIN(salary),MAX(salary),COUNT(salary)
FROM employees;
#案例2:新增篩選條件
#①查詢employee_id表中記錄數:
SELECT COUNT(employee_id) FROM employees;
#②查詢employee_id表中有佣金的人數:
SELECT COUNT(salary) FROM employees;
#③查詢employee_id表中月薪大於2500的人數:
SELECT COUNT(salary) FROM employees WHERE salary>2500;
#④查詢有領導的人數:
SELECT COUNT(manager_id) FROM employees;
#count的補充介紹★
#1、統計結果集的行數,推薦使用count(*)
SELECT COUNT(*) FROM employees;
SELECT COUNT(*) FROM employees WHERE department_id = 30;
COUNT(1)表示給資料添加了一列內容為1的資料,然後計算資料為1的行數
SELECT COUNT(1) FROM employees;
SELECT COUNT(1) FROM employees WHERE department_id = 30;
#2、搭配distinct實現去重的統計
#需求:查詢有員工的部門個數
SELECT COUNT(DISTINCT department_id) FROM employees;
聚合函式
分組查詢
語法:
SELECT 查詢列表
FROM 表名
WHERE 篩選條件
GROUP BY 分組列表
HAVING 分組後篩選
ORDER BY 排序列表;
執行順序:
①FROM子句
②WHERE子句
③GROUP BY 子句
④HAVING子句
⑤SELECT子句
⑥ORDER BY子句
特點:
①查詢列表往往是 聚合函式和被分組的欄位 ★
②分組查詢中的篩選分為兩類
篩選的基表 使用的關鍵詞 位置
分組前篩選 原始表(FROM 後面的) WHERE GROUP BY 的前面
分組後篩選 分組後的結果集 HAVING GROUP BY 的後面
WHERE——GROUP BY ——HAVING
聚合函式做條件只可能放在HAVING後面!!!
簡單的分組
#案例1:查詢每個工種的員工平均工資
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id;
#案例2:查詢每個領導的手下人數
SELECT COUNT(*),manager_id
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id;
可以實現分組前的篩選
#案例1:查詢郵箱中包含a字元的 每個部門的最高工資
SELECT MAX(salary) 最高工資,department_id
FROM employees
WHERE email LIKE '%a%'
GROUP BY department_id;
#案例2:查詢每個領導手下有獎金的員工的平均工資
SELECT AVG(salary) 平均工資,manager_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;
可以實現分組後的篩選
#案例1:查詢哪個部門的員工個數>5
SELECT COUNT(*) 員工個數,department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>5;
#案例2:每個工種有獎金的員工的最高工資>12000的工種編號和最高工資
SELECT job_id,MAX(salary)
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;
#案例3:領導編號>102的每個領導手下的最低工資大於5000的最低工資
SELECT MIN(salary) 最低工資,manager_id
FROM employees
WHERE manager_id>102
GROUP BY manager_id
HAVING MIN(salary)>5000 ;
可以實現排序
#案例:查詢沒有獎金的員工的最高工資>6000的工種編號和最高工資,按最高工資升序
SELECT MAX(salary) 最高工資,job_id
FROM employees
WHERE commission_pct IS NULL
GROUP BY job_id
HAVING MAX(salary)>6000
ORDER BY MAX(salary) ASC;
按多個欄位分組
#案例:查詢每個工種每個部門的最低工資,並按最低工資降序
提示:工種和部門都一樣,才是一組
SELECT MIN(salary) 最低工資,job_id,department_id
FROM employees
GROUP BY job_id,department_id
ORDER BY MIN(salary) DESC;
分組查詢