日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Python全栈开发-Mysql知识点总结(中)

發(fā)布時間:2024/3/13 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python全栈开发-Mysql知识点总结(中) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

進階8.分頁查詢???

/*
應用場景:當要顯示的數據,一頁顯示不全,需要分頁提交sql請求
語法:
select 查詢列表
from 表
【join type】 join 表2
on 連接條件
where 篩選條件
group by 分組條件
having 分組后的篩選
order by 排序的字段
limit offset,size;

offset 要顯示條目的起始索引(起始索引從0開始) size 要顯示的條目個數

特點:
①limit語句放在查詢語句的最后
②公式
要顯示的頁數page,每頁條目數size

select 查詢列表 from 表 limit (page-1)*size,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刪除可以回滾
*/

SELECT * FROM boys; DELETE FROM boys; TRUNCATE TABLE boys; INSERT INTO boys (boyName,userCP) VALUES('張飛',100),('劉備',100),('關云長',100);

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(較長的二進制數據)
日期型:

一.整型

/*
分類:

tinyintsmallintmediumintint/integerbigint
12348

特點:
①如果不設置有符號無符號,默認有符號,想設置無符號,添加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(較大的二進制)

特點:

寫法M的意思特點空間耗費效率
charchar(M)最大字符數固定長度的字符比較耗時
varcharvarchar(M)最大的字符數可變長度的字符比較節(jié)省

四.日期型

分類:
date只保存日期
time只保存時間
year只保存年

datetime保存日期+時間
timestamp保存日期+時間
特點:

字節(jié)范圍時區(qū)影響
datetime81000-9999不受
timestamp41970-2038
CREATE TABLE tab_date(t1 DATETIME,t2 TIMESTAMP ); INSERT INTO tab_date VALUES(NOW(),NOW()); SELECT * FROM tab_date; SHOW VARIABLES LIKE 'time_zone'; SET time_zone='+9:00';

常見約束

/*
含義:一種限制,用于限制表中數據,為了保證表中數據準確性可靠性

分類:六大約束
NOT NULL:非空約束,用于保證該字段值不能為空
比如:姓名,學號等
DEFAULT:默認,用于保證該字段有默認值
比如性別
PRIMARY KEY:主鍵,用于保證該字段的值具有唯一性,并且非空
比如學號,員工編號
UNIQUE:唯一,用于保證該字段的值具有唯一性,可以為空
比如座位號
CHECK:檢查約束【mysql不支持】
FOREIGN KEY:外鍵,用于限制兩個表的關系,用于保證該字段的值必須來自于主表的關聯列的值
在從表添加外鍵約束,用于引用主表中某列值
比如學生表的專業(yè)編號,員工表的部門編號,工種編號

添加約束的時機:
1.創(chuàng)建表
2.修改表

約束添加的分類
列級約束
六大約束語法都支持,但外鍵約束無效果

表級約束
除了非空,默認,其他的都支持

保證唯一性是否允許為空一個表中可否有多個
主鍵××
唯一
insert into major values(1,'java'); insert into major values(2,'h5'); insert into stuinfo values(1,'john','男',null,19,1); insert into stuinfo values(2,'lily','男',null,19,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);

標識列

又稱為自增長列
含義:可以不用手動插入值,系統提供默認的序列值
特點

  • 標識列必須和主鍵搭配嗎?不一定,但要求是個key
  • 一個表中可以有多少個標識列?至多一個!
  • 標識列的類型 只能是數值型
  • 標識列可以通過 SET auto_increment_increment=3;設置步長
    也可以通過手動插入值設置起始值
  • 一.創(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 隔離級別;

    開啟事務的語句;

    updateset 張三豐的余額=500 where name='張三豐' updateset 郭襄的余額=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
    查詢語句;

    SELECT * FROM myv3; CREATE OR REPLACE VIEW myv3 AS SELECT AVG(salary),job_id FROM employees GROUP BY job_id;

    方式二:

    語法:
    alter view 視圖名
    as
    查詢語句
    */

    ALTER VIEW myv3 AS SELECT * FROM employees;

    三.刪除視圖

    /*
    語法:drop view 視圖名,視圖名…;
    */

    DROP VIEW myv1,myv2,myv3;

    四.查看視圖

    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知识点总结(中)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。