MySQL快查
因为在日常工作学习中经常忘记mysql的一些语句、关键字、操作等内容,所以最近抽取时间写了以下关于mysql相关内容。相当于一本字典吧
重置mysql密码
数据类型
运算符
常用函数
数据完整性
数据库的基本操作
对表本身的操作
对表中数据的操作
子查询
多表连接
索引
本文
预处理SQL语句
自定义函数与存储过程
在MySQL中编程
简介
视图(view)是从一个、多个表或者其他视图中通过select语句导出的虚拟表,视图中不存放数据,从视图中获取的数据都是从它引用的表中来的。
示例使用的表
mysql> create table people(id int primary key auto_increment,
name char(10) not null,
age int not null,sex enum('f','m'),sar float);
Query OK, 0 rows affected (0.02 sec)
mysql> desc people;
+-------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | char(10) | NO | | NULL | |
| age | int | NO | | NULL | |
| sex | enum('f','m') | YES | | NULL | |
| sar | float | YES | | NULL | |
+-------+---------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)
使用的表中的数据
mysql> insert into people(name,age,sex,sar) values('铁子',23,'m',20000);
Query OK, 1 row affected (0.01 sec)
mysql> insert into people(name,age,sex,sar) values('潘子',18,'m',5000.4);
Query OK, 1 row affected (0.01 sec)
mysql> insert into people(name,age,sex,sar) values('嘎子',18,'m',5400.4);
Query OK, 1 row affected (0.01 sec)
mysql> insert into people(name,age,sex,sar) values('嘎叔',60,'m',15400.4);
Query OK, 1 row affected (0.01 sec)
mysql> insert into people(name,age,sex,sar) values('潘叔',60,'m',15450.8);
Query OK, 1 row affected (0.01 sec)
mysql> insert into people(name,age,sex,sar) values('老同志',69,'m',15450.8);
Query OK, 1 row affected (0.01 sec)
mysql> select * from people;
+----+-----------+-----+------+---------+
| id | name | age | sex | sar |
+----+-----------+-----+------+---------+
| 1 | 铁子 | 23 | m | 20000 |
| 2 | 潘子 | 18 | m | 5000.4 |
| 3 | 嘎子 | 18 | m | 5400.4 |
| 4 | 嘎叔 | 60 | m | 15400.4 |
| 5 | 潘叔 | 60 | m | 15450.8 |
| 6 | 老同志 | 69 | m | 15450.8 |
+----+-----------+-----+------+---------+
6 rows in set (0.00 sec)
创建视图
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = 用户]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW 视图名 [(视图字段名,...)]
AS 查询语句
[WITH [CASCADED | LOCAL] CHECK OPTION]
- create view:创建视图,加上or replace可以替换已有的视图
- algorithm:视图算法:
- undefined:MySQL将自动选择算法
- merge:合并视图定义和视图语句,使得视图定义的某一部分取代语句的对应部分
- temptable:将视图结果存储到临时表,然后利用临时表执行语句
- definer:定义者,指明创建视图的用户,不写默认是当前用户
- sql security:指明谁有权限来执行:
- definer: 用定义者拥有的权限来执行,默认值
- invoker:用调用者的权限来执行
- with check option:用来限制对视图所引用的表中的行的插入或更新。如对在select语句中使用其他来源的列,必须有select语句权限,存在or replace时还需要有drop权限
- cascaded:默认值,表示更新视图时要满足所有相关视图和表的条件
- local:表示更新视图时满足视图本身的定义即可
# 创建一个视图将表people中年龄大于等于60的人
mysql> create or replace view v_old_people (姓名,年龄,性别)
as select name,age,sex from people where age >= 60;
Query OK, 0 rows affected (0.00 sec)
删除视图
DROP VIEW [IF EXISTS]
视图名 [, 视图名] ...
# 删除视图v_old_people
mysql> drop view v_old_people;
Query OK, 0 rows affected (0.01 sec)
修改视图
ALTER
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = user]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
解释同创建视图
更多
查看视图
查看定义
SHOW CREATE VIEW 视图名;
show table status like '视图名';
mysql> SHOW CREATE VIEW v_old_people;
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View | Create View | character_set_client | collation_connection |
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| v_old_people | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v_old_people` (`姓名`,`年龄`,`性别`) AS select `people`.`name` AS `name`,`people`.`age` AS `age`,`people`.`sex` AS `sex` from `people` where (`people`.`age` >= 60) | utf8mb4 | utf8mb4_0900_ai_ci |
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set (0.00 sec)
mysql> show table status like 'v_old_people';
+--------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+--------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| v_old_people | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 2021-05-27 14:45:52 | NULL | NULL | NULL | NULL | NULL | VIEW |
+--------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
1 row in set (0.00 sec)
查看数据
select 字段名[,...] from 视图名;
mysql> select * from v_old_people;
+-----------+--------+--------+
| 姓名 | 年龄 | 性别 |
+-----------+--------+--------+
| 嘎叔 | 60 | m |
| 潘叔 | 60 | m |
| 老同志 | 69 | m |
+-----------+--------+--------+
3 rows in set (0.00 sec)