MySQL
資料庫
資料庫介紹
之前通過IO流操作檔案儲存資料弊端
1、效率低
2、一般只能儲存少量的資料
3、只能儲存文字資料
什麼是DB
- DataBase資料庫,資料庫實際上就是一個檔案集合
什麼是DBMS
- DataBaseManagementSystem 資料庫管理系統,是用來管理資料庫檔案的軟體,常見的DBMS:SQL/">MySQL、Oracle、SQLServer....
資料庫分類
1、關係型資料庫
以表為單位儲存資料,經過數學理論驗證,關係型資料庫可以儲存現實生活中的任何關係
2、非關係型資料庫
通常用於解決特點的問題如:資料快取,Redis資料庫(通過鍵值對)
主流關係型資料庫介紹
1、MySQL:08年被Sun收購,09年Sun被Oracle公司,市場佔有率第一,開源資料庫
SQL
- Structured結構化 Query查詢 Language語言,使用者程式員和資料進行互動,通過sql對資料進行增刪改查
資料庫伺服器
- 伺服器就是一臺高配置的電腦,資料庫伺服器就是在一臺高配置的電腦上安裝了提供資料庫服務的軟體(DBMS),則這臺電腦就稱為資料庫伺服器,資料庫軟體本身支援網路訪問功能
連線並登陸MySQL資料庫
-
連線資料庫有以下幾種方式:
1、在命令列/終端
2、通過三方客戶端
3、通過eciplse -
如何連線資料庫
mysql -uroot -p
-退出
exit
資料庫相關的SQL
- 查詢所有資料庫:show databases;
- 查詢資料庫詳情(字符集):show create database 資料庫;
- 建立資料庫指定字符集:create database db2 character set gbk;
- 刪除資料庫:drop database db2;
- 選中資料庫:use db1;
- 修改資料庫字符集:alter database db default character set gbk;
表相關SQL(選中資料庫)
-
建立表:
create table 表名 (欄位名1 欄位型別1, 欄位名2,欄位型別2...); - 查詢所有表:show tables;
- 查詢表詳情:show create table 表名;
- 查看錶結構(表字段):desc table;
-
建立表指定引擎和字符集:
格式:create table 表名 (欄位1 欄位1型別,...)engine=myisam charset=gbk; - 刪除表:drop table 表名;
-
新增欄位: alter table 表名 add column 欄位 型別;
alter table 表名 add column 欄位 型別 first;
alter table 表名 add column 欄位 型別 after xxx;
-
刪除欄位:alter table student drop column 欄位;
-
修改欄位型別[位置]: alter table 表名 modify column 欄位名 新型別 [first/after xxx];
-
修改欄位名稱:alter table 表名 change column 舊欄位名 新欄位名 型別;
-
修改表名稱: alter table 表名 rename to 新表名;
rename table 原名 to 新名
-
修改表引擎和字符集:
alter table 表名 engine=myisam charset=gbk;
-
資料庫表的引擎
1、innodb:支援資料庫的高階操作,如:事務,外來鍵等
2、不支援高階操作,只支援基礎的增刪改查
資料相關SQL
-
插入資料:insert into 表名 values(值1,值2,...);
insert into 表名 (欄位1,欄位2...) values(值1,值2...);
-
批量插入資料:
insert into table values("張三",20),("李白",34),...;
中文問題:
-
在命令列執行 set names gbk;
-
顯示?的是因為資料庫或表的字元編碼為gbk,改為utf-8;
-
查詢資料:
select * from 表 where條件;
-
刪除資料:
delete from 表名 where 條件;
-
修改資料:
update 表名 set 欄位名=值 where 條件;
主鍵約束
- 什麼是主鍵:表示表中的資料唯一性的欄位稱為主鍵
- 新增主鍵約束的欄位,值唯一且非空。 primary key
主鍵+自增
-
格式:primary key auto_increment
1、當自增欄位的值為空時,會自動賦值並且數值加一。
2、可以指定賦值。
3、自增數值只增不減,不會因為刪除資料而減少。
4、在表中曾經出現過的最大值的基礎上加1。
註釋 comment
- 格式:comment '這裡是註釋內容'
`和'的區別
- `用來修飾表名和欄位名,可以省略
- '用來修飾字符串
資料冗餘
- 什麼是冗餘:如果表設計的不合理,隨著資料量的增多,可能會出現大量的重複資料,這種重複資料成為資料冗餘,可以通過拆分多個表的形式解決此問題。
事務
-
事務是資料庫中執行sql語句的工作單元,可以保證事務內的SQL語句要麼全部成功,要麼全部失敗。
-如何使用事務:1、把資料庫的自動提交改為手動提交,2、執行多條sql語句,此時sql會在記憶體中執行,3、當所有sql在記憶體中執行完後,手動提交,把多次改動一次性提交到資料庫檔案中。
-
檢視資料庫自動提交的狀態
show variables like '%autocommit%';
-
關閉和開啟自動提交:0:關閉1:開啟
set autocommit=0;
-
提交:commit;
-
驗證事務的步驟:
1、update person set money=money-1000 where id=2;
2、此時select 8 from person 資料被改掉的,但是此時顯示的內容是記憶體中的。
3、開啟新視窗select 8 from person,因為此時查詢的是資料庫中的檔案,所有沒有改變。
4、在A視窗update person set money=money+1000 where id=1;
5、此時A視窗中的資料改變(記憶體中資料),B視窗沒有改變(資料庫檔案中的資料)
6、回到A視窗執行commit,手動提交,此時B視窗的資料也發生改變了,因為A視窗中已經把兩次記憶體中的改動提交到資料庫檔案中。
為什麼使用事務?
當做某件事需要執行多條sql語句,如果不使用事務,則可能出現部分成功,部分失敗,這樣會使資料錯亂,使用事務則可以保證事務要麼全部成功,要麼全部失敗。
事務的執行流程:
所謂開啟事務實際上就是把資料庫的自動提交關閉改成手動提交,在手動提交之前多次SQL語句的執行只會對記憶體中的資料進行更改,當提交的時候會把多次SQL的執行結果一次性提交到資料庫檔案中
回滾 rollback
- 事務回滾會把記憶體中的資料回到上次提交的點
- 設定回滾點 :savepoint 標示;
- 回滾到某個回滾點 :rollback to 標示;
- 如果回滾到更早的時間點,則後面的不能再回滾。
SQL分類
1、DDL : Data Definition Language,資料定義語言,包括:create,alter,drop,truncate 不支援事務。
2、DML : Data Manipulation Lauguage,資料操作語言,包括:insert,delete,update,select(DQL)。支援事務。
3、DQL : Data Query Language 資料查詢語言 ,只有select
4、TCL : Transaction Control Language 事務控制語言,包括:commit,rollback,savepoint,rollback to xxx
5、DCL : Data Control Language 資料控制語言,用來分配使用者許可權相關的SQL
truncate
- 刪除表並建立一個新表(空表)
- 格式:truncate table 表名
-
truncatedropdelete區別:執行效率drop>truncate>delete;
drop只是刪除表,truncate刪除表並建立一個空表,delete只是刪除資料自增數值不會清零。
資料庫的資料型別
-
整數:int(m)bigint(m)m代表顯示長度
create table t(num int(10) zerofill);---zerofill 零填充 -
浮點數: double(m,d)m總長度,d小數長度
decimal(m,d) 超高精度浮點數,設計超高精度運算時使用。 -
字串
char(n) 固定長度執行效率高最大長度255
varchar(n) 可變長度更節省空間最大長度65535(超高255建議使用text)
text:可變長度最大65535 -
日期型別
date:儲存年月日
time:儲存時分秒
datetime:儲存年月日時分秒,預設值null,最大值9999-12-31
timestamp(時間戳):儲存年月日時分秒,預設值為當前時間,最大時間2038-1-19
create table t_date(
d1 date,
d2 time,
d3 datetime,
d4 timestamp);
insert into t_date values("2018-03-18","17:24:18","2018-09-10 17:27:20",null);
is null
1、查詢沒有上級領導的員工編號姓名和工資
select empno,ename,sal from emp where mgr is null;
2、查詢emp表中沒有獎金的員工姓名ename,工資sal,獎金comm
is not null
1、查詢emp表中有獎金的員工資訊
比較運算子 > < >= <= !=和<>
別名 as
1、select ename as "姓名",sal as "工資" from emp;
2、select ename"姓名",sal"工資" from emp;
3、select ename 姓名,sal 工資 from emp;
去重 distinct
select distinct deptno from emp;
and 和 or 可以用&& ||
- and 和java中的 && 效果一樣
-
or 和java中的 || 效果一樣
1、查詢工資為5000,1500,3000,的員工資訊
select * from emp where sal=5000 or sal = 1500 or sal = 3000;
select * from emp where sal in (5000,1500,3000);
[not] between x and y[不]在x,y之間(包含x,y)
1、查詢工資在2000-4000之間的員工
select * from emp where sal between 2000 and 4000;
2、查詢工資在2100到2800之外的員工
select * from emp where sal not between 2100 and 2800;
模糊查詢 [not] like
- _ : 代表單個位置字元
- % :代表0或多個字元
-
舉例:
1、名字以a開頭select * from emp where ename like "a%"
2、a結尾%a
3、包含a%a%
4、第二個字元是a_a%
排序order by
-
如果有條件寫下條件的後面,沒有條件寫在表名後面
select ename,sal from emp order by sal desc;
1、預設是升序desc:降序asc:升序
多欄位排序
1、按員工部門升序,價格降序來排序
select ename,sal,deptno from emp order by deptno,sal desc;
分頁查詢 limit
- 格式 :limit begin,sizebegin:跳過的條數size:每頁的數量
數值計算 +-*/
5%3等效5mod3
-
查詢所有員工的姓名,工資及年終獎(工資
5)
select ename 年齡,sal 工資 , sal
5 年終獎 from emp; -
查詢商品表中商品單價,庫存,及總金額(單價
庫存)
select price ,num,price
num from t_item;
ifnull(x,y)函式
-
age=ifnull(x,y) 如果x的值為null則賦值y,如果不為null則賦值x
1、將emp表中獎金為null的全部改為0;
update emp set comm=ifnull(comm,0);
聚合函式
-
對多行資料進行統計
1、求和:sum(欄位名)
查詢所有員工的工資總和 select sum(sal) from emp;
查詢20號部門工資總和 select sum(sal) from emp where deptno=20;
2、平均值 : avg(欄位名)
3、最大值 : max(欄位名)
4、最小值 : min(欄位名)
5、統計數量 : count(欄位名|*)
和日期相關的函式
select 'helloworld'
-
獲取當前的年月日時分秒
select now(); -
獲取當前年月日
select curdate(); -
獲取當前時分秒
select curtime(); -
從年月日時分秒中 提取年月日提取時分秒
select date(now());
select time(now()); -
提取時間分量年月日 時 分 秒
select extract(year from now())
select extract(month from now())
select extract(day from now())
select extract(hour from now())
select extract(minute from now())
select extract(second from now())
日期格式化函式
-
格式 : date_format(日期,format);
-
format :%Y 四位年%y兩位年
%m 兩位月%c一位月
%d日
%H 24小時 %h12小時
%i 分
%s 秒
1、把now()格式改為 年月日時分秒
select date_format(now(),"%Y年%m月%H時%i分%s秒");
-
把非標準格式轉回標準格式
str_to_date(非標準時間,format)
select str_to_date('14.08.2018 08:00:00','%d.%m.%Y %H:%i:%s');
字串相關函式
1、字串的拼接concat(s1,s2);
查詢員工工資,以員工為單位select concat(sal,"元") from emp;
2、獲取字串的長度char_length(str);
查詢員工姓名和名字的長度select ename,char_length(ename) from emp;
3、獲取字串在另一個字串出現的位置
格式1:instr(str,substr);
格式2:locate('d','abcd');
4、插入字串 insert(str,start,length,newstr);
5、轉大寫 :upper('abc') 轉小寫: lower("NBA")去空白:trim('ab')
6、擷取字串:left(str,len)right(str,len)substring(str,start,[length])
7、重複repeat(str,count)
將str重複count次
8、替換 replace(str,old,new)
9、反轉 reverse(str)
數學相關
1、向下取整 floor(num)
2、四捨五入 round(num)round(num,m) m代表小數位數
3、非四捨五入 truncate(num,m) m代表小數
4、隨機數 rand()0-1
分組查詢 group by
-
各種關鍵字順序:
select * from 表名 where ... group by ... order by ... limit ...
having
- 一般要結合分組查詢和聚合函式使用,用於聚合函式的內容新增條件
- 聚合函式的條件不能寫在where後面
-
普通欄位的條件寫在where後面,聚合函式寫在having後面
select deptno,avg(sal) from emp where avg(sal)>2000 group by deptno;(錯誤)
select deptno,avg(sal) from emp wheregroup by deptno having avg(sal)>2000;(正確)
子查詢(巢狀查詢)
1、巢狀在SQL語句中的查詢語句稱為子查詢
2、子查詢可以巢狀n層
3、子查詢可以寫在哪些位置?
- 寫在where或having後面當中當做查詢條件的值
-
寫在from後面 當一張新表
必須有別名
select * from emp where sal>3000;
select * from (select * from emp where sal > 1000) newtable; -
寫在建立表的時候
create table emp_20 as (select * from emp where deptno=20);
關聯查詢
- 同時查詢多張表的查詢方式稱為關聯查詢
笛卡爾積
- 如果關聯查詢不寫關聯關係則查詢到的資料是兩張表的乘積,這個乘積稱為笛卡爾積
- 笛卡爾積是一種錯誤查詢方式的結果,工作中切記不要出現
等值連線和內連線
1、等值連線:select * from A,B where A.x=B.x and A.age=18;
2、內連線:select * from A join B on A.x=B.x where A.age=18;
外連線
- 使用外連線查詢得到的資料除了兩張表的交集以外和另外一張主表的全部資料,哪個表為主表left/right控制,left是以join左邊表為主表,right以join右邊的表為主表。
關聯查詢總結
- 關聯查詢的查詢方式:等值連線、內連線、外連線
- 如果查詢兩張表的交集資料使用等值連線或內連線(推薦)
- 查一個表所有資料另外一個表交集資料使用外連線
關聯關係之表設計
- 外來鍵:用來建立關係的欄位稱為外來鍵
- 主鍵:用來表示資料唯一性的欄位稱為主鍵
一對一
- 有AB兩張表,A表中的一條資料對應B表中的一條資料,同時B表一條對應A表一條,這種關係稱為一對一
- 如何建立關係:在從表中新增外來鍵,外來鍵的值指向主表的主鍵
一對多
- A表中的一條資料對應B表中的多條資料,B表中一條資料對應A表一條資料
- 如何建立關係:在多的一段新增外來鍵指向另外一張表的主鍵
多對多
- A表中一條資料對應B表多條資料,B表一條資料對應A表多條資料
- 如何建立關係:需要建立新的關係表,表中新增兩個外來鍵,指向兩個主表的主鍵
表設計之許可權管理案例
- 建立三張主表(user(id,name)role(id,name)module(id,name))和兩種關係表(u_r(uid,rid) 使用者和角色r_m (rid,uid)角色和許可權)
檢視
- 什麼是檢視:資料庫中表和檢視都是其內部的物件,檢視可以理解成一張虛擬的表,檢視本質上就是取代一段SQL查詢語句
- 建立檢視:create view 檢視名 as 子查詢/創建出來一個虛擬表 /
-
為什麼使用檢視:因為有些資料的查詢需要書寫大量SQL語句,每次書寫浪費時間,使用檢視可以起到SQL語句重用的作用,可以隱藏敏感資訊。
1、建立一個10號部門員工的檢視
create view v_emp_10 as (select * from emp where deptno=10);
select * from v_emp_10;
2、建立一個沒有員工工資的檢視
create view v_emp_nosal as(select empno,ename,deptno from emp);
檢視分類
1、簡單檢視:建立檢視的查詢中不包含:去重,函式,分組,關聯查詢的檢視稱為簡單檢視,簡單檢視可以對錶中資料進行增刪改查操作。
2、複雜檢視:和簡單檢視相反,複雜檢視只能進行查詢。
對簡單檢視進行增刪改查(操作和table一樣)
1、插入資料
insert into view_name (欄位....) values (值....);
- 資料汙染:往檢視中插入一條檢視中不可見,但願表中存在的資料稱為資料汙染。
-
通過 with check option 解決資料汙染問題
create view v_emp_20 as (select * from emp where deptno=20) with check option;
insert into v_emp_20 (empno,ename.deptno) values(1000,"張三",10); //error
insert into v_emp_20 (empno,ename.deptno) values(1000,"張三",20); //success - 修改和刪除只能操作檢視中存在的資料
-
修改檢視
create or replace view v_emp_20 as (select * from emp where deeptno=20 and sal>2000); - 刪除檢視drop view 檢視名;
-
檢視別名:如果建立檢視的子查詢中使用別名,則對檢視的增刪改查時只能使用別名
create view v_emp as (select ename name from emp);
select name from v_emp;//只能使用別名
約束
-
什麼是約束:約束就是給表字段新增限制條件
1、非空約束 not null
2、唯一約束 unique(不能重複)
3、主鍵約束primary key
4、預設約束dafault
外來鍵約束
- 外來鍵:用來建立外來鍵的約束稱為外來鍵
- 外來鍵約束:新增外來鍵約束的欄位,值可以為null,可以重複,但是不能是關聯表中不存在的資料,外來鍵指向的資料不能先刪除,外來鍵指向的表不能先刪除。
-
如何使用外來鍵約束:
1、建立部門表
create table dept(id int primary key auto_increment,name varchar(10));
2、建立員工表
create table emp(id int primary key auto_increment,name varchar(10),deptid int,constraint fk_dept foreign key (deptid) references dept(id)); - 格式:constraint 約束名稱 foreign key(外來鍵欄位名稱) references 表名(欄位名)
- 工作中除非特定場景一般不使用外來鍵約束,因為新增約束後會影響測試效率,一般通過程式碼建立邏輯外來鍵
索引
-
什麼是索引:索引是資料庫中用來查詢效率的技術,類似於目錄
-
為什麼使用索引:如果不使用索引,資料會零散的儲存在磁碟中,查詢資料需要挨個遍歷每個磁碟塊,直到找到資料為止,使用索引後會將磁碟塊以樹狀結構儲存,查詢資料時會大大降低訪問的磁碟塊數量,從而提高查詢效率。
-
索引是越多越好嗎?
索引會佔用磁碟空間,只對常用的查詢欄位建立索引
-
有索引就一定好嗎?
如果表中資料量很少,新增索引反而降低查詢效率
如何建立索引
- 格式:create index 索引名 on 表名(欄位(長度));
- 如何檢視索引:show index from 表名;
- 只要給表新增主鍵約束,則資料庫會為此表自動建立主欄位的索引。
刪除索引
- drop index 索引名 on 表名;
複合索引
- 通過多個欄位建立的索引稱為符合索引
- 格式:create index 索引名 on 表名(欄位1,欄位2);
事務
- 資料庫中執行SQL語句的工作單元,保證全部成功或全部失敗
事務的ACID特徵
- Atomicity:原子性,最小不可拆分,全部成功全部失敗。
- Consistency:一致性,從一個一致狀態到另一個一致狀態。
- Isolation:隔離性,多個事務之間互不影響。
- Durability:永續性,事務完成後資料提交到資料庫持久儲存。
事務相關SQL
- 檢視自動提交狀態 show variables like "%autocommit%"
- 修改狀態set autocommit=0/1;
- 提交:commit;
- 回滾:rollback;
- 儲存回滾點 savepoint s1;
- 回滾到某個回滾點 rollback to s1;
group_concat()
- 查詢時欄位連線,在一行顯示