进阶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);

标识列

又称为自增长列
含义:可以不用手动插入值,系统提供默认的序列值
特点

  1. 标识列必须和主键搭配吗?不一定,但要求是个key
  2. 一个表中可以有多少个标识列?至多一个!
  3. 标识列的类型 只能是数值型
  4. 标识列可以通过 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知识点总结(中)相关推荐

  1. python在日常工作处理中的应用-Python全栈开发在实际工作中的应用

    2012年,SEO行业分为两派--技术派和理论派,技术派认为应该深入理解搜索引擎工作原理. 学会web开发,这样做SEO才能走得远;理论派则认为只要掌握理论,会不会编程无所谓.当时SEO人员纷纷站队, ...

  2. python全栈开发 * 31知识点汇总 * 180716

    31 模块和包一.模块(一)模块的种类:内置模块,自定义模块,扩展模块第三方模块(二)自定义模块 1.模块的创建 : 新建一个py文件. 2.模块名 : 模块名需要符合变量的命名规范. 3.模块的导入 ...

  3. python全栈开发 * 32知识点汇总 * 180717

    32 网络编程 (一)一.架构 定义:程序员开发的一种模式. 分类: C/S 架构 C/S即:Client与Server , 客户端/ 服务器模式 . 缺点 : 冗余 B/S 架构 Browser与S ...

  4. python全栈开发 * 08知识点汇总 * 180608

    08知识点梳理 文件操作一 .文件操作 r (只读)1.r (读) rb(字节)f=open("果蔬大杂烩",mode="r",encoding="U ...

  5. python全栈开发 * 07知识点汇总 * 180607

    07  set集合,深浅拷⻉以及部分知识点补充 一.while,for 循环知识点补充 二.int, str的相关操作 1.列表变字符串 # lst=["红","橙&qu ...

  6. python全栈开发 * 24 知识点汇总 * 180705

    24 模块-------序列化一.什么是模块 模块:py文件就是一个模块.二.模块的分类:(1)内置模块 (登录模块,时间模块,sys模块,os模块)(2)扩展模块 (itchat 微信有关,爬虫,b ...

  7. python全栈开发 * 14 知识点汇总 * 180530

    14 生成器表达式 内置函数# 一.迭代器 (补充)# 1.如何判断迭代对象,迭代器# (1).dir(obj)检测对象有没有iter方法,然后it=obj.__iter__() 获取迭代器 , it ...

  8. python全栈开发 * 30知识点汇总 * 180713

    30 re模块2一.正则表达式在线测试 在线测试工具 http://tool.chinaz.com/regex/(一).*?的用法: . 是任意字符 * 是取 0 至 无限长度 ? 是非贪婪模式.合在 ...

  9. Python全栈开发记录_第一篇(循环练习及杂碎的知识点)

    Python全栈开发记录只为记录全栈开发学习过程中一些难和重要的知识点,还有问题及课后题目,以供自己和他人共同查看.(该篇代码行数大约:300行) 知识点1:优先级:not>and 短路原则:a ...

最新文章

  1. iOS之深入解析dispatch source的原理与功能
  2. (ab)使用Java 8 FunctionalInterfaces作为本地方法
  3. 卢伟冰:“四摄小金刚”的诞生是为了让更多用户享受全场景拍摄的乐趣
  4. 关于Python,虚拟环境和Visual Studio Code集成的说明
  5. matlab中取文件名函数,matlab从文件夹名中获取该文件夹下所图像文件名
  6. 给初创业者的几点建议
  7. SSRF利用协议中的万金油——Gopher
  8. [史]世界史上的6大古帝国
  9. 万亿估值来了!3次大难不死,蚂蚁金服终于登顶世界第一
  10. MindManager21简体中文永久版思维导图
  11. iphone鉴权,idps,iPhone蓝牙回控,iphone键盘,iphone手机互联,USB外设开发
  12. 贝塞尔曲线是什么?如何用 Canvas 绘制三阶贝塞尔曲线?
  13. 炼钢行业皮带无人化管理的问题及解决
  14. 计算机之父阿兰·图灵(图灵诞辰104周年)
  15. Stay Hungry, Stay Foolish — 求知若饥,虚心若愚!
  16. go二维map_go map详细使用方法
  17. c语言程序输入中能不能输入中文,如何在C语言中输入中文?
  18. matlab/simulink仿真步长设置
  19. Python语言_理論與習題
  20. 男士最佳衣着选择搭配

热门文章

  1. Docker错误合集
  2. 机器学习的几种学习方式
  3. Java学习之路-开局
  4. AI绘画天花板软件数画迎来重大更新,二次元虚拟头像一键生成
  5. C++经典算法题-循序搜寻法(使用卫兵)
  6. 计算机编辑学,计算机常识及电文档编辑学习.doc
  7. VScode 设置 背景图片
  8. 微信小程序万里目_微信小程序加盟千万别忘了几个基本要求
  9. 安装arm_qt交叉编译环境(亲测有效)
  10. 【C语言】C语言实现按照考试成绩的等级输出百分制分数段