Mysql的索引、视图、触发器、存储过程
文章目录
- 一、Mysql的索引
- (1)什么是索引
- (2)索引的作用
- (3)索引原理
- (4)磁盘IO与预读
- (5)索引的数据结构—B+树
- (6)索引分类
- (7)索引的两大类型
- (8)创建、删除索引
- -创建索引
- -查看所有索引
- -删除索引
- (9)测试索引
- 二、视图
- (1)视图概述
- (2)视图的使用
- 三、触发器
- (1)触发器概述
- (2)触发器的使用
- 四、存储过程
- (1)存储过程概述
- (2)存储过程的使用
- -创建不带参数的存储过程
- -创建带参数的存储过程
- -删除存储过程
- -查看存储过程
一、Mysql的索引
(1)什么是索引
一般的应用系统中,读写比例一般在10:1,读是比写要多得多的,而且插入操作和一般的更新操作很少出现性能问题。
在实际环境中,工作人员遇到最多的,也是最容易出现问题的还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重,而索引的出现就是加快查询速度
(2)索引的作用
索引可以加快客户端的查询数据的速度
索引在Mysql中也叫做”键“,是存储引擎用于快速找到记录的一种数据结构
当表中的数据量越来越大时,索引对于性能的影响越来越重要,并且索引优化是对查询性能优化最有效的手段,可以轻而易举的将查询性能提升好几个度
可以把索引看作是字典中的音序表,想要查某个字时,如果不使用音序表,就需要把几百页的字典诶个翻一遍,而有了音序表就可以快速进行定位,从而找到指定的字
(3)索引原理
- 索引的目的就是提高查询效率,跟使用字典查询某个字一样,都是先看音序表或者偏旁表,然后定位到指定的章节,然后在较少的页数中寻找指定的字即可,不需要从几百页中诶个寻找
- 索引就是通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说有了这种索引机制,我们可以总是可以使用同一种查找方式来锁定数据
(4)磁盘IO与预读
考虑到磁盘IO是非常高昂的操作,计算机操作系统做了一些优化,当一次IO时,会把当前磁盘地址的数据和相邻的数据也都读取到内存缓冲区内,因为局部预读性原理告诉我们,当计算机访问一个地址的数据的时候,与其相邻的数据也会很快被访问到
每一次IO读取的数据称之为一页(page),具体一页有多大数据和操作系统有关,一般为4K或8K,也就是我们读取一页内的数据的时候,实际上才发生的一次IO读取,这个理论对于索引的数据结构设计非常有帮助
(5)索引的数据结构—B+树
任何一种数据结构都不是凭空产生的,每一种数据结构都会有他的背景和使用场景,而数据结构的作用就是每次查找数据的时候把磁盘IO读取的次数控制到一个很小的数量,最好是常数数量,那么如果一个高度可控的多路搜索树是否能满足要求呢,B+树就这样诞生了
- -B+树的查找过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M9uTWalF-1627535224280)(F:\个人文档\markdown图片\image-20210518170754085.png)]
可以看到当用户查找数据时,索引会由大到小缩小范围,最后成功找到数据
- -B+树的性质
- 索引字段要尽量的小
- 索引的最左匹配特性(从左往右匹配)
(6)索引分类
索引总共分为5类:
- 普通索引 index:加速查找
- 唯一索引:
主键索引:primary key,加速查找+约束,不为空并且数据有唯一性
唯一索引:unique,加速查找+约束,唯一性
- 联合索引:
primary key(id,name):联合主键索引
unique(id,name):联合唯一索引
index(id,name):联合普通索引
- 全文索引fulltext:用于搜索很长的一篇文章时使用,效果最好
- 空间索引spatial:不常用
(7)索引的两大类型
在创建上面的索引时,为其指定索引类型,主要分为两类:
hash类型的索引: 查询单条快,范围查询慢
b+树类型的索引: 层数越多,数据量指数级增长,innoDB默认支持b+树
不同的存储引擎支持的索引类型是不一样的
存储引擎 | 支持的索引类型 |
---|---|
InnoDB | 支持事务,支持行级别锁定,支持B+树、Full-text等索引,不支持hash索引 |
MyISAM | 不支持事务,支持表级别锁定,支持B+树、Full-text等索引,不支持hash索引 |
Memory | 不支持事务,支持表级别锁定,支持B+树、hash等索引,不支持Full-text索引 |
NDB | 支持事务,支持行级别锁定,支持hash索引,不支持B+树、Full-text等索引 |
Archive | 不支持事务,支持标记别锁定,不支持B+树、hash、Full-text等索引 |
(8)创建、删除索引
-创建索引
- 方法一: 创建表时创建索引
[root@rzy ~]# mysql -u root -p123123 #进入数据库
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.12 Source distributionCopyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (58.38 sec)mysql> create database aaa; #创建aaa库
Query OK, 1 row affected (0.00 sec) mysql> use aaa; #进入(选中)aaa库
Database changedmysql> create table aaa(id int primary key,name char(10),age int); #id为主键索引,写到项里
Query OK, 0 rows affected (0.14 sec)mysql> create table bbb(id int ,name char(10),age int,index(id)); #id为普通索引,写到最后
Query OK, 0 rows affected (0.10 sec)
- 方法二: 在已经创建的表上创建索引
mysql> show tables; #查看所有的表
+---------------+
| Tables_in_aaa |
+---------------+
| aaa |
| bbb |
+---------------+
2 rows in set (0.00 sec)mysql> drop table aaa; #删除两个表
Query OK, 0 rows affected (0.00 sec)mysql> drop table bbb;
Query OK, 0 rows affected (0.00 sec)mysql> create table aaa(id int,name char(10),age int); #创建一个新的表,这次不指定索引
Query OK, 0 rows affected (0.01 sec)mysql> create index a1 on aaa(id); #创建普通索引,索引名称为a1,为aaa表的id项创建索引
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> create index a2 on aaa(id,name); #创建index普通联合索引,索引的是aaa表的id项和name项,索引名称是a2
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 方法三: 使用alter在已经存在的表上创建索引
mysql> alter table aaa add unique index(age); #创建unique唯一索引,索引的是aaa表的age项
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> alter table aaa add primary key(name); #创建primary主键索引,索引的是aaa表的name项
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
-查看所有索引
mysql> show index from aaa\G; #查看aaa表的所有索引
*************************** 1. row ***************************Table: aaa #索引的表Non_unique: 0Key_name: PRIMARY #索引名称Seq_in_index: 1Column_name: name #索引的项Collation: ACardinality: 0Sub_part: NULLPacked: NULLNull: Index_type: BTREEComment:
Index_comment:
*************************** 2. row ***************************Table: aaaNon_unique: 0Key_name: ageSeq_in_index: 1Column_name: ageCollation: ACardinality: 0Sub_part: NULLPacked: NULLNull: YESIndex_type: BTREEComment:
Index_comment:
*************************** 3. row ***************************Table: aaaNon_unique: 1Key_name: a1Seq_in_index: 1Column_name: idCollation: ACardinality: 0Sub_part: NULLPacked: NULLNull: YESIndex_type: BTREEComment:
Index_comment:
*************************** 4. row ***************************Table: aaaNon_unique: 1Key_name: a2Seq_in_index: 1Column_name: idCollation: ACardinality: 0Sub_part: NULLPacked: NULLNull: YESIndex_type: BTREEComment:
Index_comment:
*************************** 5. row ***************************Table: aaaNon_unique: 1Key_name: a2Seq_in_index: 2Column_name: nameCollation: ACardinality: 0Sub_part: NULLPacked: NULLNull: Index_type: BTREEComment:
Index_comment:
5 rows in set (0.00 sec)ERROR:
No query specified
-删除索引
mysql> drop index a1 on aaa; #删除aaa表的索引a1,a1是索引名称
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> drop index a2 on aaa; #删除aaa表的索引a2
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> drop index age on aaa; #删除aaa表的索引age
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> show index from aaa\G;
*************************** 1. row ***************************Table: aaaNon_unique: 0Key_name: PRIMARYSeq_in_index: 1Column_name: nameCollation: ACardinality: 0Sub_part: NULLPacked: NULLNull: Index_type: BTREEComment:
Index_comment:
1 row in set (0.00 sec)ERROR:
No query specifiedmysql> alter table aaa drop primary key; #删除主键索引
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> show index from aaa\G; #再次查看发现没有索引了
Empty set (0.00 sec)ERROR:
No query specified
(9)测试索引
******(1)准备表
mysql> drop table aaa; #删除刚才的表
Query OK, 0 rows affected (0.00 sec)mysql> create table aaa(id int,name char(10),age int); #创建一个新表
Query OK, 0 rows affected (0.00 sec)mysql> show tables ; #查看所有表
+---------------+
| Tables_in_aaa |
+---------------+
| aaa |
+---------------+
1 row in set (0.00 sec)******(2)插入数据
mysql> delimiter $$ #定义结束符号为$$,不定义的话,下面定义存储过程是无法写;的
mysql> create procedure a1() #定义存储过程,有点像python的函数-> BEGIN-> declare i int default 1; #相当于i=1-> while(i<3000000)do #使用while循环 -> insert into aaa values(i,concat('egon',i),i); #利用循环插入数据-> set i=i+1; -> END while;-> END$$
Query OK, 0 rows affected (0.19 sec)mysql> delimiter ; #把结束符变回;
mysql> show create procedure a1\G; #查看存储过程
*************************** 1. row ***************************Procedure: a1sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTIONCreate Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `a1`()
BEGIN
declare i int default 1;
while(i<3000000)do
insert into aaa values(i,concat('egon',i),i);
set i=i+1;
END while;
END
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: utf8_general_ci
1 row in set (0.00 sec)ERROR:
No query specifiedmysql> call a1(); #调用存储过程mysql> select * from aaa;
。。。。。。mysql> select * from aaa where id = 123456; #查询指定的id为123456的。可以看到花费了0.27秒
+--------+------------+--------+
| id | name | age |
+--------+------------+--------+
| 123456 | egon123456 | 123456 |
+--------+------------+--------+
2 rows in set (0.27 sec)******(3)加上索引进行查询,查询id,就给id加上索引
mysql> create index aaa on aaa(id); #给aaa表的id项加上普通索引,名称为aaa
Query OK, 0 rows affected (1.08 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> select * from aaa where id = 123456; #再次查看,可以看到花费0.00秒,加快了查询速度
+--------+------------+--------+
| id | name | age |
+--------+------------+--------+
| 123456 | egon123456 | 123456 |
| 123456 | i | 123456 |
+--------+------------+--------+
2 rows in set (0.00 sec)
二、视图
(1)视图概述
视图是一个虚拟表,内容由查询定义,和真实的表一样,视图包含一系列带有名称的列和行数据
视图的作用就是缓存数据,当用户把一个SQL语句的查询结构保存到视图里后,下次查询只需要访问视图就可以,无需再次使用SQL语句进行筛选,并且修改视图会修改原表的数据
视图的特点:
- 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新表
- 视图是由基本表(真表)产生的表(虚表)
- 视图的建立和删除不影响原表
- 对视图内容的修改、删除、插入会对原表产生直接影响,会直接修改原表
- 当视图的数据是来自多个表时,是不允许修改视图的数据的
(2)视图的使用
先创建表,并且插入数据
mysql> drop table aaa;
Query OK, 0 rows affected (0.01 sec)mysql> create table aaa(id int,name char(10),age int);
Query OK, 0 rows affected (0.00 sec)mysql> insert into aaa values(1,"zhangsan",18);
Query OK, 1 row affected (0.00 sec)mysql> insert into aaa values(2,"wangwu",19);
Query OK, 1 row affected (0.00 sec)mysql> insert into aaa values(3,"hehe",17);
Query OK, 1 row affected (0.00 sec)mysql> select * from aaa;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 18 |
| 2 | wangwu | 19 |
| 3 | hehe | 17 |
+------+----------+------+
3 rows in
创建视图
mysql> create view a1 as select id,name from aaa; #创建视图,as后面跟select查询语句
Query OK, 0 rows affected (0.00 sec)mysql> show tables; #发现多了一个表,名称就是刚才视图的名称
+---------------+
| Tables_in_aaa |
+---------------+
| a1 |
| aaa |
+---------------+
2 rows in set (0.00 sec)mysql> select * from a1; #查看这个表,发现就是上面查询语句执行后的数据
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | wangwu |
| 3 | hehe |
+------+----------+
3 rows in set (0.00 sec)
更新视图
mysql> update a1 set id=1 ; #把a1表的id项的数据全部变成1
Query OK, 2 rows affected (0.00 sec)
Rows matched: 3 Changed: 2 Warnings: 0mysql> select * from a1; #查看两个表,发现数据都进行了修改
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 1 | wangwu |
| 1 | hehe |
+------+----------+
3 rows in set (0.00 sec)mysql> select * from aaa;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 18 |
| 1 | wangwu | 19 |
| 1 | hehe | 17 |
+------+----------+------+
3 rows in set (0.00 sec)
删除视图
mysql> drop view a1; #删除视图
Query OK, 0 rows affected (0.00 sec)mysql> show tables; #查看所有表,发现只剩下了原表
+---------------+
| Tables_in_aaa |
+---------------+
| aaa |
+---------------+
1 row in set (0.00 sec)
三、触发器
(1)触发器概述
触发器就是当指定的表发生了某个操作,那么就会自动执行预先编写好的SQL语句,有点像是条件
触发器一般用于监视某种情况,并触发某个操作,保证数据的完整性,起到约束的作用
触发器创建语法的四要素:
- 监视地点(table表)
- 监视事件(insert、update、delete)
- 触发事件(after、before)
- 触发事件(insert、update、delete)
注意!!!:触发器只能在两个表之间进行触发,也就是说,a表设置触发条件,b表设置触发操作
(2)触发器的使用
创建触发器
after为后置触发,及命令执行完后触发,before表示前置触发,及命令执行前触发
触发器的条件可以为delete、insert、update
for each row后面如果想写条触发语句那就写一个即可,写多条触发语句可以配合begin、end来执行,要记得修改结束符
mysql> create trigger a1 after delete on aaa for each row #设置触发器,当删除aaa表中的数据时,对bbb表进行操作-> insert into bbb values(1,"aaa",55);
Query OK, 0 rows affected (0.00 sec)mysql> show tables; #查看所有表,发现没有bbb表
+---------------+
| Tables_in_aaa |
+---------------+
| aaa |
+---------------+
1 row in set (0.00 sec)mysql> create table bbb(id int,name char (10),age int); #创建bbb表
Query OK, 0 rows affected (0.15 sec)mysql> delete from aaa where name="hehe"; #执行刚刚创建的触发器的条件,也就是删除aaa表的数据
Query OK, 1 row affected (0.00 sec)mysql> select * from bbb; #这个时候查看bbb表,发现刚刚创建的bbb表有了新的数据,而这个数据就是触发语句插入的
+------+------+------+
| id | name | age |
+------+------+------+
| 1 | aaa | 55 |
+------+------+------+
1 row in set (0.00 sec)mysql> show triggers\G; #查看所有的触发器
*************************** 1. row ***************************Trigger: a1Event: DELETETable: aaaStatement: insert into bbb values(1,"aaa",55)Timing: AFTERCreated: 2021-05-19 00:01:14.18sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTIONDefiner: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: utf8_general_ci
1 row in set (0.00 sec)ERROR:
No query specifiedmysql> drop trigger a1; #删除触发器,指定触发器的名称
Query OK, 0 rows affected (0.00 sec)mysql> show triggers\G; #再次查看,发现没有触发器了
Empty set (0.00 sec)ERROR:
No query specified
四、存储过程
(1)存储过程概述
在进行mysql操作时,需要一条一条的输入SQL语句,而存储过程就像是写脚本一样,把多条SQL语句组成一个整体,一次性执行多条SQL语句,并且存储过程还可以写条件语句、循环语句等,可以多次执行
优点:
- 存储过程增强了SQL语言的灵活性,配合控制语句编写,可以完成复杂的判断和较复杂的运算
- 减少网络流量,降低了网络负载,存储过程在创建成功后,想要执行的时候只需要调用存储过程即可,而传统的做法是使用SQL语句一个一个敲,通过网络发送给数据库服务然后再执行,这样耗费了网络资源
- 存储过程只是在编写时进行编译,以后每次执行存储过程都不需要编译,一般SQL语句每执行一次就编译一次,而存储过程只需要一次编译就可以多次使用
- 缺点:
- 扩展功能不方便
- 不便于系统后期维护
(2)存储过程的使用
-创建不带参数的存储过程
mysql> delimiter $$ #先修改结束符
mysql> create procedure a1() #创建存储过程-> BEGIN-> select * from aaa;-> END $$
Query OK, 0 rows affected (0.00 sec)mysql> delimiter ; #修改成;
mysql> call a1(); #执行存储过程
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 18 |
| 1 | wangwu | 19 |
+------+----------+------+
2 rows in set (0.00 sec)Query OK, 0 rows affected (0.00 sec)
-创建带参数的存储过程
mysql> delimiter $$ #修改结束符
mysql> create procedure a2(in i char(20)) #创建带参数的存储过程,a2(in i char(20))这个有点像是read -p交互式赋予变量,当执行这个存储过程时,可以输入指定的参数,char(20)就是输入参数的类型,i就像变量名一样,输入的参数就是变量值-> BEGIN-> select * from aaa where id=i; #写执行语句时可以结合上面的参数达到指定的效果-> END $$
Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;
mysql> call a2(1); #执行a2参数,参数取值为1
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 18 |
| 1 | wangwu | 19 |
+------+----------+------+
2 rows in set (0.00 sec)Query OK, 0 rows affected (0.00 sec)mysql> show procedure status like "%a1"\G; #查看指定的存储过程
*************************** 1. row ***************************Db: aaaName: a1Type: PROCEDUREDefiner: root@localhostModified: 2021-05-19 00:20:58Created: 2021-05-19 00:20:58Security_type: DEFINERComment:
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: utf8_general_ci
1 row in set (0.00 sec)ERROR:
No query specified
-删除存储过程
mysql> drop procedure a1; #删除指定存储过程
Query OK, 0 rows affected (0.00 sec)
-查看存储过程
mysql> show procedure status\G; #查看所有的存储过程,这样看特别乱,但是可以看到所有的存储过程
。。。。。。mysql> show procedure status like "%a2"\G; #查看指定的存储过程
*************************** 1. row ***************************Db: aaaName: a2Type: PROCEDUREDefiner: root@localhostModified: 2021-05-19 00:45:16Created: 2021-05-19 00:45:16Security_type: DEFINERComment:
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: utf8_general_ci
1 row in set (0.00 sec)ERROR:
No query specified
除指定存储过程
Query OK, 0 rows affected (0.00 sec)
### -查看存储过程```shell
mysql> show procedure status\G; #查看所有的存储过程,这样看特别乱,但是可以看到所有的存储过程
。。。。。。mysql> show procedure status like "%a2"\G; #查看指定的存储过程
*************************** 1. row ***************************Db: aaaName: a2Type: PROCEDUREDefiner: root@localhostModified: 2021-05-19 00:45:16Created: 2021-05-19 00:45:16Security_type: DEFINERComment:
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: utf8_general_ci
1 row in set (0.00 sec)ERROR:
No query specified
Mysql的索引、视图、触发器、存储过程相关推荐
- day29 | 黑马程序员Java全程笔记 | 第二阶段MySQL高级事务-索引-视图-触发器-存储过程
目录 01.反馈 02.回顾 03.并发访问MySQL-问题概述 并发访问的问题 04.并发访问MySQL-问题演示 05.并发访问MySQL-read-committed解决脏读问题 06.并发访问 ...
- MySQL函数、视图、存储过程及触发器
前言 MySQL在我们工作中都会用到,那么我们最常接触的就是增删改查,而对于增删改查来说,我们更多的是查询.但是面试中,面试官又不会问你什么查询是怎么写的,都是问一些索引啊,事务啊, 底层结构这些东西 ...
- MySQL视图触发器存储过程内外链接数据锁
MySQL视图触发器存储过程内外链接数据锁 视图 什么是视图 是一个虚拟表,其内容由查询定义.同真实的一样,视图包含一系列带有名称的列和行数据 视图有什么用 视图的作用就是缓存数据,可以这么理解,我把 ...
- mysql视图执行原理_MySql中的视图 触发器 存储过程,以及事物
视图: 一个临时表被反复使用的时候,对这个临时表起一个别名,方便以后使用,就可以创建一个视图,别名就是视图的名称.视图只是一个虚拟的表,其中的数据是动态的从物理表中读出来的,所以物理表的变更回改变视图 ...
- mysql 视图触发器,MySql视图触发器存储过程详解
一个临时表被反复使用的时候,对这个临时表起一个别名,方便以后使用,就可以创建一个视图,别名就是视图的名称.视图只是一个虚拟的表,其中的数据是动态的从物理表中读出来的,所以物理表的变更回改变视图. 创建 ...
- 数据库视图 触发器 存储过程
数据库视图 1.什么是数据库视图 视图是是一个虚拟表,它的内容都来自基本表,它依据基本表存在而存在.一个视图可以对应一个基本表,也可以对应多个基本表也可以对应其他视图.视图是基本表的抽象和在逻辑意义上 ...
- mysql构架,索引,视图,查询语句
mysql构架: connection pool:因为单进程多线程,所以需要一个线程池接收请求提供并发,线程重用,还能完成认证 SQL interface:接收并分析SQL语句 Parser:分析器, ...
- mysql-基础-视图,存储过程,触发器
面试题 面试你所要知道的:MySQL存储过程 https://blog.csdn.net/u012190514/article/details/80282161 课程内容 视图 存储过程 触发器 数据 ...
- 表、视图、存储过程、函数、触发器、事件
表:里面存储的都是真实的数据 视图:就是一个表或者多个表的一个映射,一般只做查询使用.比如你想要的数据存在两个表里,但你查询时不想每次都写关联,那么你创建一个视图,以后只查询这个视图就可以(查询时视图 ...
- mysql 范围索引 els_MySQL 复习笔记
本文内容 SQL 语句 创建数据库 创建数据表 数据完整性约束 四种基本字符类型说明 SQL 基本语句 类型转换函数 日期函数 数学函数 字符串函数 合并结果集 union CASE 函数用法 IF ...
最新文章
- html5 XMLHttpRequest 图片异步上传
- 开发者论坛一周精粹(第六十八期) 如何把ecs转到另外一个账号?
- 垂直居中重要方法理解---重点是方法三
- 我终于搞清楚了和String有关的那点事儿
- shell编程之 cut命令详解
- Python 读取文本文件编码错误解决方案(未知文本文件编码情况下解决方案)
- 使用crontab不能正常执行的问题
- 软件测试---如何选择合适的正交表
- 支持断电保护的FAT文件系统
- c# Process监控进程 与 ManagementEventWatcher 监控进程
- PHP怎样大幅度降低图片大小但最大程度保持图片清晰?
- 斯坦福大学的低码率音频编码博士论文
- r语言写九九乘法表并保存为txt文件
- matlab等式操作,matlab处理一个等式方程,急用,谢谢
- 数据库第十次作业-视图【带源码】
- JS: 刷新iframe的方法
- 雅虎高管解读财报 将在今年完成阿里资产剥离
- js控制蓝牙笔翻页功能(键盘事件)
- 小小滑块可笑可笑-安卓滑块验证码通杀方案研究(2)
- oracle表空间取消只读,18_Oracle_Admin_只读表空间和离线表空间
热门文章
- c++语言中string类型,c++string类型占几个字节
- 向数据库中批量插入数据的sql 语句
- 嵌入式计算机课程设计,嵌入式系统设计课设报告.doc
- GMT绘图geotiff转grd
- 【Bio】基础生物学 - 基因 gene
- docker-compose(二):SpringBoot + Docker Compose
- SLAM前端知识汇总
- Windows Server 2008 R2使用WDS服务实现批量安装操作系统演示
- 无FTTR不千兆,华为星光F30让家中不再有“隐秘的角落”
- python中怎么创建配置文件,python怎么读取配置文件