MySql知識點全面總結
結構化查詢語言SQL概述
SQL(Structured Query Language) 是結構化查詢語言的縮寫。
SQL是在關係資料庫上執行資料操作、檢索及維護所使用的標準語言,可以用來查詢資料,操縱資料,定義資料,控制資料,所有資料庫都使用相同或者相似的語言。
SQL可分為:
- 資料定義語言(DDL) : Data Definition Language
- 資料操縱語言(DML) : Data Manipulation Language
- 事務控制語言(TCL):Transaction Control Language)
- 資料查詢語言(DQL):Data Query Language
- 資料控制語言(DCL) : Data Control Language
執行SQL語句時,使用者只需要知道其邏輯含義,而不需要知道SQL語句的具體執行步驟。
資料定義語言(DDL)
用於建立、修改、刪除資料庫物件,包括建立語句(CREATE)、修改語句(ALTER)、刪除語句(DROP),比如使用CREATE TABLE建立表,使用ALTER TABLE修改表,使用DROPTABLE刪除表等動作。這類語言不需要事務的參與,自動提交。
DDL
create drop alter
建立資料庫:
create database 資料庫名;
刪除資料庫
drop database 資料庫名;
建立表:
create table 表名(
欄位1 id 型別(長度) primary key,auto_increment,(設定主鍵,自動遞增)
欄位2 型別(長度) 約束,
欄位3 型別(長度)
)
修改表名
alter table 表名 rename 新表名
修改欄位
alter table 表名 change 欄位名 新欄位名(新長度) [新的約束]。
刪除表結構
drop table 表名
drop :刪除表刪的是表的結構
delete:刪除刪的是表中的資料
資料操作語言(DML)
用於改變資料庫資料,包括INSERT、UPDATE、DELETE三條語句。其中,INSERT語句用於將資料插入到資料庫中,UPDATE語句用於更新資料庫中已存在的資料,DELETE用於刪除資料庫中已存在的資料。DML語言和事務是相關的,執行完DML操作後必須經過事務控制語句提交後才真正的將改變應用到資料庫中。
DML insert delete update
全表插入資料
Insert into 表名(欄位1,欄位2,欄位3) values(值1,值2,值3)
Insert into 表名 values(值1,值2,值3)
部分插入,給部分欄位賦值
Insert into 表名(欄位1,欄位2) valus(值1,值2)
全表刪除資料
Delete from 表名;
DDL全表刪刪除 truncate table 表名
delete與truncate區別
truncate是DDL,
只能全表刪除,不能加條件刪除,
truncate刪除全表後,auto_increment主鍵會被清空,下次插入資料,主鍵值從新的主鍵開始增長
truncate全表刪除,一次性直接刪除,刪除的速度快,效率高
delete是DML,可以有條件刪除
部分資料刪除,有條件的刪除
delete全表清空後,auto_increment主鍵不會被清空,下次插入資料,主鍵值還在原來的auto_increment主鍵值的基礎上自增
delete全表刪除,是一條一條刪除,速度慢,效率低
delete from 表名 where id=xxx;
全表修改 修改表中的資料
update 表名 set 欄位1=新值1,欄位2=新值2,欄位3=新值3
有條件修改
update 表名 set 欄位1=新值,欄位2=新值2,子段3=新值3 where 子段=值
資料查詢語言(DQL)
用來查詢所需要的資料。使用最廣泛,語法靈活複雜。
DQL:資料查詢語言 select
全表查詢
select * from 表名
查詢部分欄位,並給查詢的部分欄位取別名
select 欄位1 as 新欄位1,欄位2 新欄位2 from 表名
去重關鍵字:distinct
select distinct(欄位) from 表名
-條件查詢
條件查詢:where ( 數值型別 > < = != <> )
select * from 表名 where 數值欄位>10
where ( and or ) : select * from 表名 where 條件1 and/or 條件2
select * from 表名 where 數值欄位>=10 and 數值欄位<=20
between and (數值/日期 查詢在某個區間)
select * form 表名 where 欄位 between 10 and 20;
null和 not null 只能用 is null is not null 不能用=null !=null
模糊查詢
模糊查詢:like(萬用字元) 萬用字元:_ 一個字元 % 0或多個字元
select * from 表名 where 欄位 like %白
分組查詢
分組查詢:以什麼欄位分組,查詢的欄位就可以是這個分組欄位,但是不能出現其他欄位,如果希望查詢出現其他欄位,需要用聚合函式
select 欄位1 form 表名 group by 欄位1
select 欄位1,欄位2 form 表名 group by 欄位1,欄位2
排序
排序:order by 欄位1 asc/desc【,欄位2 asc/desc,欄位3 asc/desc】
asc:升序
desc:降序
order by 預設升序
執行順序
(5)select (1)from (2)where (3)group by (4)having (6)order by
常用函式
常用的函式 concate(引數1,引數2)連線 substr切割 date_format(日期,格式) upper():字母變大寫 lower():字母變小寫
select concate('hello','world') from dual;
select concate(欄位1,欄位2) from 表名
select substr('hello',1,2) from dual//he
select substr(欄位,1,2) from dual
select date_format(now(),'%d')
獲得當前日期時間
select now();
select sysdate();
聚合函式
聚合函式:查詢多條記錄,返回一條結果
avg():求平均 sum():求和 count():統計個數 max():最大 min():最小
select 聚合函式1(),聚合函式2(),分組欄位 from 表名 group by 分組欄位;
外來鍵
外來鍵:
一張表與另一張表有關聯,產生父子關係,表一的外來鍵依賴表2的主鍵,表1是父表 表2是子表
特點:想要刪除子表中的記錄,必須先將父表中有依賴子表中的資料刪除
加外來鍵:
alter table 表名 add foreign key(父表字段) reference 子表表名(欄位)
多表查詢
笛卡爾乘積: 每一張表的每條記錄,都會匹配另一張表的所有記錄 結果記錄條數:
表1條數*表2條數
select 表1.*,表2.* from 表1,表2;
等值連線:笛卡爾乘積的基礎上,過濾出來兩個表中都符合條件的記錄
select 表1.*,表2.* from 表1,表2 where 表1.外來鍵=表2.主鍵
內連線:結果與等值連線一樣
select 表1.*,表2.* from 表1 [inner] join 表2 on 表1.外來鍵=表2.主鍵
左外連線:
左表所有的記錄都會顯示,右表能匹配上的記錄都顯示,右表不能能匹配上的記錄欄位用NUll填充顯示
兩個表的交集,及左表沒有被匹配上的左表資訊,右表沒匹配上的資訊所有欄位用Null填充
select 表1.* ,表2.* from 表1 left [outer] join 表2 on 表1.外來鍵=表2.主鍵
右外連線:
右表所有的記錄都會顯示,左表能匹配上的記錄都顯示,左表不能能匹配上的記錄欄位用NUll填充顯示
兩個表的交集,及右表沒有被匹配上的右表資訊,和左表沒匹配上的資訊所有欄位用Null填充
select 表1.* ,表2.* from 表1 right [outer] join 表2 on 表1.外來鍵=表2.主鍵
自連線:自己與自己做連線
select emp.*,emp1.* from emp,emp1 where emp.mgr=emp1.empno;
select emp.*,emp1.* from emp,emp as emp1 where emp.mgr=emp1.empno;
多張表連線:
select 表1.*,表2.*,表3.*
from 表1
inner join 表2
on 表1.外來鍵=表2.主鍵
inner join 表3
on 表1.外來鍵=表3.主鍵
where 表1條件 and 表2條件 and 表3條件
子查詢
子查詢:where條件不是一個特定的值,而是一個select查詢
單行單列子查詢: select 欄位 from 表名 where 條件=10
外連線:(> < =) select * form 表名 where 欄位=(單行單列子查詢)
多行單列子查詢:select 欄位 from 表名 where 條件>10 查詢結果相當於一個列表(值1,值2,值3)
外連線:(in not in ><連線著any/all ) select * form 表名 where 欄位 in(多行單列子查詢)
分頁查詢
select * from 表名 limit (偏移量(從0開始),每頁顯示條數)
偏移量:(頁數-1)*每頁顯示多少條數
檢視
檢視是指計算機資料庫中的檢視,是一個虛擬表,其內容由查詢定義。
同真實的表一樣,檢視包含一系列帶有名稱的列和行資料。
但是,檢視並不在資料庫中以儲存的資料值集形式存在。
行和列資料來自由定義檢視的查詢所引用的表,並且在引用檢視時動態生成。
-- 建立檢視
create view v_emp1 as select * from emp where job='leader';
-- 修改檢視
create or replace view v_emp1 as select * from emp where job='manger'
-- 檢視所有表及檢視
show tables;
-- 檢視檢視結構
desc v_emp1;
--建立一個有約束的檢視
create view v_emp2 as select * from emp where job='clerk' with check option ;
-- 操作檢視會間接操作原始表
insert into v_emp2(empno,ename,job) values(1111,'馬化騰','leader');-- job只能是clerk,插入leader報錯
-- 建立檢視依賴兩張表
create view v_emp3 as select emp.*,dept.dname,dept.loc from emp inner join dept on emp.deptno=dept.deptno;
desc v_emp3;
-- 可以通過檢視插入資料,但是隻能基於一個基礎表進行插入,不能跨表更新資料
insert into v_emp3(empno,ename,deptno,loc) values(1112,'劉強東',50,'上海');--報錯
select * from v_emp1;
--刪除檢視
drop view if exists 檢視名
-索引---
--建立索引,提高sql查詢效率
-- CREATE INDEX index_name ON table_name (column_list)
CREATE INDEX index_emp ON emp (ename);
select * from emp where ename='郭芙蓉';
--刪除索引
DROP INDEX index_name ON table_name
-儲存過程-
-- 儲存過程可以一次性執行批量sql
--建立儲存過程
delimiter &&
create PROCEDURE P_emp1()
BEGIN
insert into emp(empno,ename,deptno) values(1115,'天線寶寶',10);
update emp set ename='天線寶寶1' where ename='天線寶寶';
select * from emp;
END
&&
delimiter;
--呼叫儲存過程
call P_emp1();
--建立含有輸入引數和輸出引數的儲存過程
delimiter &&
CREATE DEFINER=`root`@`localhost` PROCEDURE `P_emp1`(IN `_ename` VARCHAR(50), OUT `_empno` INT)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
insert into emp(empno,ename,deptno) values(1116,_ename,10);
select max(empno) into _empno from emp;
END
&&
delimiter;
--呼叫有引數的儲存過程
call P_emp1('嫦娥',@_empno);
select @_empno;
觸發器
-- 觸發器一般使用在日誌上,操作一張表,另一張表會受到影響,自動被觸發執行一些操作
--建立觸發器
elimiter &&
CREATE TRIGGER t_emp1 BEFORE UPDATE ON emp FOR EACH ROW BEGIN
insert into dept(deptno,dname,loc) values(61,'測繪','北京');
END
&&
delimiter;
--更改Emp,觸發器會自動被觸發
update emp set ename='肖奈3' where ename='肖奈2';
commit;
資料控制語言(DCL)
用於執行許可權的授予和收回操作、建立使用者等,包括授予(GRANT)語句,收回(REVOKE)語句,CREATE USER語句,其中GRANT用於給使用者或角色授予許可權, REVOKE用於收回使用者或角色已有的許可權。DCL語句也不需要事務的參與,是自動提交的。
DCL:資料控制語言
1 建立使用者
create user 使用者名稱@xxx identified by 密碼;
create user [email protected] identified by 'root';
2 給使用者授權
將資料庫n個許可權授予使用者:
grant 許可權1,許可權2,...,許可權n on 資料庫名.* to 使用者名稱@IP;
將操作資料庫的所有的許可權授予使用者:
grant all on 資料庫名.* to 使用者名稱@IP;
3 撤銷許可權:
revoke 許可權1,許可權2,...,許可權n on 資料庫名.* from 使用者名稱@IP;
revoke delete on aa.* form [email protected];
4 檢視使用者的許可權
show grants for 使用者名稱@IP
show grants for [email protected];
5 刪除使用者
drop user 使用者名稱@IP
drop user [email protected];
登入:mysql -u使用者名稱 -p密碼
mysql –u zhangsan –p root
或者 mysql --user=使用者名稱 --host=ip地址 --password=密碼
退出登入: exit;
事務控制語言(TCL)
用來維護資料一致性的語句,包括提交(COMMIT)、回滾(ROLLBACK)、儲存點(SAVEPOINT)三條語句,其中COMMIT用來確認已經進行的資料庫改變, ROLLBACK語句用來取消已經進行的資料庫改變,當執行DML操作後(也就是上面說的增加、修改、刪除等動作),可以使用COMMIT語句來確認這種改變,或者使用ROLLBACK取消這種改變。SAVEPOINT語句用來設定儲存點,使當前的事務可以回退到指定的儲存點,便於取消部分改變。
TCL:事務控制語言
事務是訪問並可能更新資料庫各種資料項的一個程式執行單元,
在關係資料庫中,一個事務可以是一條SQL語句,一組SQL語句或整個程式,
當一個事務執行並完成修改時,並不是對目標表立即進行修改,
此時修改的結果只是儲存到臨時快取中,只有利用事務控制命令才最終認可這個事務
事務有應該具有4個屬性:原子性,一致性,隔離性,持續性 這四個屬性
原子性(atomicity)。一個事務是一個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。
一致性(consistency)。事務必須是使資料庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
隔離性(isolation)。一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的資料對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。
永續性(durability)。持續性也稱永久性(permanence),指一個事務一旦提交,它對資料庫中資料的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。
set autocommit=false;
設定手動提交;
rollback 回滾;
commit 提交;
savepoint pl 儲存;設定一個儲存點
rollback to pl 回滾到pl儲存點:也就是撤銷這個儲存點之後的事務操作
RELEASE SAVEPOINT p1 刪除建立的儲存點:在這個儲存點被釋放之後,就不能再利用ROLLBACK命令來撤銷這個儲存點之後的事務操作了。