索引
被用来快速找出一个列上用一特定值的行。所有的MySQL索引(PRIMARY、UNIQUE和INDEX)在B树中存储。字符串是自动地压缩前缀和结尾空间。作用:
KEY 'to_id' ('to_id')
为to_id建立名为to_id的普通索引,key是数据库的物理结构,包含两层意义和作用:
包括primary key,unique key,foreign key等。
3.index是数据库的物理结构,只辅助查询,不会约束字段行为,创建时会在另外的表空间(innodb表空间)。
# 增删改
insert into stu(name, classid) values('张三', '1');
update stu set classid = 2 where id between 1 and 5;
delete from stu where classid = 1;
# 查询语句
select 字段列表|* from 表名
[where 搜索条件]
[group by 分组字段 [having 分组条件]]
[order by 排序字段 排序规则] (ASC,DESC)
[limit 分页参数] (startIndex,length)
# 创建表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL DEFAULT '',
`password` varchar(50) NOT NULL DEFAULT '',
`nickname` varchar(50) NOT NULL DEFAULT '',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_name` (`name`),
KEY `nickname` (`nickname`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
TRUNCATE TABLE `user`;
子查询不一定需要两个表有关联字段,而关联查询必须有字段关联。
子查询会多次遍历所有数据(视我们的子查询层次而定),关联查询只会遍历一次
应用场景:数据量一般->两者都可,数据量大->推荐关联查询
(一)单行子查询:将两张表的查询过程简化为两个步骤,首先执行子查询SQL语句得到唯一记录,将该记录作为条件进行查询,得到结果
# 查询玲乖乖属于哪个部门
select * from department
where deptno = (select deptno from employee where empname = '玲乖乖');
(二)多行子查询:单行子查询的扩展,子查询返回多条记录数据,作为范围条件提供给外部查询执行。
# 查询职工部门1部-3部的所有职员信息
select * from employee
where deptno in (select deptno from department
where deptname in ('职工1部','职工2部','职工3部'));
(一)外键表连接:两张表之间的公共字段就是外键,通过外键查询,连接两个表的信息
# 查询游戏部门的所有员工
select * from employee as e, department as d
where e.deptno = d.deptno
and d.deptname = '游戏';
(二)连接查询:分为 内连接、左连接和右连接查询
内连接:查询两张表或者多张表公共属性在两表中的交集
左连接:保证左侧数据表全部查询的到的情况下,关联查询右侧数据表中的数据
右连接:保证右侧数据表全部查询的到的情况下,关联查询左侧数据表中的数据
左右连接的意思,就是查询出的结果表,保哪个表哪个表全部信息就展现在最左边,右边选择性留列。
# 查询每个部门下都有哪些员工(内连接)
select * from department
inner join department
on employee.deptno = department.deptno;
# 查询每个部门下的所有员工,没有员工的部门也要查询(左连接,右连接换成right join)
select * from employee
left join employee
on depertment.deptno = employee.deptno;
# 比如表1和表2,各有两个列使用左右链接
表头一: 表头二:
col—1 col-2 col2-1 col2-2
...
===>
查出来的结果表头结构就为:
左连接(保左): col-1 col-2 col2-1
右连接(保右): col2—1 col2-2 col-1
1、视图的含义:视图是一个表或者多个表的部分数据作为虚拟表,其作用是方便用户对数据进行操作,数据为源数据表,源数据表更新,视图更新;视图修改指定的,源数据表对应也更改。
2、视图的作用:
3、视图的增删改查(CRUD),需要权限
# 创建修改视图
create or replace view view_student(stu_id,stu_name,stu_class) as select id,name,class from student;
# 删除视图
drop view if exists view_student;
# 查看视图
describe view_studnent;
例1:力扣045. 买下所有产品的客户
Customer
表:±------------±--------+
| Column Name | Type|
±------------±--------+
| customer_id | int |
| product_key | int |
±------------±--------+
该表可能包含重复的行。
customer_id 不为 NULL。
product_key 是 Product 表的外键(reference 列)。
Product
表:±------------±--------+
| Column Name | Type|
±------------±--------+
| product_key | int |
±------------±--------+
product_key 是这张表的主键(具有唯一值的列)。
编写解决方案,报告
Customer
表中购买了Product
表中所有产品的客户的 id。返回结果表 无顺序要求 。
select customer_id
from Customer
where product_key in (select product_key from Product)
group by customer_id
having count(distinct product_key) = (select count(*) from Product);
例二:力扣1204. 最后一个能进入巴士的人
表:
Queue
±------------±-------------+
| Column Name | Type |
±------------±-------------+
| person_id | int |
| person_name | varchar |
| weight | int |
| turn | int |
±------------±-------------+
person_id 是这个表具有唯一值的列。
该表展示了所有候车乘客的信息。
表中 person_id 和 turn 列将包含从 1 到 n 的所有数字,其中 n 是表中的行数。
turn 决定了候车乘客上巴士的顺序,其中 turn=1 表示第一个上巴士,turn=n 表示最后一个上巴士。
weight 表示候车乘客的体重,以千克为单位。
有一队乘客在等着上巴士。然而,巴士有
1000
千克 的重量限制,所以其中一部分乘客可能无法上巴士。编写解决方案找出 最后一个 上巴士且不超过重量限制的乘客,并报告
person_name
。题目测试用例确保顺位第一的人可以上巴士且不会超重。
select person_name
from
(select person_name, weight, turn, sum(weight) over(order by turn) as totalWeiht
from Queue
order by turn
) t1
where totalWeiht <= 1000
order by totalWeiht desc
limit 1;