Mysql基礎部分總結

Mysql基本語法:

文末有mysql資料mysql

執行順序:spring

from -> join -> on -> where -> groupby -> avg max .. -> having -> select ->order bysql

SQL語言分類:數據庫

  • DQL:數據查詢語言
  • DML:數據操做語言
  • DDL:數據定義語言
  • DCL:數據控制語言

DQL

data query language服務器

SELECT:

  • 能夠理解爲Java的System.out.println()的輸出;
  • 輸出內容能夠是
    • 字段 select 字段名 from 表名
    • 常量 select 90
    • 函數 select concat('a', 'bbb');
    • 表達式 select 100/1234;
    • 起別名 select last_name as '姓名
    • 去重 select DISTINCT department_id

關於 select中的 '+':

  • select 數值+數值; 直接運算
  • select 字符+數值;先試圖將字符轉換成數值,若是轉換成功,則繼續運算;不然轉換成0,再作運算
    • select 'aa'+70 #70
    • select 70 +'30' #100
  • select null+值;結果都爲null

描述表結構:

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

常見函數:

字符函數

  • LOWER(str)
  • UPPER(str)
  • CONCAT(str1,str2,...)
  • SUBSTR(str,pos,len) ps:有多種重載函數
  • LENGTH(str)
  • INSTR(str,substr) 返回子串的第一次出現的索引
  • TRIM([remstr FROM] str) 默認去除先後空格
    • SELECT LENGTH(TRIM('a' FROM "aaa123aaa")) as '長度' => 123
  • REPLACE(str,from_str,to_str)
  • LPAD(str,len,padstr) ,RPAD(str,len,padstr) 用指定字符填充指定長度
    • SELECT LPAD('aaaaa','10','#') => #####aaaaa

數學函數

  • ROUND(X,D) 四捨五入
    • ROUND(45.926,2) => 45.93
  • TRUNCATE 截斷
    • TRUNCATE(45.926,2) =>45.92
  • MOD :求餘

日期函數

  • now :當前時間函數

  • STR_TO_DATE(str,format):將日期格式的字符轉換成指定格式的日期性能

    • STR_TO_DATE('2017-01-06 10:20:30','%Y-%m-%d %H:%i:%s')
    • 2017-01-06 10:20:30
  • DATE_FORMAT(date,format) :將日期轉換成字符code

    • DATE_FORMAT('2021223','%Y年%m月%d日')

流程控制函數

-練習-

#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

  1. 忽略null值,不計入
  2. 搭配distinct去重
  • AVG() 數值型
  • SUM() 數值型
  • COUNT() 任意數據類型
  • MAX() 任意數據類型
  • MIN() 任意數據類型
COUNT(*):

​ 爲何使用推薦使用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:查新的結果來自多個表,且多個表沒有直接的鏈接關係,但查詢的信息一致

特色:

  1. 查詢的列數是一致的,順序也最好一致
  2. union默認去重,若是使用 union all 可包含重複項

鏈接查詢:

笛卡爾乘積現象:

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
sql99語法
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')

交叉鏈接:

即笛卡爾乘積結果


子查詢:

分類:

  1. 標量子查詢 - 結果集只有一行一列
  2. 列子查詢 -一列多行 (單一字段)
  3. 行子查詢 -一行多列(能夠多行多列,多字段)
  4. 表子查詢 -多行多列

位置:

  1. select +標量子查詢
  2. from +表子查詢
  3. where /having +(標量+列查詢+行)
  4. exists

where /having :

  • 標量子查詢
  • 列子查詢
  • 行子查詢

特色:

  • 標量查詢 搭配 單行操做符 > < <> >= <=
  • 列子查詢 搭配 多行操做符 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
)

select:

標量子查詢
#查詢每一個部門的員工個數,顯示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
*/

from:

#查詢每一個部門的平均工資的工資等級
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(相關子查詢):

/*
語法:
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

DML:

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 區別:

  1. truncate刪除後,若是再插入,標識列從1開始
    delete刪除後,若是再插入,標識列從斷點開始
  2. delete能夠添加篩選條件
    truncate不能夠添加篩選條件
  3. truncate效率較高
  4. truncate沒有返回值
    delete能夠返回受影響的行數
  5. truncate不能夠回滾
    delete能夠回滾

DDL:

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

  • ①均可以設置無符號和有符號,默認有符號,經過unsigned設置無符號(沒有符數)
  • 長度
    • 存放數據大小依據數據類型已經肯定. 而長度表明顯示的最大寬度,而不夠則用左邊0填充,但需搭配zerofill,而且默認爲無符號整型

浮點型:

  • 定點數:decimal(M,D)
  • 浮點數: float(M,D) , double(M,D)

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 日期時間

6ZNBuT.png

約束:

  • NOT NULL:非空,該字段的值必填
  • UNIQUE:惟一,該字段的值不可重複
  • DEFAULT:默認,該字段的值不用手動插入有默認值
  • CHECK:檢查,mysql不支持
  • PRIMARY KEY:主鍵,該字段的值不可重複而且非空 unique+not null
  • FOREIGN KEY:外鍵,用於限制兩個表的關係,在從表添加外鍵約束,用於引用主表某列的值

主鍵,外鍵:

主鍵:一個表至多有一個主鍵,但能夠有多個惟一

外鍵:

  1. 在從表設置外鍵關係
  2. 從表外鍵列類型 和 主表的關聯列類型要求一致或兼容
  3. 主表的關聯列必須是一個key(主鍵,惟一)
  4. 插入數據 ,先插入主表,再刪除從表
    • 刪除數據時,先刪除從表,再刪除主表
支持類型 是否可起約束名
列級約束 外鍵約束沒有效果 不能夠
表級約束 除了非空和默認 能夠,但對主鍵無效
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 表名

標識列:

自增加列:

  • 一個表至多有一個自增加列
  • 自增加列只能支持數值型
  • 自增加列必須爲一個key

TCL

Transaction Control Language 事務控制語言

事務:一條或多條sql語句組成一個執行單位,一組sql語句要麼都執行要麼都不執行

事務特色:

  • A: Atomicity 一個事務是不可再分割的總體,要麼都執行要麼都不執行
  • C: Consistency 一個事務可使數據從一個一致狀態切換到另一個一致的狀態
  • I:Isolation 一個事務不受其餘事務的干擾,多個事務互相隔離的
  • D:Durability 一個事務一旦提交了,則永久的持久化到本地
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:

  • 多個地方用到一樣的查詢結果
  • 使用的sql語句比較複雜
#建立
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)
參數模式:
  • in:該參數可做爲輸入
  • out:該參數能夠做爲返回值
  • inout:輸入+返回值

調用: 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

函數:

區別:

  • 存儲過程:能夠有0個返回,也能夠有多個返回 ,批量操做
  • 函數: 有且僅有一個1個 , 適合處理數據返回結果
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 函數名(參數列表)

DCL:

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,操做更方便哦

相關文章
相關標籤/搜索