mysql数据库asc_mysql数据库
MySQL
數據庫的相關概念
一、數據庫的好處
1、可以持久化數據到本地
2、結構化查詢
二、數據庫的常見概念
1、DB:數據庫,存儲數據的容器
2、DBMS:數據庫管理系統,又稱為數據庫軟件或數據庫產品,用于創建或管理DB
3、SQL:結構化查詢語言,用于和數據庫通信的語言,不是某個數據庫軟件特有的,而是幾乎所有的主流數據庫軟件通用的語言
三、數據庫存儲數據的特點
1、數據存放到表中,然后表再放到庫中
2、一個庫中可以有多張表,每張表具有唯一的表名用來標識自己
3、表中有一個或多個列,列又稱為“字段”,相當于java中“屬性”
4、表中的每一行數據,相當于java中“對象”
四、常見的數據庫管理系統
mysql、oracle、db2、sqlserver
DQL語言
DQL(Data Query Language) 數據查詢語言
基礎查詢
一、語法
select 查詢列表
from 表名;
二、特點
查詢列表可以是字段、常量、表達式、函數,也可以是多個
查詢結果是一個虛擬表
三、示例
1、查詢單個字段
select 字段名 from 表名;
2、查詢多個字段
select 字段名,字段名 from 表名;
3、查詢所有字段
select * from 表名
4、查詢常量
select 常量值;
注意:字符型和日期型的常量值必須用單引號引起來,數值型不需要
5、查詢函數
select 函數名(實參列表);
例如: select version();
6、查詢表達式
select 100/1234;
7、起別名
1) as
2) 空格
例如:
select last_name as 姓, first_name as 名 from employees limit 5;
select last_name 姓, first_name 名 from employees limit 5;
# 取的別名擁有空格等特殊符號需要使用引號引起來即可, 三種引號皆可
select 100 as "out put", 102 as `out put`, 103 as 'out put';
8、去重
select distinct 字段名 from 表名;
9、+
作用:做加法運算
select 數值+數值; 直接運算
select 字符+數值;先試圖將字符轉換成數值,如果轉換成功,則繼續運算;否則轉換成0,再做運算
select null+值;結果都為null
example: select 1+2, '12'+ 2, '1'+ '2', null + 2; -> 3, 14, 3, null
10、【補充】concat函數
功能:拼接字符
select concat(字符1,字符2,字符3,...);
select concat(last_name, ' ', first_name) as '姓名' from employees;
11、【補充】ifnull函數
功能:判斷某字段或表達式是否為null,如果為null 返回指定的值,否則返回原本的值
select ifnull(commission_pct,0) from employees; 字符串拼接上可能有用.
12、【補充】isnull函數
功能:判斷某字段或表達式是否為null,如果是,則返回1,否則返回0
13、CONCAT_WS函數
CONCAT_WS(separator,str1,str2,...)
功能:和concat一樣,拼接字符,第一個參數是分隔符,用來拼接后面的每一個參數, 類似于python的字符串的join方法。
條件查詢
一、語法
select 查詢列表
from 表名
where 篩選條件
二、篩選條件的分類
1、簡單條件運算符
< = <> != >= <= <=>安全等于
2、邏輯運算符
&& and
|| or
! not
3、模糊查詢
like:一般搭配通配符使用,可以判斷字符型 或 數值型
通配符:%任意多個字符,_任意單個字符
例子: _需要進行轉義
select
last_name
from
employees
where
last_name like '_\_%';
或者 使用escape來標明什么是轉義字符
select
last_name
from
employees
where
last_name like '_$_%' escape '$';
between and
in
is null /is not null:用于判斷null值
is null PK <=>
普通類型的數值 null值 可讀性
is null × √ √
<=> √ √ ×
排序查詢
一、語法
select 查詢列表
from 表
where 篩選條件
order by 排序列表 【asc}desc】
二、特點
1、asc :升序,如果不寫默認升序
desc:降序
2、排序列表 支持 單個字段、多個字段、函數、表達式、別名
# 例子, 根據年薪進行排序
SELECT
*, (salary * (1 + ifnull( commission_pct, 0)) * 12) as year_salary
FROM
employees
ORDER BY
year_salary DESC;
# 按照員工的姓名的長度進行排序
select
*, concat(first_name, ' ', last_name) as 'name'
from
employees
order by
length(name) desc;
3、order by的位置一般放在查詢語句的最后(除limit語句之外)
常見函數
一、概述
好處:提高重用性和隱藏實現細節
調用:select 函數名(實參列表),和程序中的函數使用方法類似.
二、單行函數
1、字符函數
concat:連接
substr:截取子串
# sql中的索引都是從1開始的
# 只有一個參數表示從指定索引往后截取剩下的.
select substr('中國人民站起來了', 4) as out_put;
# 兩個參數時, 第一個參數是起始索引位置, 第二個參數是截取的長度
select substr('中國人民站起來了', 2, 3) as out_put;
upper:變大寫
lower:變小寫
replace:替換 全部替換
select replace('aaaabbbbcccc', 'b', 'x'); --> aaaaxxxxcccc
length:獲取字節長度, 需要根據編碼類型來看
select length('漢字123') --> 9
trim:去前后空格
# 去除前后指定的字符, 默認是去除空格
select trim('a' from 'aaaa中國aaa人aaaaa'); ---> 中國aaa人
lpad:用指定字符左填充
select lpad('ab', 5, 'x'); --> abxxx
select rpad('abcde', 3, 'x'); --> abc 相當于被截取了
rpad:用指定字符右填充
instr:獲取子串第一次出現的索引, 不存在則返回0, 索引位置從1開始
2、數學函數
ceil:向上取整
round:四舍五入
mod:取模
# mod的算法: a % b = a - a / b * b 除是整除
select mod(-10, -3); --> -1
select mod(-10, 3); --> -1
floor:向下取整
truncate:截斷
rand:獲取隨機數,返回0-1之間的小數
3、日期函數
now:返回當前日期+時間
year:返回年
month:返回月
day:返回日
date_format:將日期轉換成字符
curdate:返回當前日期
str_to_date:將字符轉換成日期
curtime:返回當前時間
hour:小時
minute:分鐘
second:秒
datediff:返回兩個日期相差的天數
monthname:以英文形式返回月
4、其他函數
version 當前數據庫服務器的版本
database 當前打開的數據庫
user當前用戶
password('字符'):返回該字符的密碼形式
md5('字符'):返回該字符的md5加密形式
5、流程控制函數
1 if(條件表達式,表達式1,表達式2):如果條件表達式成立,返回表達式1,否則返回表達式2
2 case 情況1
case 變量或表達式或字段
when 常量1 then 值1
when 常量2 then 值2
...
else 值n
end
# 例子
/*
部門id是30, 工資1.1
部門id是40, 工資1.2
部門id是50, 工資1.3
否則, 不變
*/
SELECT
salary AS 原始工資,
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;
3 case 情況2
case
when 條件1 then 值1
when 條件2 then 值2
...
else 值n
end
# 例子
/*
工資> 20000 a級別
工資> 15000 a級別
工資> 10000 a級別
否則, d
*/
select
salary as '工資',
case
when salary > 20000 then 'A'
when salary > 15000 then 'B'
when salary > 10000 then 'C'
else 'D'
end as '工資級別'
from
employees;
三、分組函數
1、分類
max 最大值
min 最小值
sum 和
avg 平均值
count 計算個數
2、特點
1 語法
select max(字段) from 表名;
2 支持的類型
sum和avg一般用于處理數值型
max、min、count可以處理任何數據類型
3 以上分組函數都忽略null
4 都可以搭配distinct使用,實現去重的統計
select sum(distinct 字段) from 表;
5 count函數
count(字段):統計該字段非空值的個數
count(*):統計結果集的行數
案例:查詢每個部門的員工個數
1 xx 10
2 dd 20
3 mm 20
4 aa 40
5 hh 40
count(1):統計結果集的行數
效率上:
MyISAM存儲引擎,count(*)最高
InnoDB存儲引擎,count(*)和count(1)效率>count(字段)
6 和分組函數一同查詢的字段,要求是group by后出現的字段
分組查詢
一、語法
select 分組函數,分組后的字段
from 表
【where 篩選條件】
group by 分組的字段
【having 分組后的篩選】
【order by 排序列表】
二、特點
使用關鍵字 篩選的表 位置
分組前篩選where 原始表 group by的前面
分組后篩選having 分組后的結果group by 的后面
3、分組類型
1. 通用分組, 按單個字段分組
# 查詢領導編號>102的每個領導手下的最低工資>5000的領導編號是哪個,以及最低工資
select
manager_id,
min(salary) as min_salary
from
employees
where
manager_id > 102
group by
manager_id
having
min_salary > 5000;
2. group by 支持使用函數的結果來進行分組
# having和group by 都支持使用別名來進行分組和篩選
# 按員工的名的長度分組, 查詢每一組的員工個數, 并且員工個數>5的有哪些.
select
length(last_name) as length_name,
count(*) as count_num
from
employees
group by
length_name
having
count_num > 5;
3. 支持多個字段進行分組
# 查詢每個部門每個工種的員工的平均工資, 并按工資排序
# 這種類似于聯合主鍵一樣, 部門id和工種一樣的才算是一組
select
avg(salary),
department_id,
job_id
from
employees
group by
department_id, job_id
having
avg(salary) > 10000
order by
avg(salary);
連接查詢
一、含義
當查詢中涉及到了多個表的字段,需要使用多表連接
select 字段1,字段2
from 表1,表2,...;
笛卡爾乘積:當查詢多個表時,沒有添加有效的連接條件,導致多個表所有行實現完全連接
如何解決:添加有效的連接條件
二、分類
按年代分類:
sql92:
等值
非等值
自連接
也支持一部分外連接(用于oracle、sqlserver,mysql不支持)
sql99【推薦使用】
內連接
等值
非等值
自連接
外連接
左外
右外
全外(mysql不支持)
交叉連接
三、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 排序字段】
四、SQL99語法
1、內連接
語法:
select 查詢列表
from 表1 別名
【inner】 join 表2 別名 on 連接條件
where 篩選條件
group by 分組列表
having 分組后的篩選
order by 排序列表
limit 子句;
特點:
①表的順序可以調換
②內連接的結果=多表的交集
③n表連接至少需要n-1個連接條件
分類:
等值連接
非等值連接
自連接
2、外連接
語法:
select 查詢列表
from 表1 別名
left|right|full【outer】 join 表2 別名 on 連接條件
where 篩選條件
group by 分組列表
having 分組后的篩選
order by 排序列表
limit 子句;
特點:
①查詢的結果=主表中所有的行,如果從表和它匹配的將顯示匹配行,如果從表沒有匹配的則顯示null
②left join 左邊的就是主表,right join 右邊的就是主表
full join 兩邊都是主表
③一般用于查詢除了交集部分的剩余的不匹配的行
3、交叉連接
語法:
select 查詢列表
from 表1 別名
cross join 表2 別名;
特點:
類似于笛卡爾乘積
子查詢
一、含義
嵌套在其他語句內部的select語句稱為子查詢或內查詢,
外面的語句可以是insert、update、delete、select等,一般select作為外面語句較多
外面如果為select語句,則此語句稱為外查詢或主查詢
二、分類
1、按出現位置
select后面:
僅僅支持標量子查詢
from后面:
表子查詢
where或having后面:
標量子查詢
列子查詢
行子查詢
exists后面:
標量子查詢
列子查詢
行子查詢
表子查詢
2、按結果集的行列
標量子查詢(單行子查詢):結果集為一行一列
列子查詢(多行子查詢):結果集為多行一列
行子查詢:結果集為多行多列
表子查詢:結果集為多行多列
三、示例
where或having后面
1、標量子查詢
案例:查詢最低工資的員工姓名和工資
①最低工資
select min(salary) from employees
②查詢員工的姓名和工資,要求工資=①
select last_name,salary
from employees
where salary=(
select min(salary) from employees
);
2、列子查詢
案例:查詢所有是領導的員工姓名
①查詢所有員工的 manager_id
select manager_id
from employees
②查詢姓名,employee_id屬于①列表的一個
select last_name
from employees
where employee_id in(
select manager_id
from employees
);
# 查詢有員工表的部門名字, 相當于拿著部門表的每條記錄去和員工表的記錄做篩選, 看是否存在值
# exists本質上是返回一個bool值類型的數據
select department_name
from departments as d
where exists(
select d.department_id from employees as e
where d.department_id = e.department_id
)
分頁查詢
一、應用場景
當要查詢的條目數太多,一頁顯示不全
二、語法
select 查詢列表
from 表
limit 【offset,】size;
注意:
offset代表的是起始的條目索引,默認從0卡死
size代表的是顯示的條目數
公式:
假如要顯示的頁數為page,每一頁條目數為size
select 查詢列表
from 表
limit (page-1)*size,size;
連接的總的順序語法:(這里存疑?)
select 查詢列表 ⑦
from 表1 別名 ①
連接類型 join 表2 ②
on 連接條件 ③
where 篩選 ④
group by 分組列表 ⑤
having 篩選 ⑥
order by排序列表 ⑧
limit 起始條目索引,條目數; ⑨
聯合查詢
一、含義
union:合并、聯合,將多次查詢結果合并成一個結果
二、語法
查詢語句1
union 【all】
查詢語句2
union 【all】
...
三、意義
1、將一條比較復雜的查詢語句拆分成多條語句
2、適用于查詢多個表的時候,查詢的列基本是一致
四、特點
1、要求多條查詢語句的查詢列數必須一致
2、要求多條查詢語句的查詢的各列類型、順序最好一致
3、union 去重,union all包含重復項 即union默認是去重的.
DML語言
DML(Data Manipulation Language)數據操縱語言
插入
一、方式一
語法:
insert into 表名(字段名,...) values(值,...);
特點:
1、要求值的類型和字段的類型要一致或兼容
2、字段的個數和順序不一定與原始表中的字段個數和順序一致
但必須保證值和字段一一對應
3、假如表中有可以為null的字段,注意可以通過以下兩種方式插入null值
①字段和值都省略
②字段寫上,值使用null
4、字段和值的個數必須一致
5、字段名可以省略,默認所有列
二、方式二
語法:
insert into 表名 set 字段=值,字段=值,...;
兩種方式 的區別:
1.方式一支持一次插入多行,語法如下:
insert into 表名【(字段名,..)】 values(值,..),(值,...),...;
2.方式一支持子查詢,語法如下:
insert into 表名
查詢語句;
修改
一、修改單表的記錄
語法:update 表名 set 字段=值,字段=值 【where 篩選條件】;
二、修改多表的記錄【補充】
語法:
update 表1 別名
left|right|inner join 表2 別名
on 連接條件
set 字段=值,字段=值
where 篩選條件;
刪除
方式一:使用delete
一、刪除單表的記錄★
語法:delete from 表名 【where 篩選條件】【limit 條目數】
二、級聯刪除[補充]
語法:
delete 別名1,別名2 from 表1 別名
inner|left|right join 表2 別名
on 連接條件
【where 篩選條件】
方式二:使用truncate
語法:truncate table 表名
兩種方式的區別【面試題】
1.truncate刪除后,如果再插入,標識列從1開始
delete刪除后,如果再插入,標識列從斷點開始
2.delete可以添加篩選條件
truncate不可以添加篩選條件
3.truncate效率較高
4.truncate沒有返回值
delete可以返回受影響的行數
5.truncate不可以回滾
delete可以回滾
DDL語言
DDL(數據定義語言,Data Definition Language)
庫的管理
一、創建庫
create database 【if not exists】 庫名【 character set 字符集名】;
二、修改庫
alter database 庫名 character set 字符集名;
三、刪除庫
drop database 【if exists】 庫名;
表的管理
一、創建表 ★
create table 【if not exists】 表名(
字段名 字段類型 【約束】,
字段名 字段類型 【約束】,
。。。
字段名 字段類型 【約束】
)
二、修改表
1.添加列
alter table 表名 add column 列名 類型 【first|after 字段名】;
2.修改列的類型或約束
alter table 表名 modify column 列名 新類型 【新約束】;
3.修改列名
alter table 表名 change column 舊列名 新列名 類型;
4 .刪除列
alter table 表名 drop column 列名;
5.修改表名
alter table 表名 rename 【to】 新表名;
三、刪除表
drop table【if exists】 表名;
四、復制表
1、復制表的結構
create table 表名 like 舊表;
2、復制表的結構+數據
create table 表名
select 查詢列表 from 舊表【where 篩選】;
數據類型
一、數值型
1、整型
tinyint、smallint、mediumint、int/integer、bigint
1 2 3 4 8
特點:
①都可以設置無符號和有符號,默認有符號,通過unsigned設置無符號
②如果超出了范圍,會報out or range異常,插入臨界值(5.5), 后面版本報錯
③長度可以不指定,默認會有一個長度
長度代表顯示的最大寬度,如果不夠則左邊用0填充,但需要搭配zerofill,并且默認變為無符號整型
2、浮點型
定點數:decimal(M,D)
浮點數:
float(M,D) 4
double(M,D) 8
特點:
①M代表整數部位+小數部位的個數,D代表小數部位
②如果超出范圍,則報out or range異常,并且插入臨界值
③M和D都可以省略,但對于定點數,M默認為10,D默認為0
④如果精度要求較高,則優先考慮使用定點數
二、字符型
char、varchar、binary、varbinary、enum、set、text、blob
char:固定長度的字符,寫法為char(M),最大長度不能超過M,其中M可以省略,默認為1
varchar:可變長度的字符,寫法為varchar(M),最大長度不能超過M,其中M不可以省略
三、日期型
year年
date日期
time時間
datetime 日期+時間 8
timestamp 日期+時間 4 比較容易受時區、語法模式、版本的影響,更能反映當前時區的真實時間
常見的約束
一、常見的約束
NOT NULL:非空,該字段的值必填
UNIQUE:唯一,該字段的值不可重復
DEFAULT:默認,該字段的值不用手動插入有默認值
CHECK:檢查,mysql不支持
PRIMARY KEY:主鍵,該字段的值不可重復并且非空 unique+not null
FOREIGN KEY:外鍵,該字段的值引用了另外的表的字段
主鍵和唯一
1、區別:
①、一個表至多有一個主鍵,但可以有多個唯一
②、主鍵不允許為空,唯一可以為空
2、相同點
都具有唯一性
都支持組合鍵,但不推薦
★注意: 唯一約束在5.7版本允許多個值為空
外鍵:
1、用于限制兩個表的關系,從表的字段值引用了主表的某字段值
2、外鍵列和主表的被引用列要求類型一致,意義一樣,名稱無要求
3、主表的被引用列要求是一個key(一般就是主鍵)
4、插入數據,先插入主表
刪除數據,先刪除從表
可以通過以下兩種方式來刪除主表的記錄
#方式一:級聯刪除
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;
#方式二:級聯置空
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;
二、創建表時添加約束
create table 表名(
字段名 字段類型 not null,#非空
字段名 字段類型 primary key,#主鍵
字段名 字段類型 unique,#唯一
字段名 字段類型 default 值,#默認
constraint 約束名 foreign key(字段名) references 主表(被引用列)
)
注意:
支持類型可以起約束名
列級約束除了外鍵不可以
表級約束除了非空和默認可以,但對主鍵無效
列級約束可以在一個字段上追加多個,中間用空格隔開,沒有順序要求
三、修改表時添加或刪除約束
1、非空
添加非空
alter table 表名 modify column 字段名 字段類型 not null;
刪除非空
alter table 表名 modify column 字段名 字段類型 ;
2、默認
添加默認
alter table 表名 modify column 字段名 字段類型 default 值;
刪除默認
alter table 表名 modify column 字段名 字段類型 ;
3、主鍵
添加主鍵
alter table 表名 add【 constraint 約束名】 primary key(字段名);
刪除主鍵
alter table 表名 drop primary key;
4、唯一
添加唯一
alter table 表名 add【 constraint 約束名】 unique(字段名);
刪除唯一
alter table 表名 drop index 索引名;
5、外鍵
添加外鍵
alter table 表名 add【 constraint 約束名】 foreign key(字段名) references 主表(被引用列);
刪除外鍵
alter table 表名 drop foreign key 約束名;
四、自增長列
特點:
1、不用手動插入值,可以自動提供序列值,默認從1開始,步長為1
auto_increment_increment
如果要更改起始值:手動插入值
如果要更改步長:更改系統變量
set auto_increment_increment=值;
2、一個表至多有一個自增長列
3、自增長列只能支持數值型
4、自增長列必須為一個key
一、創建表時設置自增長列
create table 表(
字段名 字段類型 約束 auto_increment
)
二、修改表時設置自增長列
alter table 表 modify column 字段名 字段類型 約束 auto_increment
三、刪除自增長列
alter table 表 modify column 字段名 字段類型 約束
TCL語言
事務
一、含義
事務:一條或多條sql語句組成一個執行單位,一組sql語句要么都執行要么都不執行
二、特點(ACID)
A 原子性:一個事務是不可再分割的整體,要么都執行要么都不執行
C 一致性:一個事務可以使數據從一個一致狀態切換到另外一個一致的狀態
I 隔離性:一個事務不受其他事務的干擾,多個事務互相隔離的
D 持久性:一個事務一旦提交了,則永久的持久化到本地
三、事務的使用步驟 ★
了解:
隱式(自動)事務:沒有明顯的開啟和結束,本身就是一條事務可以自動提交,比如insert、update、delete
顯式事務:具有明顯的開啟和結束
使用顯式事務:
①開啟事務
1. set autocommit=0; 用來禁止使用當前會話的自動提交。這就相當于一直處于事務狀態.
2. start transaction 或 begin;
②編寫一組邏輯sql語句
注意:sql語句支持的是insert、update、delete
設置回滾點:
savepoint 回滾點名;
③結束事務
提交:commit;
回滾:rollback;
回滾到指定的地方:rollback to 回滾點名;
四、并發事務
1、事務的并發問題是如何發生的?
多個事務 同時 操作 同一個數據庫的相同數據時
2、并發問題都有哪些?
臟讀:一個事務讀取了其他事務還沒有提交的數據,讀到的是其他事務“更新”的數據
不可重復讀:一個事務多次讀取,結果不一樣
幻讀:一個事務讀取了其他事務還沒有提交的數據,只是讀到的是 其他事務“插入”的數據
3、如何解決并發問題
通過設置隔離級別來解決并發問題
4. 查看及設置當前事務的隔離級別
select @@tx_isolation;
# 設置當前會話的事務隔離級別
set session transaction isolation level read uncommitted; # 讀未提交
set session transaction isolation level read committed; # 讀已提交
set session transaction isolation level repeatable read; # 可重復讀 默認的隔離級別
set session transaction isolation level serializable ; # 串行化, 最高的隔離級別
# 查看...
mysql> select @@tx_isolation;
+------------------+
| @@tx_isolation |
+------------------+
| READ-UNCOMMITTED |
+------------------+
5、隔離級別
臟讀 不可重復讀 幻讀
read uncommitted:讀未提交 × × ×
read committed:讀已提交 √ × ×
repeatable read:可重復讀 √ √ ×
serializable:串行化 √ √ √
其他
導入與導出數據
導入
向數據中的某個庫導入數據, 這種方式需要先登錄到終端
source 文件路徑
注意點: 路徑名不能有中文
#
mysql> source F:\LearnTools\Program\mysql\t.txt
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
...
導出
導出SQL格式的數據到指定文件
# 在終端下直接導出整個數據庫
mysqldump -uroot -p myemployees> t.txt
Enter password: ***
# 導出某個表到指定文件
mysqldump -uroot -p myemployees jobs > t2.txt
Enter password: ***
視圖
一、含義
mysql5.1版本出現的新特性,本身是一個虛擬表,它的數據來自于表,通過執行時動態生成。
好處:
1、簡化sql語句
2、提高了sql的重用性
3、保護基表的數據,提高了安全性
二、創建
create view 視圖名
as
查詢語句;
三、修改
方式一:
create or replace view 視圖名
as
查詢語句;
方式二:
alter view 視圖名
as
查詢語句
四、刪除
drop view 視圖1,視圖2,...;
五、查看
desc 視圖名;
show create view 視圖名;
六、使用
1.插入 insert
2.修改 update
3.刪除 delete
4.查看 select
注意:視圖一般用于查詢的,而不是更新的,所以具備以下特點的視圖都不允許更新
① 包含分組函數、group by、distinct、having、union、
② join
③ 常量視圖
④ where后的子查詢用到了from中的表
⑤ 用到了不可更新的視圖
七、視圖和表的對比
關鍵字 是否占用物理空間 使用
視圖 view 占用較小,只保存sql邏輯 一般用于查詢
表table保存實際的數據 增刪改查
變量
分類
一、系統變量
說明:變量由系統提供的,不用自定義
語法:
①查看系統變量
show 【global|session 】variables like ''; 如果沒有顯式聲明global還是session,則默認是session
②查看指定的系統變量的值
select @@【global|session】.變量名; 如果沒有顯式聲明global還是session,則默認是session
③為系統變量賦值
方式一:
set 【global|session 】 變量名=值; 如果沒有顯式聲明global還是session,則默認是session
方式二:
set @@global.變量名=值;
set @@變量名=值;
1、全局變量
服務器層面上的,必須擁有super權限才能為系統變量賦值,作用域為整個服務器,也就是針對于所有連接(會話)有效
2、會話變量
服務器為每一個連接的客戶端都提供了系統變量,作用域為當前的連接(會話)
二、自定義變量
說明:
1、用戶變量
作用域:針對于當前連接(會話)生效
位置:begin end里面,也可以放在外面
使用:
①聲明并賦值:
set @變量名=值;或
set @變量名:=值;或
select @變量名:=值;
②更新值
方式一:
set @變量名=值;或
set @變量名:=值;或
select @變量名:=值;
方式二:
select xx into @變量名 from 表;
③使用
select @變量名;
2、局部變量
作用域:僅僅在定義它的begin end中有效
位置:只能放在begin end中,而且只能放在第一句
使用:
①聲明
declare 變量名 類型 【default 值】;
②賦值或更新
方式一:
set 變量名=值;或
set 變量名:=值;或
select @變量名:=值;
方式二:
select xx into 變量名 from 表;
③使用
select 變量名;
存儲過程與函數
說明:都類似于java中的方法,將一組完成特定功能的邏輯語句包裝起來,對外暴露名字
好處:
1、提高重用性
2、sql語句簡單
3、減少了和數據庫服務器連接的次數,提高了效率
存儲過程
一、創建 ★
create procedure 存儲過程名(參數模式 參數名 參數類型)
begin
存儲過程體
end
注意:
1.參數模式:in、out、inout,其中in可以省略
2.存儲過程體的每一條sql語句都需要用分號結尾
二、調用
call 存儲過程名(實參列表)
舉例:
調用in模式的參數:call sp1(‘值’);
調用out模式的參數:set @name; call sp1(@name);select @name;
調用inout模式的參數:set @name=值; call sp1(@name); select @name;
三、查看
show create procedure 存儲過程名;
四、刪除
drop procedure 存儲過程名;
函數
一、創建
create function 函數名(參數名 參數類型) returns 返回類型
begin
函數體
end
注意:函數體中肯定需要有return語句
二、調用
select 函數名(實參列表);
三、查看
show create function 函數名;
四、刪除
drop function 函數名;
流程控制與結構
說明:
順序結構:程序從上往下依次執行
分支結構:程序按條件進行選擇執行,從兩條或多條路徑中選擇一條執行
循環結構:程序滿足一定條件下,重復執行一組語句
分支結構
特點:
1、if函數
功能:實現簡單雙分支
語法:
if(條件,值1,值2)
位置:
可以作為表達式放在任何位置
2、case結構
功能:實現多分支
語法1:
case 表達式或字段
when 值1 then 語句1;
when 值2 then 語句2;
..
else 語句n;
end [case];
語法2:
case
when 條件1 then 語句1;
when 條件2 then 語句2;
..
else 語句n;
end [case];
位置:
可以放在任何位置,
如果放在begin end 外面,作為表達式結合著其他語句使用
如果放在begin end 里面,一般作為獨立的語句使用
3、if結構
功能:實現多分支
語法:
if 條件1 then 語句1;
elseif 條件2 then 語句2;
...
else 語句n;
end if;
位置:
只能放在begin end中
循環結構
位置:
只能放在begin end中
特點:都能實現循環結構
對比:
①這三種循環都可以省略名稱,但如果循環中添加了循環控制語句(leave或iterate)則必須添加名稱
②
loop 一般用于實現簡單的死循環
while 先判斷后執行
repeat 先執行后判斷,無條件至少執行一次
1、while
語法:
【名稱:】while 循環條件 do
循環體
end while 【名稱】;
2、loop
語法:
【名稱:】loop
循環體
end loop 【名稱】;
3、repeat
語法:
【名稱:】repeat
循環體
until 結束條件
end repeat 【名稱】;
二、循環控制語句
leave:類似于break,用于跳出所在的循環
iterate:類似于continue,用于結束本次循環,繼續下一次
總結
以上是生活随笔為你收集整理的mysql数据库asc_mysql数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现对光网络的监控和光路切换 - MEM
- 下一篇: 安全检查如何确保建筑幕墙施工的安全管理呢