Windows安裝OpenSSH服務
阿新 • • 發佈:2020-11-23
資料庫概述
一、資料庫的好處
- 可以持久化資料到本地
- 結構化查詢
二、資料庫常見概念 - DB:資料庫,儲存資料的容器
- DBMS:資料庫管理系統,又稱為資料庫軟體或資料庫產品,用於建立或管理DB
- SQL:結構化查詢語句,用於和資料庫通訊的語言,不是某個資料庫軟體特有的,而是幾乎所有主流資料庫軟體通用的語言
三、資料庫儲存資料的特點 - 資料存放到表中,然後表再放到庫中
- 一個庫中可以有多張表,每張表具有唯一的表名來標識自己
- 表中有一個或多個列,列又稱為“欄位”
- 表中的每一行資料,相當於jave中的物件
- 函式:類似於java的方法
單行函式
length concat substr instr trim upper lower ipad read replace
一、字元函式
- length 獲取引數數值的位元組字數
- concat 拼接字串
- upper、lower 轉大寫小寫
某個函式的返回值可以充當另一個函式的引數
- substr、substring 擷取字串
SELECT CONCAT(UPPER(SUBSTR(LAST_NAME,1,1)),'_',LOWER(SUBSTR(LAST_NAME,2))) OUT_PUT FROM EMPLOYEES;
- instr 返回子串第一次出現的索引,如果找不到返回0
- trim 去掉前後空格
SELECT LENGTH(TRIM(' 王思揚 ')) AS OUT_PUT
;
SELECT TRIM('A' FROM 'AAAA王思揚AAAAA')
- lpad 用指定的字元實現左填充指定長度
SELECT LPAD('殷素素',2,'*') AS out_put;
- rpad 用指定的字元實現右填充指定長度
- replace 替換
二、數學函式
- round 四捨五入
- ceil 向上取整,返回>=該引數的最小整數
- floor 向下取整,返回<=該引數的最大整數
- truncate 截斷
- mod 取餘 公式: a -⌊ a/b⌋ * b
三、日期函式
- now 返回當前系統日期+時間
- curdate
- curtime
- YEAR MONTH 年月日時分秒
- str_to_date 將字元通過指定的格式轉換成日期
- date_format 將日期轉換成字元
四、其他函式
- VERSION();
- DATABASE();
- USER();
五、流程控制函式
-
if函式; if else的效果
-
case函式
case 要判斷的欄位或表示式 when 常量1 then 要顯示的值1或語句2 when 常量2 then 要顯示的值2或語句2 ··· else 要顯示的值n或語句n; end SELECT salary 原始工資, department_id, CASE department_id WHEN 30 THEN salary*1.1 WHEN 40 THEN salary*1.2 WHEN 50 THEN salary*1.3 ELSE salary END AS 新工資 FROM employees;
case when 條件1 then 要顯示的值1或者語句1 when 條件2 then 要顯示的值2或者語句2 ··· else 要顯示的值n或語句n end SELECT salary, CASE WHEN salary>20000 THEN 'A' WHEN salary>15000 THEN 'B' WHEN salary>10000 THEN 'C' ELSE 'D' END
分組函式
功能:用作統計使用,又稱為聚合函式或統計函式或組函式
分類:
sum 求和 、avg 平均數、max 最大值、 min 最小值 、 count 計算個數
count函式的詳細介紹
匹配多列中值不為null或者0的都+1 主要是跟表的性質有關,一般使用count(*)來做統計
特點:
1.分組查詢中的篩選條件分為兩類
資料來源 位置 關鍵字
分組前篩選 原始表 group by 子句的前面 where
分組後篩選 分組後的結果集 group by 子句的後面 having
①分組函式做條件肯定是放在having子句中
②能用分組前篩選的,就有限考慮分組前篩選
2.group by 子句支援單個欄位分組,多個欄位分組
3.也可以新增排序(放在最後)
分組查詢
語法:
select 分組函式,列 (要求出現在group by的後面)
from 表
【where 篩選條件】
group by 分組列表
【having 分組後的篩選】
【order by 子句】
注意:
查詢列表必須特殊,要求是分組函式和group by後出現的欄位
連線查詢
含義:又稱多表查詢,當查詢的欄位來至多個表時,就會用到連線查詢。
笛卡爾乘積現象:表1 有m行,表2有n行,結果=m*n行
發生原因:沒有有效的連線條件
如何避免:新增有效的連線條件
sql92語法
內連線
1.等值
select 查詢列表
from 表1 別名,表2 別名
where 表1.key=表2.key
【and 篩選條件】
【group by 分組欄位】
【having 分組後的篩選】
【order by 排序欄位】
特點:
①一般為表起別名
②多表的順序可以調換
③n表連線至少需要n-1個連線條件
④等值連線的結果是多表的交集部分
2.非等值
select 查詢列表
from 表1 別名,表2 別名
where 非等值連線條件
【and 篩選條件】
【group by 分組欄位】
【having 分組後的篩選】
【order by 排序欄位】
3.自連線
select 查詢列表
from 表 別名1,表 別名2
where 等值連線條件
【and 篩選條件】
【group by 分組欄位】
【having 分組後的篩選】
【order by 排序欄位】
外連線
4.左外
5.右外
6.全外
交叉連線
sql99語法
語法:
select 查詢列表
from 表1 別名 【連線型別】
join 表2 別名 on 連線條件
【where 篩選條件】
【group by 分組】
【having 篩選條件】
【order by 排序列表】
分類:
內連線:inner語法:
select 查詢列表
from 表1 別名
inner join 表2 別名 表2也可以在括號內加上子查詢
on 連線條件
等值
特點:
①新增排序、分組、篩選
②inner可以省略
③篩選條件放在where後面,連線條件放在on後面,提高分離性,便於閱讀
④ 和sql92語法一樣都是查詢表的交集結果
非等值
自連線
外連線:
應用場景:用於查詢一張表中有,另一個表沒有的記錄。
特點:
1、外連線的查詢結果為主表中的所有記錄
如果從表中有和它匹配的,則顯示匹配的值
如果從表中沒有和它匹配的,則顯示null
外連線查詢結果=內連線結果+主表中有而從表沒有的記錄
2、左外連線,left join左邊的是主表
右外連線,right join右邊的是主表
3、左外和右外交換連個表的順序,可以實現同樣的效果
4、全外連線=內連線的結果+表1中有但表2沒有的+表2中沒有但表1中沒有的
左外 left【outer】
右外 right【outer】
全外 full【outer】
交叉連線:cross
笛卡爾乘積
子查詢
含義:
出現在其他語句中的select語句,稱為子查詢或內查詢
外部的查詢語句,稱為主查詢或外查詢
分類:
按子查詢出現的位置
- select後面
- 僅僅支援標量子查詢
- from後面
- 表子查詢
- where或having後面
- 標量子查詢
- 列子查詢==
- 行子查詢
- exists
- 表子查詢
按結果集的行數列不同:
- 標量子查詢(結果集只有一行一列)
- 列子查詢(結果集只有一列多行)
- 行子查詢(結果集有一行多列)
- 表子查詢(結果集一般為多行多列)
一、where或having後面
標量子查詢(單行子查詢)
案例1:誰的工作比Abel高
①查詢Abel的工資
SELECT salary
FROM employees
WHERE last_name = 'Abel'
②查詢員工的資訊,滿足 salary>①結果
SELECT *
FROM employees
WHERE salary>(SELECT salary
FROM employees
WHERE last_name = 'Abel'
);
案例2:返回job_id與141員工相同,salary比143號員工多的員工 姓名,job_id 和工資
①查詢141好員工job_id
SELECT job_id
FROM empoyees
WHERE employee_id = 141
② 查詢143號員工的salary
SELECT salary
FROM empoyees
WHERE employee_id = 143
③查詢員工的姓名,job_id 和工資 要求job_id=①並且salary>②
SELECT laste_name,job_id,salary
FROM employees
WHERE job_id = (SELECT job_id
FROM empoyees
WHERE employee_id = 141
) AND salary>(SELECT salary
FROM empoyees
WHERE employee_id = 143
);
案例3:返回工資工資最少的員工的last_name,job_id和salary
①查詢公司的最低工資
SELECT MIN(salary)
FROM employees
②查詢last_name,job_id和salary 要求salary=①
SELECT last_name,job_id,salary
FROM employees
WHERE salary=(
SELECT MIN(salary)
FROM employees
);
案例4:查詢最低工資大於50號部門最低工資的部門id和其最低工資
①查詢50號部門的最低工資
SELECT MIN(salary)
FROM employees
WHERE department_id = 50
②查詢每個部門的最低工資
SELECT MIN(salary),department_id
FROM employees
GROUP BY department_id
③ 在二的基礎上篩選②,滿足min(salary)>①
SELECT MIN(salary),department_id
FROM employees
GROUP BY department_id
HAVING MIN(salary)>(
SELECT MIN(salary)
FROM employees
WHERE department_id = 50
);
④子查詢的執行優先於主查詢執行,著查詢的條件用到子查詢的結果
列子查詢尋,一般搭配著多行操作符使用
2. 列子查詢(多行子查詢)
**多行操作符:**
"IN:在範圍內的值,只要有就true
ALL: 與子查詢返回的所有值比較為true 則返回true
ANY/SOME:與子查詢返回的任何值比較為true 則返回true"
案例1:返回location_id是1400或1700部門中的所有員工姓名
①查詢location_id是1400或1700的部門編號
SELECT department_id DISTINCT去重
FROM departments
WHERE location_id IN(1400,1700)
②查詢員工姓名,要求部門號是①列表中的某一個
SELECT last_name
FROM employess
WHERE department_id(
SELECT department_id
FROM departments
WHERE location_id IN(1400,1700)
);
- 行字查詢(多列多行)
特點:
①子查詢放在小括號內
②子查詢一般放在條件右側
③標量子查詢,一般搭配著當行操作符使用 "> < <= >= = <>"
分頁查詢
應用場景:當要顯示的資料,一頁顯示不全,需要分頁提交sql請求
語法:
select 查詢列表 7
from 表 1
【join type】 join 表2 2
on 連線條件 3
where 篩選條件 4
group by 分組欄位 5
having 分組後的篩選 6
order by 排序的欄位 8
limit offset,size 9
offset要顯示條目的起始索引(從0開始)
size要顯示的條目個數
select * from employees limit 0,5;
DDL
資料庫定義語言,對庫和表的管理
- 建立:create
create database 庫名; - 修改:alter
- 刪除:drop
drop database 庫名;
建立表
create table 表名(
列名 列的型別 【(長度) 約束】,
列名 列的型別 【(長度) 約束】,
列名 列的型別 【(長度) 約束】,
列名 列的型別 【(長度) 約束】,
...
列名 列的型別 【(長度) 約束】
)
修改表名
修改列的型別或約束
新增心列
刪除列
修改表名
複習sql查詢語句
SELECT
last_name,
department_id,
salary*12*(1+IFNULL(commission_pct,0)) AS 年薪,
FROM
employees;
- 一般白勺的後面就是要查詢的東西,白勺的前面是條件
- or或者等於取並集
DQL查詢語言
基礎查詢語法
select 查詢列表
from 表明;
特點:1.查詢列表可以說欄位、常量、表示式、函式,也可以多個
2.查詢結果是一張虛擬表
3.字元型和日期型的常量值必須用單引號引起來,數值型不需要
4.簡單的數學運算 > < <= >= = <>
distinct
select 函式名(實參列表);
+
select 數值+數值 直接運算
select 字元+數值 先試圖轉換字元為數值,成功的話就運算,否則轉換成0
select null+值 都為null
concat函式:拼接函式
select concat(字元1,字元2,) 多個欄位顯示為一行
ifnull函式:判斷某欄位或表示式是否為null,如果為null返回指定的值,否則返回原本的值
select ifnull(commission_pct,0) from employees;
isnull函式 為null返回1=是,不為null返回0=否
條件查詢
select 查詢列表 3
from 表明 1
where 篩選條件 2
篩選條件分類
1、簡單條件運算子
> < = <> != <=> >= <=
2、邏輯運算子
&& and
|| or
! not
3、模糊查詢
like:一般搭配萬用字元使用,可以判斷字元型和數值型
select * from employees where department_id like '1__';
萬用字元: % 任意多個 _任意單個
between and
in
is null /is not null
排序查詢
語法:
select 查詢列表 3
from 表 1
【where 篩選條件】 2
order by 排序列表 【asc|desc】預設升序 4
特點:1. order by 後面支援表示式、單個欄位、別名、函式、多個欄位排序。
2. 多個欄位排序的關係:先排第一個欄位、然後再排
3. order by 一般都放在查詢語句的後面,limit字句除外
select last_name,salary
from employees
where salary not between 8000 and 17000 | NOT(salary between 8000 and 17000)
order by salry DESC;
常見函式
函式:類似於java的方法,將一組邏輯語句封裝在方法中,對外暴露方法名
1. 隱藏了實現細節 2. 提升程式碼重要性
呼叫:select 函式名(實參列表) 【from 表】;
特點:叫什麼,實現什麼效果。
分類:
1. 當行函式
如 concat、length、ifnull等
2. 分組函式,又稱為統計函式、聚合函式。
做統計使用