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);
练习
一.查询每个专业的学生人数
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;
四.查询每个专业生日在’1988-1-1’后的学生姓名,学号
SELECT studentname,majorname
FROM student s
JOIN major m
ON s.`majorid`=m.`majorid`
WHERE DATEDIFF(borndate,'1988-1-1')>0;
五.查询每个专业的男生人数和女生人数
方式一
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;
六.查询专业和张翠山一样的学生最低分
①查询张翠山的专业编号
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分的学生的姓名,密码,专业名
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);
九.查询学生名,专业名,分数
SELECT studentname,score,majorname
FROM student s
JOIN major m ON s.`majorid`=m.`majorid`
JOIN result r ON s.`studentno`=r.`studentno`;
十.查询哪个专业没有学生,分别用左连接有链接实现
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
/*
数据定义语言
库和表的管理
一.库的管理
创建·修改·删除
二.表的管理
创建·修改·删除
创建:create
修改:alter
删除:drop
*/
一.库的管理
1.库的创建
/*
create datebase库名
*/
案例:创建库books
CREATE DATABASE IF NOT EXISTS books;
2.库的修改
更改库的字符集
ALTER DATABASE books CHARACTER SET gbk;
3.库的删除
DROP DATABASE IF EXISTS books;
二.表的管理
1.表的创建♥
/*
create table 表名(
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】,
…
列名 列的类型【(长度) 约束】,
);
*/
案例:创建表book
CREATE TABLE book(id INT,#编号bname VARCHAR(20),#图书名price DOUBLE,#价格authorid INT,#作者publishDate DATETIME#出版日期
);
DESC book;
案例:创建表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(较长的二进制数据)
日期型:
一.整型
/*
分类:
tinyint | smallint | mediumint | int/integer | bigint |
---|---|---|---|---|
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(较大的二进制)
特点:
写法 | M的意思 | 特点 | 空间耗费 | 效率 | |
---|---|---|---|---|---|
char | char(M) | 最大字符数 | 固定长度的字符 | 比较耗时 | 高 |
varchar | varchar(M) | 最大的字符数 | 可变长度的字符 | 比较节省 | 低 |
四.日期型
分类:
date只保存日期
time只保存时间
year只保存年
datetime保存日期+时间
timestamp保存日期+时间
特点:
字节 | 范围 | 时区影响 | |
---|---|---|---|
datetime | 8 | 1000-9999 | 不受 |
timestamp | 4 | 1970-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:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值
在从表添加外键约束,用于引用主表中某列值
比如学生表的专业编号,员工表的部门编号,工种编号
添加约束的时机:
1.创建表
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 表名(
字段名 字段类型 列级约束,
字段名 字段类型,
表级约束
)
一.创建表时添加约束
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;设置步长
也可以通过手动插入值设置起始值
一.创建表时设置标识列
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语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行
案例:转账
张三丰 1000
郭襄 1000
update 表 set 张三丰的余额=500 where name=‘张三丰’
意外
update 表 set 郭襄的余额=1500 where name=‘郭襄’
事务的特性:
ACID
原子性:一个事务不可再分,要么都执行,要么都不执行
一致性:一个事务执行会使数据从一个一致状态切换至另一个一致状态
隔离性:一个事务的执行不受其他事务的干扰
持久性:一个事务一旦提交,则会永久性的改变数据库的数据
事务的创建
隐式事务:事务没有明显的开启和结束的标记
比如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 节点名; 设置保存点
事务的隔离级别:
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
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版本出现的新特性,是通过表动态生成的数据
比如:舞蹈班和普通班的对比
案例:查询姓张的学生名和专业名
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 '张%';
一.创建视图
/*
语法:
create view 视图名
as
查询语句;
*/
案例1:查询姓名中包含a字符的员工名,部门名,和工种信息
①创建
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:查询各部门的平均工资级别
创建视图查看每个部门的平均工资
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:创建视图emp_v1,要求查询电话号码以011开头的员工姓名工资邮箱
CREATE OR REPLACE VIEW emp_v1
AS
SELECT last_name,salary,email
FROM employees
WHERE phone_number LIKE '011%';
案例2:创建视图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在事务使用时的区别
演示delete
SET autocommit=0;
strat TRANSACTION;
DELETE FROM account;
ROLLBACK;SELECT * FROM account;
演示truncate
SET autocommit=0;
START TRANSACTION;
TRUNCATE TABLE account;
ROLLBACK;
案例
1.创建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.创建视图,实现查询价格大于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.删除刚刚创建的视图
DROP VIEW myv1;
Python全栈开发-Mysql知识点总结(中)相关推荐
- python在日常工作处理中的应用-Python全栈开发在实际工作中的应用
2012年,SEO行业分为两派--技术派和理论派,技术派认为应该深入理解搜索引擎工作原理. 学会web开发,这样做SEO才能走得远;理论派则认为只要掌握理论,会不会编程无所谓.当时SEO人员纷纷站队, ...
- python全栈开发 * 31知识点汇总 * 180716
31 模块和包一.模块(一)模块的种类:内置模块,自定义模块,扩展模块第三方模块(二)自定义模块 1.模块的创建 : 新建一个py文件. 2.模块名 : 模块名需要符合变量的命名规范. 3.模块的导入 ...
- python全栈开发 * 32知识点汇总 * 180717
32 网络编程 (一)一.架构 定义:程序员开发的一种模式. 分类: C/S 架构 C/S即:Client与Server , 客户端/ 服务器模式 . 缺点 : 冗余 B/S 架构 Browser与S ...
- python全栈开发 * 08知识点汇总 * 180608
08知识点梳理 文件操作一 .文件操作 r (只读)1.r (读) rb(字节)f=open("果蔬大杂烩",mode="r",encoding="U ...
- python全栈开发 * 07知识点汇总 * 180607
07 set集合,深浅拷⻉以及部分知识点补充 一.while,for 循环知识点补充 二.int, str的相关操作 1.列表变字符串 # lst=["红","橙&qu ...
- python全栈开发 * 24 知识点汇总 * 180705
24 模块-------序列化一.什么是模块 模块:py文件就是一个模块.二.模块的分类:(1)内置模块 (登录模块,时间模块,sys模块,os模块)(2)扩展模块 (itchat 微信有关,爬虫,b ...
- python全栈开发 * 14 知识点汇总 * 180530
14 生成器表达式 内置函数# 一.迭代器 (补充)# 1.如何判断迭代对象,迭代器# (1).dir(obj)检测对象有没有iter方法,然后it=obj.__iter__() 获取迭代器 , it ...
- python全栈开发 * 30知识点汇总 * 180713
30 re模块2一.正则表达式在线测试 在线测试工具 http://tool.chinaz.com/regex/(一).*?的用法: . 是任意字符 * 是取 0 至 无限长度 ? 是非贪婪模式.合在 ...
- Python全栈开发记录_第一篇(循环练习及杂碎的知识点)
Python全栈开发记录只为记录全栈开发学习过程中一些难和重要的知识点,还有问题及课后题目,以供自己和他人共同查看.(该篇代码行数大约:300行) 知识点1:优先级:not>and 短路原则:a ...
最新文章
- iOS之深入解析dispatch source的原理与功能
- (ab)使用Java 8 FunctionalInterfaces作为本地方法
- 卢伟冰:“四摄小金刚”的诞生是为了让更多用户享受全场景拍摄的乐趣
- 关于Python,虚拟环境和Visual Studio Code集成的说明
- matlab中取文件名函数,matlab从文件夹名中获取该文件夹下所图像文件名
- 给初创业者的几点建议
- SSRF利用协议中的万金油——Gopher
- [史]世界史上的6大古帝国
- 万亿估值来了!3次大难不死,蚂蚁金服终于登顶世界第一
- MindManager21简体中文永久版思维导图
- iphone鉴权,idps,iPhone蓝牙回控,iphone键盘,iphone手机互联,USB外设开发
- 贝塞尔曲线是什么?如何用 Canvas 绘制三阶贝塞尔曲线?
- 炼钢行业皮带无人化管理的问题及解决
- 计算机之父阿兰·图灵(图灵诞辰104周年)
- Stay Hungry, Stay Foolish — 求知若饥,虚心若愚!
- go二维map_go map详细使用方法
- c语言程序输入中能不能输入中文,如何在C语言中输入中文?
- matlab/simulink仿真步长设置
- Python语言_理論與習題
- 男士最佳衣着选择搭配