Mysql核心知识命令汇总

Mysql核心知识命令汇总

1、索引key和index

  1. 索引被用来快速找出一个列上用一特定值的行。所有的MySQL索引(PRIMARY、UNIQUE和INDEX)在B树中存储。字符串是自动地压缩前缀和结尾空间。作用:

    1. 快速找出匹配一个where子句的行
    2. 执行联结时,从其他表检索行
    3. 特定的索引列找出MAX()MIN()值
    4. 如果排序或分组在一个可用键的最左面前缀上进行(例如,ORDER BY key_part_1,key_part_2),排序或分组一个表。
    5. 如果所有键值部分跟随DESC,键以倒序被读取。
    6. 在一些情况中,一个查询能被优化来检索值,不用咨询数据文件。
    7. 如果对某些表的所有使用的列是数字型的并且构成某些键的最左面前缀,为了更快,值可以从索引树被检索出来。
  2. KEY 'to_id' ('to_id') 为to_id建立名为to_id的普通索引,key是数据库的物理结构,包含两层意义和作用:

    1. 一是约束(偏重于约束和规范数据库的结构完整性)
    2. 二是索引(辅助查询用的)

包括primary key,unique key,foreign key等。

  1. Primary key有两个作用:一个是约束作用(规范一个存储主键和唯一性),同时建立主键索引
  2. Unique key两个作用:一是约束(规范数据的唯一性),建立索引
  3. Foreign key两个作用:意识约束作用(规范数据引用完整性),建立一个index

3.index是数据库的物理结构,只辅助查询,不会约束字段行为,创建时会在另外的表空间(innodb表空间)。

2、mysql的CRUD,创建表

# 增删改
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 排序字段 排序规则]ASCDESC[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`;

3、子查询和关联查询

子查询不一定需要两个表有关联字段,而关联查询必须有字段关联

子查询会多次遍历所有数据(视我们的子查询层次而定),关联查询只会遍历一次

应用场景:数据量一般->两者都可,数据量大->推荐关联查询

3.1、子查询

(一)单行子查询:将两张表的查询过程简化为两个步骤,首先执行子查询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部'));

3.2、关联查询

(一)外键表连接:两张表之间的公共字段就是外键,通过外键查询,连接两个表的信息

# 查询游戏部门的所有员工
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

4、视图

1、视图的含义:视图是一个表或者多个表的部分数据作为虚拟表,其作用是方便用户对数据进行操作,数据为源数据表,源数据表更新,视图更新;视图修改指定的,源数据表对应也更改

2、视图的作用:

  1. 使操作简单化
  2. 增加数据的安全性(用户只能查询和修改指定的数据)
  3. 提高表的独立逻辑性(原数据表进行增删未被引用的,对视图没有影响)

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;

5、例题

例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;

你可能感兴趣的:(数据库,mysql,数据库)