Python全栈开发-Mysql知识点总结(中)
進階8.分頁查詢???
/*
應用場景:當要顯示的數據,一頁顯示不全,需要分頁提交sql請求
語法:
select 查詢列表
from 表
【join type】 join 表2
on 連接條件
where 篩選條件
group by 分組條件
having 分組后的篩選
order by 排序的字段
limit offset,size;
特點:
①limit語句放在查詢語句的最后
②公式
要顯示的頁數page,每頁條目數size
*/
案例1:查詢前五條員工信息
SELECT * FROM employees LIMIT 0,5; SELECT * FROM employees LIMIT 5;案例2:查詢第11條到25條
SELECT * FROM employees LIMIT 10,15;案例3:有獎金的員工信息,并且工資較高的前10名顯示出來
SELECT * FROM employees WHERE commission_pct IS NOT NULL ORDER BY salary DESC LIMIT 10;案例綜合1
1.查詢工資最低的員工信息
①查詢最低工資
SELECT MIN(salary) FROM employees;②查詢last_name,salary,要求salary=①
SELECT last_name,salary FROM employees WHERE salary=(SELECT MIN(salary)FROM employees );2.查詢平均工資最低的部門信息
方式一
①查詢各部門平均工資
SELECT AVG(salary),department_id FROM employees GROUP BY department_id;②查詢①結果上的最低平均工資
SELECT MIN(ag),department_id FROM (SELECT AVG(salary) ag,department_idFROM employeesGROUP BY department_id ) ag_dep;③查詢哪個部門平均工資=②
SELECT AVG(salary),department_id FROM employees GROUP BY department_id HAVING AVG(salary)=(SELECT MIN(ag)FROM (SELECT AVG(salary) ag,department_idFROM employeesGROUP BY department_id) ag_dep );④查詢部門信息
SELECT d.* FROM departments d WHERE d.`department_id`=(SELECT department_idFROM employeesGROUP BY department_idHAVING AVG(salary)=(SELECT MIN(ag)FROM (SELECT AVG(salary) ag,department_idFROM employeesGROUP BY department_id) ag_dep) );方式二
①各部門平均工資
SELECT AVG(salary),department_id FROM employees GROUP BY department_id;②求出最低平均工資部門的編號
SELECT department_id FROM employees GROUP BY department_id ORDER BY AVG(salary) LIMIT 1;③查詢部門信息
SELECT * FROM departments WHERE department_id=(SELECT department_idFROM employeesGROUP BY department_idORDER BY AVG(salary) LIMIT 1 );3.查詢平均工資最低的部門信息和該部門平均工資
①各部門平均工資
SELECT AVG(salary),department_id FROM employees GROUP BY department_id;②求出最低平均工資部門的編號
SELECT department_id FROM employees GROUP BY department_id ORDER BY AVG(salary) LIMIT 1;③查詢部門信息
SELECT d.* FROM departments d JOIN (SELECT AVG(salary) ag,department_idFROM employeesGROUP BY department_idORDER BY AVG(salary) LIMIT 1 ) ag_dep ON d.`department_id`=ag_dep.department_id;4.查詢平均工資最高的job信息
①查詢每個job的平均工資
SELECT AVG(salary),job_id FROM employees GROUP BY job_id ORDER BY AVG(salary) DESC LIMIT 1;②查詢job信息
SELECT * FROM jobs WHERE job_id=(SELECT job_idFROM employeesGROUP BY job_idORDER BY AVG(salary) DESCLIMIT 1 );5.查詢平均工資高于公司平均工資的部門
①查詢公司總平均工資
SELECT AVG(salary) FROM employees;②查詢每個部門的平均工資
SELECT AVG(salary) FROM employees GROUP BY department_id;③篩選②結果集,滿足平均工資>①
SELECT AVG(salary) FROM employees GROUP BY department_id HAVING AVG(salary)>(SELECT AVG(salary)FROM employees );6.查詢公司所有manager信息
①查詢所有manager的員工編號
SELECT DISTINCT manager_id FROM employees;②查詢詳細信息,滿足employee_id=①
SELECT * FROM employees WHERE employee_id=ANY(SELECT DISTINCT manager_idFROM employees );7.各個部門中最高工資中最低工資的那個部門的最低工資
①查詢各部門的最高工資中最低的部門編號
SELECT department_id FROM employees GROUP BY department_id ORDER BY MAX(salary) LIMIT 1;②查詢①結果的那個部門的最低工資
SELECT MAX(salary) FROM employees WHERE department_id=(SELECT department_idFROM employeesGROUP BY department_idORDER BY MAX(salary)LIMIT 1 );8.查詢平均工資最高的部門編號的manager的詳細信息
①查詢平均工資最高的部門編號
SELECT department_id FROM employees GROUP BY department_id ORDER BY AVG(salary) DESC LIMIT 1;②將employees和departments連接查詢,篩選條件是①
SELECT last_name,d.department_id,email,salary FROM employees e INNER JOIN departments d ON d.`manager_id`=e.`employee_id` WHERE d.`department_id`=(SELECT department_idFROM employeesGROUP BY department_idORDER BY AVG(salary) DESCLIMIT 1);練習
一.查詢每個專業(yè)的學生人數
SELECT majorid,COUNT(*) FROM student GROUP BY majorid;二.查詢參加考試學生中,每個學生的平均分,最高分
SELECT AVG(score),MAX(score),studentno FROM result GROUP BY studentno;三.查詢姓張的每個學生的最低分大于60分的學號姓名
SELECT s.studentno,s.`studentname`,MIN(score) FROM student s JOIN result r ON s.`studentno`=r.`studentno` WHERE s.`studentname` LIKE '張%' GROUP BY s.`studentno` HAVING MIN(score)>60;四.查詢每個專業(yè)生日在’1988-1-1’后的學生姓名,學號
SELECT studentname,majorname FROM student s JOIN major m ON s.`majorid`=m.`majorid` WHERE DATEDIFF(borndate,'1988-1-1')>0;五.查詢每個專業(yè)的男生人數和女生人數
方式一
SELECT COUNT(*) 個數,sex,majorid FROM student GROUP BY sex,majorid;方式二
SELECT majorid, (SELECT COUNT(*) FROM student WHERE sex='男' AND majorid=s.`majorid`) 男, (SELECT COUNT(*) FROM student WHERE sex='女' AND majorid=s.`majorid`) 女 FROM student s GROUP BY majorid;六.查詢專業(yè)和張翠山一樣的學生最低分
①查詢張翠山的專業(yè)編號
SELECT majorid FROM student WHERE studentname = '張翠山';②查詢編號=①的所有學生編號
SELECT studentno FROM student WHERE majorid=(SELECT majoridFROM studentWHERE studentname = '張翠山' );②查詢最低分
SELECT MIN(score) FROM result WHERE studentno IN(SELECT studentnoFROM studentWHERE majorid=(SELECT majoridFROM studentWHERE studentname = '張翠山') );七.查詢大于60分的學生的姓名,密碼,專業(yè)名
SELECT studentname,loginpwd,majorname FROM student s JOIN major m ON s.`majorid`=m.`majorid` JOIN result r ON s.`studentno`=r.`studentno` WHERE r.`score`>60;八.按郵箱位數分組,查詢每組學生個數
SELECT COUNT(*) FROM student GROUP BY LENGTH(email);九.查詢學生名,專業(yè)名,分數
SELECT studentname,score,majorname FROM student s JOIN major m ON s.`majorid`=m.`majorid` JOIN result r ON s.`studentno`=r.`studentno`;十.查詢哪個專業(yè)沒有學生,分別用左連接有鏈接實現
SELECT m.majorid,m.majorname,s.studentno FROM major m LEFT JOIN student s ON m.`majorid`=s.`majorid` WHERE s.`studentno` IS NULL;十一.查詢沒有成績的學生人數
SELECT s.*,r.id FROM student s LEFT JOIN result r ON s.`studentno`=r.`studentno` WHERE r.`id` IS NULL;進階9:聯合查詢
/*
union 聯合 合并:將多條查詢語句的結果合并成一個結果
語法:
查詢語句1
union
查詢語句2
union
…
應用場景:
要查詢的結果來自于多個表,且多個表沒有直接的連接關系,但查詢的信息一致時
特點:★
1、要求多條查詢語句的查詢列數是一致的!
2、要求多條查詢語句的查詢的每一列的類型和順序最好一致
3、union關鍵字默認去重,如果使用union all 可以包含重復項
*/
引入的案例:查詢部門編號>90或郵箱包含a的員工信息
SELECT * FROM employees WHERE email LIKE '%a%' OR department_id>90;;SELECT * FROM employees WHERE email LIKE '%a%' UNION SELECT * FROM employees WHERE department_id>90;案例:查詢中國用戶中男性的信息以及外國用戶中年男性的用戶信息
SELECT id,cname FROM t_ca WHERE csex='男' UNION ALL SELECT t_id,tname FROM t_ua WHERE tGender='male';DML語言
/*
數據操作語言:
插入:insert
修改:update
刪除:delete
*/
一.插入語句
/*
語法:
insert into 表名(列名,…)
values(值1,值2);
*/
1.插入的值的類型與列的類型一致或兼容
SELECT * FROM beauty; INSERT INTO beauty(id,NAME,sex,borndate,phone,photo,boyfriend_id) VALUES(13,'唐藝昕','女','1990-4-23','18988888888',NULL,2);2.不可以為null的列必須插入值,可以為null的列如何插入值?
方式一:
INSERT INTO beauty(id,NAME,sex,borndate,phone,photo,boyfriend_id) VALUES(13,'唐藝昕','女','1990-4-23','1898888888',NULL,2);方式二:
INSERT INTO beauty(id,NAME,sex,phone) VALUES(15,'娜扎','女','13888888888');3.列的順序是否可以調換
INSERT INTO beauty(NAME,sex,id,phone) VALUES('蔣欣','女',16,'110');4.列數和值個數必須一致
INSERT INTO beauty(NAME,sex,id,phone) VALUES('關曉彤','女',17,'110');5.可以省略列名,默認所有列,而且列的順序和表的順序
INSERT INTO beauty VALUES(18,'張飛','男',NULL,'119',NULL,NULL);方式二
/*
語法:
insert into 表名
set 列名=值,列名=值,…
*/
1.
INSERT INTO beauty SET id=19,NAME='劉濤',phone='999';兩種方式大pk
1.方式一支持插入多行
INSERT INTO beauty VALUES (23,'唐藝昕1','女','1990-4-23','18988888888',NULL,2) ,(24,'唐藝昕2','女','1990-4-23','18988888888',NULL,2) ,(25,'唐藝昕3','女','1990-4-23','18988888888',NULL,2); SELECT * FROM beauty;2.方式一支持子查詢,方式二不支持
INSERT INTO beauty(id,NAME,phone) SELECT 26,'宋茜','11864654';INSERT INTO beauty(id,NAME,phone) SELECT id,boyName FROM boys WHERE id<3;二.修改語句
/*
1.修改單表記錄?
語法:
update 表名
set 列=新值,列=新值,…
where 篩選條件
2.修改多表記錄【補充】
語法:
update 表1 別名1,表2 別名
set 列=值,…
where 連接條件
and 篩選條件;
sql99語法:
update 表1 別名
inner|left|right join 表2 別名
on 連接條件
set 列=值,…
where 篩選條件
*/
1.修改單表記錄
案例1:修改beauty表中姓唐的女神電話為138456789
UPDATE beauty SET phone='138456789' WHERE NAME LIKE '唐%';案例2:修改boys表中id號為2的名稱為張飛,魅力值為10
UPDATE boys SET boyName='張飛',usercp=10 WHERE id=2;2.修改多表的記錄
案例1:修改張無忌女朋友手機號為114
UPDATE boys bo INNER JOIN beauty b ON bo.`id`=b.`boyfriend_id` SET b.`phone`='114' WHERE bo.`boyName`='張無忌';案例2:修改沒有男朋友的女神的男朋友編號都為2號
UPDATE boys bo INNER JOIN beauty b ON bo.`id`=b.`boyfriend_id` SET b.`boyfriend_id`=2 WHERE b.`id` IS NULL;三.刪除語句
/*
方式一:delete
語法:
1.單表刪除?
delete from 表名 where 篩選條件
2.多表刪除【補充】
sql92
delete 表1的別名,表2的別名
from 表1 別名,表2 別名
where 連接條件
and 篩選條件;
sql99語法:
delete 表1的別名,表2的別名
from 表1 別名
inner|left|right join 表2 別名 on 連接條件
where 篩選條件
方式二:truncate
語法:truncate table 表名;
*/
方式一:delete
1.實現單表刪除
案例1:刪除手機號以9結尾的信息
DELETE FROM beauty WHERE phone LIKE '%9';2.多表的刪除
案例:刪除張無忌女朋友信息
DELETE b FROM beauty b INNER JOIN boys bo ON b.`boyfriend_id`=bo.`id` WHERE bo.`boyName`='張無忌';SELECT * FROM boys;案例:刪除黃曉明信息以及他女朋友信息
DELETE b,bo FROM beauty b INNER JOIN boys bo ON b.`boyfriend_id`=bo.`id` WHERE bo.`boyName`='黃曉明';方式二:truncate語句
案例:將魅力值大于100的男神刪除
TRUNCATE TABLE boys;#delete PK truncatw
/*
1.delete可以加where條件 truncate不可以
2.truncate刪除,效率高一丟丟
3.假如要刪除的表中有自增長列,如果用delete刪除后,再插入數據,自增長列值從斷電開始
而truncate刪除后,再插入數據,自增長列值從1開始
4.truncate刪除沒有返回值,delete刪除有返回值
5.truncate刪除不能回滾,delete刪除可以回滾
*/
DDL
/*
數據定義語言
庫和表的管理
一.庫的管理
創(chuàng)建·修改·刪除
二.表的管理
創(chuàng)建·修改·刪除
創(chuàng)建:create
修改:alter
刪除:drop
*/
一.庫的管理
1.庫的創(chuàng)建
/*
create datebase庫名
*/
案例:創(chuàng)建庫books
CREATE DATABASE IF NOT EXISTS books;2.庫的修改
更改庫的字符集
ALTER DATABASE books CHARACTER SET gbk;3.庫的刪除
DROP DATABASE IF EXISTS books;二.表的管理
1.表的創(chuàng)建?
/*
create table 表名(
列名 列的類型【(長度) 約束】,
列名 列的類型【(長度) 約束】,
列名 列的類型【(長度) 約束】,
…
列名 列的類型【(長度) 約束】,
);
*/
案例:創(chuàng)建表book
CREATE TABLE book(id INT,#編號bname VARCHAR(20),#圖書名price DOUBLE,#價格authorid INT,#作者publishDate DATETIME#出版日期 ); DESC book;案例:創(chuàng)建表author
CREATE TABLE author(id INT,au_name VARCHAR(20),nation VARCHAR(10) ); DESC author;2.表的修改
/*
alter table 表名 add|drop|modify|change column 列名 【列類型 約束】
*/
①修改列名
ALTER TABLE book CHANGE COLUMN publishDate pubDate DATETIME;②修改列的類型或約束
ALTER TABLE book MODIFY COLUMN pubDate TIMESTAMP;③添加新列
ALTER TABLE author ADD COLUMN annual DOUBLE;④刪除列
ALTER TABLE author DROP COLUMN annual;⑤修改表名
ALTER TABLE author RENAME TO book_author;3.表的刪除
DROP TABLE IF EXISTS book_author;#通用寫法:
DROP DATABASE IF EXISTS 舊庫名; CREATE DATABASE 新庫名;DROP TABLE IF EXISTS 舊表名; CREATE TABLE 表名();4.表的復制
INSERT INTO author VALUES (1,'村上春樹','日本'), (2,'莫言','中國'), (3,'馮唐','中國'), (4,'金庸','中國');SELECT * FROM author; SELECT * FROM copy2;4.1.僅僅復制表結構
CREATE TABLE copy LIKE author;4.2.復制表結構+數據
CREATE TABLE copy2 SELECT * FROM author;4.3只復制部分數據
CREATE TABLE copy3 SELECT id,au_name FROM author WHERE nation = '中國';4.4僅僅復制某些字段
CREATE TABLE copy4 SELECT id,au_name FROM author WHERE 1=2;常見數據類型
數值型:
整型
小數:
定點數
浮點數
字符型:
較短的文本:char,varchar
較長的文本:text,blob(較長的二進制數據)
日期型:
一.整型
/*
分類:
| 1 | 2 | 3 | 4 | 8 |
特點:
①如果不設置有符號無符號,默認有符號,想設置無符號,添加unsigned
②如果插入數值超出范圍,報異常out of range,并且插入臨界值(新版報錯)
③如果不設置長度,會有默認長度
*/
1.如何設置無符號和有符號
DROP TABLE IF EXISTS tab_int; CREATE TABLE tab_int(ti INT,t2 INT UNSIGNED ) DESC tab_int; INSERT INTO tab_int VALUES(-1234657,-1234456); SELECT * FROM tab_int;二.小數
1.浮點型
float(M,D)
double(M,D)
2.定點型
dec(M,D)
decimal(M,D)
特點:
①
M:整數部位+小數部位
D:小數部位
如果超過范圍,則插入臨界值
②
M和D均可省略
如果是decimal,則M默認為10,D默認為0
如果是float和double,則會根據插入的數值精度來確定
③定點型的精確度較高,如果要求插入數值的精確度較高如貨幣運算等
測試M和D
CREATE TABLE tab_float(f1 FLOAT(5,2),f2 DOUBLE(5,2),f3 DECIMAL(5,2) ); SELECT * FROM tab_float; INSERT INTO tab_float VALUES(123.45,123.45,123.45);原則 :所選擇的類型越簡單越好,能保存數值的類型越小越好
三.字符型
/*
較短的文本:
char
varchar
其他:
binary和varbinary用于保存較短的二進制
enum用于保存枚舉
set用于保存集合
較長的文本:
text
blob(較大的二進制)
特點:
| char | char(M) | 最大字符數 | 固定長度的字符 | 比較耗時 | 高 |
| varchar | varchar(M) | 最大的字符數 | 可變長度的字符 | 比較節(jié)省 | 低 |
四.日期型
分類:
date只保存日期
time只保存時間
year只保存年
datetime保存日期+時間
timestamp保存日期+時間
特點:
| datetime | 8 | 1000-9999 | 不受 |
| timestamp | 4 | 1970-2038 | 受 |
常見約束
/*
含義:一種限制,用于限制表中數據,為了保證表中數據準確性可靠性
分類:六大約束
NOT NULL:非空約束,用于保證該字段值不能為空
比如:姓名,學號等
DEFAULT:默認,用于保證該字段有默認值
比如性別
PRIMARY KEY:主鍵,用于保證該字段的值具有唯一性,并且非空
比如學號,員工編號
UNIQUE:唯一,用于保證該字段的值具有唯一性,可以為空
比如座位號
CHECK:檢查約束【mysql不支持】
FOREIGN KEY:外鍵,用于限制兩個表的關系,用于保證該字段的值必須來自于主表的關聯列的值
在從表添加外鍵約束,用于引用主表中某列值
比如學生表的專業(yè)編號,員工表的部門編號,工種編號
添加約束的時機:
1.創(chuàng)建表
2.修改表
約束添加的分類
列級約束
六大約束語法都支持,但外鍵約束無效果
表級約束
除了非空,默認,其他的都支持
| 主鍵 | √ | × | × |
| 唯一 | √ | √ | √ |
CREATE TABLE 表名(
字段名 字段類型 列級約束,
字段名 字段類型,
表級約束
)
一.創(chuàng)建表時添加約束
1.添加列級約束
/*
語法:直接在字段名和類型后面追加,約束類型即可
只支持:默認,非空,主鍵,唯一
*/
CREATE DATABASE students; USE students;CREATE TABLE stuinfo( id INT PRIMARY KEY, stuName VARCHAR(20) NOT NULL, gender CHAR(1) CHECK(gender='男' OR gender='女'), seat INT UNIQUE, age INT DEFAULT 18, majorId INT REFERENCES major(id) );CREATE TABLE major( id INT PRIMARY KEY, majorName VARCHAR(20) );DESC stuinfo;查看stuinfo表中所有索引,包括主鍵外鍵唯一
SHOW INDEX FROM stuinfo;2.添加表級的約束
/*
語法:在各個字段的最下面
【constraint 約束名】 約束類型(字段名)
*/
DROP TABLE IF EXISTS stuinfo; CREATE TABLE stuinfo(id INT,majorName VARCHAR(20),gender CHAR(1),seat INT,age INT,majorid INT,PRIMARY KEY(id),UNIQUE(seat),CHECK(gender='男' OR gender='女'),FOREIGN KEY(majorid) REFERENCES major(id) );SHOW INDEX FROM stuinfo;通用的寫法:
CREATE TABLE IF NOT EXISTS stuinfo(id INT PRIMARY KEY,stuname VARCHAR(20) NOT NULL,sex CHAR(1),age INT UNIQUE 18,seat INT UNIQUE,majorid INT,CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id) );二.修改表時添加約束
/*
1.添加列級約束
alter table 表名 modify column 字段名 字段類型 新約束;
2.添加表級約束
alter table 表名 add 【constraint 約束名】 約束類型(字段名) 【外鍵的引用】;
*/
1.添加非空約束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;2.添加默認約束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;3.添加主鍵
①列級約束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;②表級約束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);4.添加唯一
①列級約束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;②表級約束
ALTER TABLE stuinfo ADD UNIQUE(seat);5.添加外鍵
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id);三.修改表時刪除約束
1.刪除非空約束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;2.刪除默認約束
ALTER TABLE stuinfo MODIFY COLUMN age INT;3.刪除主鍵
ALTER TABLE stuinfo DROP PRIMARY KEY;4.刪除唯一
ALTER TABLE stuinfo DROP INDEX seat;5.刪除外鍵
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;案例
1.向表emp2的id列中添加primary key的約束(my_emp_id_pk)
ALTER TABLE emp2 MODIFY COLUMN id INT PRIMARY KEY; ALTER TABLE emp2 ADD CONSTRAINT my_emp_id_pk PRIMARY KEY(id);2.向表emp2中添加列dep_id,并在其中定義foreign key約束,與之相關的列是dep2表中的id列
ALTER TABLE emp2 ADD COLUMN dep_id INT; ALTER TABLE emp2 ADD CONSTRAINT fk_emp2_dep2 FOREIGN KEY(dep_id) REFERENCES dept(id);標識列
又稱為自增長列
含義:可以不用手動插入值,系統提供默認的序列值
特點:
也可以通過手動插入值設置起始值
一.創(chuàng)建表時設置標識列
CREATE TABLE tab_identity(id INT,NAME FLOAT,seat INT ); DROP TABLE tab_identity; TRUNCATE TABLE tab_identity; INSERT INTO tab_identity(id,NAME) VALUES(NULL,'lucy'); INSERT INTO tab_identity(NAME) VALUES('lucy'); SELECT * FROM tab_identity;SHOW VARIABLES LIKE '%auto_increment%';SET auto_increment_increment=3;二.修改表時設置標識列
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT; AUTO_INCREMENT;三.修改表時刪除標識列
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY;TCL
Transction Control Language 事務控制語言
事物:
一個或者一組sql語句組成一個執(zhí)行單元,這個執(zhí)行單元要么全部執(zhí)行,要么全部不執(zhí)行
案例:轉賬
張三豐 1000
郭襄 1000
update 表 set 張三豐的余額=500 where name=‘張三豐’
意外
update 表 set 郭襄的余額=1500 where name=‘郭襄’
事務的特性:
ACID
原子性:一個事務不可再分,要么都執(zhí)行,要么都不執(zhí)行
一致性:一個事務執(zhí)行會使數據從一個一致狀態(tài)切換至另一個一致狀態(tài)
隔離性:一個事務的執(zhí)行不受其他事務的干擾
持久性:一個事務一旦提交,則會永久性的改變數據庫的數據
事務的創(chuàng)建
隱式事務:事務沒有明顯的開啟和結束的標記
比如insert,update,delete語句
delete from 表 where id=1;
顯式事務:事務具有明顯的開啟和結束的標記
前提:必須先設置自動提交功能為禁用
set autocommit=0;
步驟1:開啟事務
set autocommit=0;
start transaction; 可選的
步驟2:編寫事務中的sql語句(select insert update delete)
語句1;
語句2;
…
步驟3:結束事務
commit;提交事務
rollback;回滾事務
savepoint 節(jié)點名; 設置保存點
事務的隔離級別:
| read uncommitted | √ | √ | √ |
| read committed | × | √ | √ |
| repeatable read | × | × | √ |
| serializable | × | × | × |
mysql中默認 第三個隔離級別 repeatable read
oracle中默認第二個隔離級別 read committed
查看隔離級別
select @@tx_isolation;設置隔離級別
set session|globle transaction isolation level 隔離級別;開啟事務的語句;
update 表 set 張三豐的余額=500 where name='張三豐' update 表 set 郭襄的余額=1500 where name='郭襄'結束事務的語句;
查看mysql支持的存儲引擎
SHOW ENGINES; SHOW VARIABLES LIKE 'autocommit';演示事務的使用步驟
SET autocommit=0; START TRANSACTION;編寫一組事務的語句
UPDATE account SET balance = 1000 WHERE username='張無忌'; UPDATE account SET balance = 1000 WHERE username='趙敏';結束事務
ROLLBACK; #commit;3.演示savepoint的使用
SET autocommit=0; START TRANSACTION; DELETE FROM account WHERE id=25; SAVEPOINT a; #設置保存點 DELETE FROM account WHERE id=29; ROLLBACK TO a; #回滾到保存點視圖
含義:虛擬表,和普通的表一樣使用
mysql5.1版本出現的新特性,是通過表動態(tài)生成的數據
比如:舞蹈班和普通班的對比
案例:查詢姓張的學生名和專業(yè)名
SELECT stuName,majorName FROM stuinfo s INNER JOIN major m ON s.`majorid`=m.`id` WHERE s.`majorName` LIKE '張%';CREATE VIEW v1 AS SELECT stuName,majorName FROM stuinfo s INNER JOIN major m ON s.`majorid`=m.`id` WHERE s.`majorName` LIKE '張%';SELECT * FROM v1 WHERE stuname LIKE '張%';一.創(chuàng)建視圖
/*
語法:
create view 視圖名
as
查詢語句;
*/
案例1:查詢姓名中包含a字符的員工名,部門名,和工種信息
①創(chuàng)建
CREATE VIEW myv1 ASSELECT 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 myv1 WHERE last_name LIKE '%a%';案例2:查詢各部門的平均工資級別
創(chuàng)建視圖查看每個部門的平均工資
CREATE VIEW myv2 AS SELECT AVG(salary) ag,department_id FROM employees GROUP BY department_id;②使用
SELECT myv2.`ag`,g.grade_level FROM myv2 JOIN job_grades g ON myv2.`ag` BETWEEN g.`lowest_sal` AND g.`highest_sal`;案例3:查詢平均工資最低的部門信息
SELECT * FROM myv2 ORDER BY ag LIMIT 1;案例4:查詢平均工資最低的部門名和工資
CREATE VIEW myv3 AS SELECT * FROM myv2 ORDER BY ag LIMIT 1;SELECT d.*,m.ag FROM myv3 m JOIN departments d ON m.`department_id`=d.`department_id`;二.視圖的修改
方式一
create or replace view
as
查詢語句;
方式二:
語法:
alter view 視圖名
as
查詢語句
*/
三.刪除視圖
/*
語法:drop view 視圖名,視圖名…;
*/
四.查看視圖
DESC myv3; SHOW CREATE VIEW myv3;案例:
案例1:創(chuàng)建視圖emp_v1,要求查詢電話號碼以011開頭的員工姓名工資郵箱
CREATE OR REPLACE VIEW emp_v1 AS SELECT last_name,salary,email FROM employees WHERE phone_number LIKE '011%';案例2:創(chuàng)建視圖emp_v2,要求查詢部門的最高工資高于12000的部門信息
CREATE OR REPLACE VIEW emp_v2 AS SELECT MAX(salary) mx_dep,department_id FROM employees GROUP BY department_id HAVING MAX(salary)>12000;SELECT d.*,m.mx_dep FROM departments d JOIN emp_v2 m ON m.department_id=d.department_id;五.視圖的更新
CREATE OR REPLACE VIEW myv1 AS SELECT last_name,email,salary*12*(1+IFNULL(commission_pct,0)) "annual salary" FROM employees;CREATE OR REPLACE VIEW myv1 AS SELECT last_name,email FROM employees;SELECT * FROM myv1; SELECT * FROM employees;1.插入
INSERT INTO myv1 VALUES('張飛','zf@qq.com');2.修改
UPDATE myv1 SET last_name='張無忌' WHERE last_name='張飛';3.刪除
DELETE FROM myv1 WHERE last_name = '張無忌';具備以下特點的視圖不允許更新
①包含以下關鍵字的sql語句:分組函數,distinct,group by,having,union或者union all
CREATE OR REPLACE VIEW myv1 AS SELECT MAX(salary) m,department_id FROM employees GROUP BY department_id;SELECT * FROM myv1;更新
UPDATE myv1 SET m=9000 WHERE department_id-10;②常量視圖
CREATE OR REPLACE VIEW myv2 AS SELECT 'john' NAME;SELECT * FROM myv2;更新
UPDATE myv2 SET NAME='lucy';③select中包含子查詢
CREATE OR REPLACE VIEW myv3 AS SELECT (SELECT MAX(salary) FROM employees) 最高工資;SELECT * FROM myv3;更新
UPDATE myv3 SET 最高工資=100000;④join
CREATE OR REPLACE VIEW myv4 AS SELECT last_name,department_name FROM employees e JOIN departments d ON e.department_id=d.department_id;更新
SELECT * FROM myv4; UPDATE myv4 SET last_name='張飛' WHERE last_name='WHalen'; INSERT INTO myv4 VALUES('陳真','xxxx');⑤from一個不能更新視圖
CREATE OR REPLACE VIEW myv5 AS SELECT * FROM myv3;更新
SELECT * FROM myv5; UPDATE myv5 SET 最高工資=10000 WHERE department_id =60;⑥where子句的子查詢引用了子句中的表
CREATE OR REPLACE VIEW myv6 AS SELECT last_name,email,salary FROM employees WHERE employees_id IN (SELECT manager_idFROM employeesWHERE manager_id IS NOT NULL ); SELECT * FROM MYV6;更新
UPDATE myv6 SET salary=10000 WHERE last_name='king';2.delete和truncate在事務使用時的區(qū)別
演示delete
SET autocommit=0; strat TRANSACTION; DELETE FROM account; ROLLBACK;SELECT * FROM account;演示truncate
SET autocommit=0; START TRANSACTION; TRUNCATE TABLE account; ROLLBACK;案例
1.創(chuàng)建book表
CREATE TABLE book(bid INT PRIMARY KEY,bname VARCHAR(20) UNIQUE NOT NULL,price FLOAT DEFAULT 10,btypeId INT,FOREIGN KEY(btypeId) REFERENCES bookType(id) );2.開啟事務,向表中插入一行數據,并結束
SET auyocommit=0; INSERT INTO book(bid,bname,price,btypeId) VALUES(1,'小李飛刀',100,1); ROLLBACK;3.創(chuàng)建視圖,實現查詢價格大于100的書名和類型名
CREATE VIEW myv1 AS SELECT bname,NAME FROM book b JOIN bookType t ON b.btypeid=t.id WHERE price>100;4.修改視圖,實現查詢價格在90-120之間的書名,價格
CREATE OR REPLACE VIEW myv1 AS SELECT bname,price FROM book WHERE price BETWEEN 90 AND 120;5.刪除剛剛創(chuàng)建的視圖
DROP VIEW myv1;總結
以上是生活随笔為你收集整理的Python全栈开发-Mysql知识点总结(中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重要提醒:你有一份专属红包封面待查收!
- 下一篇: linux cmake编译源码,linu