SQL的基礎
- 實現數據持久化
- 使用完整的管理系統統一管理,易於查詢
- DB
數據庫( database ):存儲數據的“倉庫”。它保存了一系列有組織的數據。 - DBMS
數據庫管理系統( Database Management System )。數據庫是通過 DBMS 創建和操作的容器 - SQL
結構化查詢語言( Structure Query Language ):專門用來與數據庫通信的語言。
- 方式一:通過計算機管理方式
右擊計算機—管理—服務—啓動或停止MySQL服務 - 方式二:通過命令行方式(以管理員方式啓動)
啓動:net start mysql服務名
停止:net stop mysql服務名
- 方式一:通過mysql自帶的客戶端,只限於root用戶
- 方式二:通過Windows自帶的客戶端只限於登錄:mysql [-h 主機名 -P 端口號] -u用戶名 -p密碼
- 退出:exit或ctrl+c
- 查看 mysql 中有哪些個數據庫: show databases;
- 使用一個數據庫: use 數據庫名稱;
- 查看指定的數據庫中有哪些數據表: show tables;
- 查看錶的結構:desc 表名
- 查看其它庫的所有表:show tables from 庫名
- 查看服務器版本:
方式一:登錄到mysql服務器 select version();
方式二:沒有登錄到mysql服務端 mysql --version 或 mysql --V
- mysql中加號的作用
①,只要其中的一方爲字符型,試圖將字符型數值轉換成數值型
select '123'+90; ==》213
②,如果轉換成功,則做加法運算,如果轉換失敗,則將字符型數組轉換成0
select 'Tommey周'+90; ==》90
③,只要其中一方爲null,則結果肯定爲null
select null+90; ==》null
- 拼接函數應使用 concat(‘a’,‘b’)
- 安全等於<=>:既可以判斷NULL值,又可以判斷普通的數值,可讀性較低
- is null:僅僅可以判斷null值,可讀性較高
函數
- 大小寫控制函數
select lower('SQL'); ==》sql
select upper('sql'); ==》SQL
- 字符控制函數
select CONCAT('Hello', 'Tommey周'); ==》HelloTommey周
select SUBSTR('HelloWorld',1,5); ==》Hello
select LENGTH('HelloTommey周'); ==》14
select INSTR('HelloWorld', 'W'); ==》6
select LPAD('Tommey周',10,'*'); ==》***Tommey周
select RPAD('Tommey周', 10, '*'); ==》Tommey周***
select TRIM('H' FROM 'HelloWorld'); ==》elloWorld
select REPLACE('abcd','b','m'); ==》amcd
- ROUND(四捨五入):
select ROUND(45.926, 2); ==》 45.93
- CEIL(向上取整,返回大於等於該參數的最小整數):
select CEIL(45.12); ==》 46
- FLOOR(向下取整,返回小於等於該參數的最大整數):
select FLOOR (45.9); ==》 45
- TRUNCATE(截斷):
select TRUNCATE(45.926, 2); ==》 45.92
- MOD(求餘):
select MOD(1600, 300); ==》 100
- now(獲取當前日期+時間) :
select now(); ==》2020-03-25 22:41:03
- CURDATE(獲取當前日期) :
select CURDATE(); ==》2020-03-25
- CURTIME(獲取當前時間) :
select CURTIME(); ==》22:46:05
- str_to_date(將日期格式的字符轉換成指定格式的日期):
select STR_TO_DATE('9-13-1999','%m-%d-%Y'); ==》 1999-09-13
- date_format(將日期轉換成字符):
select DATE_FORMAT('2018/6/6','%Y年%m月%d日'); ==》 2018年06月06日
- if 函數: if else的效果
select if(10 < 5,'我比你小','我比你大'); ==》 我比你大
- case函數的使用:switch case的效果
SELECT last_name,job_id,salary,CASE job_id
WHEN 'IT_PROG' THEN 1.10 * salary
WHEN 'ST_CLERK' THEN 1.15 * salary
WHEN 'SA_REP' THEN 1.20 * salary
ELSE salary
END "REVISED_SALARY"
FROM employees;
- AVG() 平均值
- COUNT() 計算個數
select count(distinct real_name) from t_employee;
- MAX() 最大值
- MIN()最小值
- SUM() 求和
- 可以對 數值型數據使用AVG 和 SUM 函數
- 可以對 任意數據類型的數據使用 MIN 和 MAX 函數
- COUNT(*) 返回表中記錄總數,適用於 任意數據類型
- count(*) ,count(1),count(字段)那個效率高?
MYISAM存儲引擎下,count(*)的效率高
INNODB 存儲引擎下,它會使用最小的二級索引來進行 count 的查詢優化,count(*)和count(1)的效率差不多,比count(字段)效率高,字段的話是需要判斷是否爲空
分組查詢
- group by
select count(*),location_id from departments group by location_id having count(*)>2
- 分組前篩選 group by子句的前面 WHERE
- 分組後篩選 group by子句的後面 HAVING
- 分組函數做條件肯定是放在having子句中
- 能用分組前篩選的,就優先考慮使用分組前篩選
連接查詢
select name,boyName from beauty,boys;
-
笛卡爾集會在下面條件下產生:
– 省略連接條件
– 連接條件無效
– 所有表中的所有行互相連接 -
爲了避免笛卡爾集, 可以在 WHERE 加入有效的連接條件。
SELECT <select_list> FROM A INNER JOIN B ON A. KEY = B. KEY
- 特點:
添加排序,分組篩選
inner可以省略
篩選條件放在where後面,連接條件放在on後面,提高分離性,便於閱讀
inner join連接和sql92語法中的等值連接效果是一樣的,都是查詢多表的交集
- 應用場景:用於查詢一個表中有,另外一個表沒有的記錄
- 左外連接
SELECT <select_list> FROM A LEFT JOIN B ON A.key=B.key
- 右外連接
SELECT <select_list> FROM A RIGHT JOIN B ON A.key=B.key
- 全外
full outer join
內連接 + 左外 + 右外
- 交叉連接 ‘
cross join
就是笛卡爾乘積
- 全連接
SELECT <select_list> FROM A FULL JOIN B ON A.key=B.key
子查詢
-
注意事項
- 子查詢要包含在括號內。
- 將子查詢放在比較條件的右側。
- 單行操作符對應單行子查詢,多行操作符對應多行子查詢。
-
子查詢中的 HAVING 子句
- 首先執行子查詢。
- 向主查詢中的HAVING 子句返回結果
-
單行子查詢比較操作符
-
多行子查詢比較操作符
-
exists(完整的查詢語句)結果1或0
select * from t_employee where exists(select * from t_employee t where t.real_name='T_ommey')
分頁查詢
- 特點:
- limit語句放在查詢語句最後
- 公式((page-1)*size,size) ===》page頁數 size每頁顯示的條數
聯合查詢
-
union:合併、聯合,將多次查詢結果合併成一個結果
-
語法
查詢語句1
union 【all】
查詢語句2
union 【all】 -
意義
將一條比較複雜的查詢語句拆分成多條語句
適用於查詢多個表的時候,查詢的列基本是一致 -
特點
要求多條查詢語句的查詢列數必須一致
要求多條查詢語句的查詢的各列類型、順序最好一致
union 去重,union all包含重複項