sql语句进阶

SQL索引

索引是用来提高查询速度的,一个表中可以不只是一个索引,一个索引中也可以是多个字段

为了提高查询效率,便于后期维护,索引都是基于某种数据结构而创建的,比如 B+ 树、B- 树、位图等。

索引过多的话会影响到插入数据,更改数据以及删除数据的效率

索引还会占用磁盘空间,增加 I/O 成本,过多的索引甚至会增加碎片。

创建索引

CREATE INDEX index_name
ON table_name ( column1, column2.....);

删除索引

ALTER TABLE table_name
DROP INDEX index_name;

JOIN

join是联合的意思,将多个表中的数据联合起来进行查询,值相同的数据合并在一起进行显示,形成一个临时表

数据库中的表可以通过键将彼此联合起来,一个典型的例子是,将一个表的主键和另一个表的外键进行匹配。在表中,每个主键的值都是唯一的,这样做的目的是在不重复每个表中所有记录的情况下,将表之间的数据交叉捆绑在一起。

SELECT table1.column1, table2.column2...
FROM table1
JOIN table2
ON table1.common_column1 = table2.common_column2;

在select后跟的字段名如果两个表中有重复的需要注明来自于哪个表

table1.column,table2.column

on和where的区别

on是在临时表生成之前,进行两个表的连接形成一张临时表
where是已经在临时表出现之后增加的筛选条件,此时已经没有了join-on的概念

sql会根据on先生成一张临时表,然后再根据where对临时表进行筛选

inner join

inner join是最常用的一种连接方式,他将会对两个表中的每一条数据进行检查,并对满足条件的字段进行记录,当我们使用join 不加任何的修饰符的时候,就默认为inner join

left join & right join

left join和right join是相对的,left join是指当左边有满足条件的数据时进行返回,而不在乎右边是否具有满足条件的记录,只是会将左边的数据记录下来,而右边的显示null
LEFT JOIN 以左表为主,即左表中的所有记录都会被返回,具体分为以下三种情况:

如果 table1 中的某条记录在 table2 中刚好只有一条记录可以匹配,那么在返回的结果中会生成一个新的行。

如果 table1 中的某条记录在 table2 中有 N 条记录可以匹配,那么在返回结果中也会生成 N 个新的行,这些行所包含的 table1 的字段值是重复的。

如果 table1 中的某条记录在 table2 中没有匹配的记录,那么在返回结果中仍然会生成一个新的行,只是该行所包含的 table2 的字段值都是 NULL。

select website.name,website2.name from website left join website2 on website2.name
= website.name;
+----------------+--------+
| name           | name   |
+----------------+--------+
| 百度           | 百度   |
| 淘宝           | NULL   |
| 京东           | 京东   |
| google         | NULL   |
| stack-overflow | NULL   |
+----------------+--------+
 select website.name,website2.name from website right join website2 on website2.name
 = website.name;
 +--------+--------+
| name   | name   |
+--------+--------+
| 京东   | 京东   |
| 百度   | 百度   |
+--------+--------+

full join

full join 是将左边的所有符合条件的数据和右边的所有符合条件的数据集合起来,相当于先进行一边left join 在使用right join,但是会出现重复的数据情况

mysql不适用这条指令 可以使用 UNION ALL 将 LEFT JOIN 和 RIGHT JOIN 组合起来,如下所示:

SQL> SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS
     LEFT JOIN ORDERS
     ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
UNION ALL
     SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS
     RIGHT JOIN ORDERS
     ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

self join

self join 是用来创建一个表来和自己进行连接,为了制造出区别,至少需要有一个有别名

select a.column,b.column2 from table as a,table as b where a.column < b.column;

我们可以发现sql中并没有self join字段 而是通过where来进行模拟的

cross join

称为交叉连接,也称为笛卡尔连接,就是将一边的每个数据和另外一边的每个数据进行连接,形成一个临时表

select website.name , website2.name from website cross join website2;
| name           | name   |
+----------------+--------+
| 百度           | 百度   |
| 百度           | 京东   |
| 淘宝           | 百度   |
| 淘宝           | 京东   |
| 京东           | 百度   |
| 京东           | 京东   |
| google         | 百度   |
| google         | 京东   |
| stack-overflow | 百度   |
| stack-overflow | 京东   |
+----------------+--------+

会形成一个左边每一个都和右边的每一个进行连接的组合,为什么会出现这种情况,是因为我们没有加任何的约束,当我们使用on或者where进行筛选的话就会得到和inner join一样的结果

select website.name,website2.name from website cross join website2 on website.name = website2.name;

当我们在实际的使用情况下时,发生10000*10000的表类数据的情况非常常见,这时候出现一亿条数据就会非常的考验性能,所以在使用cross join的时候一定要慎重

union & union all

union 用来连接两次查询的结果,并且将其中重复的数据进行剔除
union all 则不删除重复的数据,类似于 full join

select website.id,website.name,website.url,website2.id,website2.name,website2.url from website left join website2 on website.name = website2.name  unionall select website.id ,website.name,website.url,website2.id,website2.name,website2.url from website  right join website2 on website.name = website2.name;
+------+----------------+--------------------------------+------+--------+--------------------------+
| id   | name           | url                            | id   | name   | url                      |
+------+----------------+--------------------------------+------+--------+--------------------------+
|    1 | 百度           | https://www.baidu.com          |    1 | 百度   | https://www.baidu.com    |
|    2 | 淘宝           | https://www.tabao.com          | NULL | NULL   | NULL                     |
|    3 | 京东           | https://www.jingdong.com       |    2 | 京东   | https://www.jingdong.com |
|    4 | google         | https://www.goggle.com         | NULL | NULL   | NULL                     |
|    5 | stack-overflow | https://www.stack-overflow.com | NULL | NULL   | NULL                     |
+------+----------------+--------------------------------+------+--------+--------------------------+
select website.id,website.name,website.url,website2.id,website2.name,website2.url from website left join website2 on website.name = website2.name  union all select website.id ,website.name,website.url,website2.id,website2.name,website2.url from website  right join website2 on website.name = website2.name;
+------+----------------+--------------------------------+------+--------+--------------------------+
| id   | name           | url                            | id   | name   | url                      |
+------+----------------+--------------------------------+------+--------+--------------------------+
|    1 | 百度           | https://www.baidu.com          |    1 | 百度   | https://www.baidu.com    |
|    2 | 淘宝           | https://www.tabao.com          | NULL | NULL   | NULL                     |
|    3 | 京东           | https://www.jingdong.com       |    2 | 京东   | https://www.jingdong.com |
|    4 | google         | https://www.goggle.com         | NULL | NULL   | NULL                     |
|    5 | stack-overflow | https://www.stack-overflow.com | NULL | NULL   | NULL                     |
|    3 | 京东           | https://www.jingdong.com       |    2 | 京东   | https://www.jingdong.com |
|    1 | 百度           | https://www.baidu.com          |    1 | 百度   | https://www.baidu.com    |
+------+----------------+--------------------------------+------+--------+--------------------------+

sql union all 可以在mysql中代替full join使用

AS

as在sql中代表对表或者是字段表别名的基本语法如下:

SELECT column1, column2....
FROM table_name AS alias_name
WHERE [condition];
字段别名的基本语法如下:
SELECT column_name AS alias_name
FROM table_name
WHERE [condition];的重命名的意思,仅在当前语句中奏效

alter table

在前面我们也用到了很多的alter table语句了
alter table主要是对表的一些属性发生变化时会用到的
SQL ALTER TABLE 语句用来修改、添加、删除、修改与表相关的各种要素,比如:

  • 给表添加新的字段
  • 修改现有字段的名字
  • 修改现有字段的类型
  • 添加约束
  • 删除约束

使用 ALTER TABLE 为表添加一个新字段的基本语法如下:

ALTER TABLE table_name ADD column_name datatype;

使用 ALTER TABLE 删除表中某个字段的基本语法如下:

ALTER TABLE table_name DROP COLUMN column_name;

使用 ALTER TABLE 修改字段数据类型的基本语法如下:

ALTER TABLE table_name MODIFY COLUMN column_name datatype;

使用 ALTER TABLE 添加 NOT NULL 约束的基本语法如下:

ALTER TABLE table_name MODIFY column_name datatype NOT NULL;

使用 ALTER TABLE 添加 UNIQUE 约束的基本语法如下:

ALTER TABLE table_name
ADD CONSTRAINT MyUniqueConstraint UNIQUE(column1, column2…);

使用 ALTER TABLE 添加 CHECK 约束的基本语法如下:

ALTER TABLE table_name
ADD CONSTRAINT MyUniqueConstraint CHECK (CONDITION);

使用 ALTER TABLE 添加主键约束的基本语法如下:
ALTER TABLE table_name

ADD CONSTRAINT MyPrimaryKey PRIMARY KEY (column1,column2…);

使用 ALTER TABLE 删除 UNIQUE 约束的基本语法如下:

ALTER TABLE table_name
DROP CONSTRAINT MyUniqueConstraint;

如果您使用的是 MySQL,请修改为:

ALTER TABLE table_name
DROP INDEX MyUniqueConstraint;

使用 ALTER TABLE 删除主键约束的基本语法如下:

ALTER TABLE table_name
DROP CONSTRAINT MyPrimaryKey;

如果您使用的是 MySQL,请修改为:

ALTER TABLE table_name
DROP PRIMARY KEY;

TRUNCATE TABLE

truncate table 的意思是清空表中的所有数据 类似于不带有where的delete from
truncate table和 drop table的区别:

drop table是删除了整个表,而truncate table则是删除表中的所有数据,drop之后表将不再可用,约束,字段等统统都没了,而truncate则还都有

truncate table和delete from的区别

delete from是一条条删的,所以会产生过多的日志文件,并且对于自然增长的数据不能做到关闭,而truncate table则可以

  • 想要删除表使用drop table
  • 想要删除表中所有数据使用truncate table
  • 想要删除部分数据使用具有where的delete from
TRUNCATE TABLE CUSTOMERS;

view 视图

视图是由一个select查询所定义出的一个虚拟表,但是在结构上和真实表是相似的

create view uv100 as select * from website where uv<100; 

创建一个名为uv100的视图来显示website表下所有uv<100的数据

使用视图

select * from uv100;

我们也可以在uv100中进行增删改的操作,并且会影响到原来的表website,所以增加的时候,数据规范一定要符合原表website;
如果我们增加的数据不符合where规范,依然能够插入成功,但是不会在view中显示
当不需要视图的时候可以进行删除

DROP VIEW view_name;

HAVING

having子句通常与group by进行结合使用,但是group by不能配合where使用,所以having子句就是在group by中替代where而进行使用的

SELECT column1, column2
FROM table1, table2
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2

having后的筛选条件是和where可用的筛选条件是相同的

为什么需要用到having以及语句的执行顺序

  • where必须跟在from语句后进行第一次筛选
  • group by需要跟在where后进行第二次筛选
  • having是对group by筛选后得到的结果进行的下一次筛选
  • order by对所有筛选后得到的结果进行排序,位于最后
select name,sum(uv) as total from website where age = 20 group by age having total >= 2;

在website中查找age = 20 并且total大于2的age相同的数据 显示name和total

可以总结为having是对分组后的数据进行的又一次筛选

事务

sql中会有多条语句同时组合起来进行执行的语句,这样的过程就称作为一次事务

事务具有以下的特性

  • 原子性

要么全部成功,要么全部失败,当有一条语句或一个过程进行不下去的时候,将会进行回滚,将之前所有已经执行过的语句形成的效果进行撤销,即从没有发生过,和执行前一致

  • 一致性

事务中的每一条语句都必须严格遵循规范,执行之前和执行之后数据库都不能被破坏,这就意味着我们进行的每一步操作都要符合数据库的预设规则

  • 隔离性

当我们在事务结束之前,不会造成因为多并发而导致的数据不一致的情况出现
事务隔离分为以下几个状态 读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)

  • 持久性

一旦事务提交,即使发生宕机,系统故障,都不会出现数据丢失的情况

与事务控制有关的 SQL 命令包括:

  • BEGIN 或者 START TRANSACTION:开始事务;
  • COMMIT:提交事务;
  • ROLLBACK:回滚事务;
  • SAVEPOINT:在事务内部设置回滚标记点;
  • RELEASE SAVEPOINT:删除回滚标记点;
  • ROLLBACK TO:将事务回滚到标记点(ROLLBACK 命令的一种变形写法)。

一个事务要么提交(Commit),要么回滚(Rollback),提交意味着成功,回滚意味着失败。

临时表

mysql作为关系性数据库是可以建立临时表的,临时表的也可以进行增删改查操作,只不过在关闭数据库时临时表会被删除
创建临时表的语法如下

CREATE TEMPORARY TABLE table_name(
   column1 datatype,
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
   PRIMARY KEY( one or more columns )
);

删除临时表

 DROP TABLE table_name;

SQL索引

索引是用来提高查询速度的,一个表中可以不只是一个索引,一个索引中也可以是多个字段

为了提高查询效率,便于后期维护,索引都是基于某种数据结构而创建的,比如 B+ 树、B- 树、位图等。

索引过多的话会影响到插入数据,更改数据以及删除数据的效率

索引还会占用磁盘空间,增加 I/O 成本,过多的索引甚至会增加碎片。

创建索引

CREATE INDEX index_name
ON table_name ( column1, column2.....);

删除索引

ALTER TABLE table_name
DROP INDEX index_name;

JOIN

join是联合的意思,将多个表中的数据联合起来进行查询,值相同的数据合并在一起进行显示,形成一个临时表

数据库中的表可以通过键将彼此联合起来,一个典型的例子是,将一个表的主键和另一个表的外键进行匹配。在表中,每个主键的值都是唯一的,这样做的目的是在不重复每个表中所有记录的情况下,将表之间的数据交叉捆绑在一起。

SELECT table1.column1, table2.column2...
FROM table1
JOIN table2
ON table1.common_column1 = table2.common_column2;

在select后跟的字段名如果两个表中有重复的需要注明来自于哪个表

table1.column,table2.column

on和where的区别

on是在临时表生成之前,进行两个表的连接形成一张临时表
where是已经在临时表出现之后增加的筛选条件,此时已经没有了join-on的概念

sql会根据on先生成一张临时表,然后再根据where对临时表进行筛选

inner join

inner join是最常用的一种连接方式,他将会对两个表中的每一条数据进行检查,并对满足条件的字段进行记录,当我们使用join 不加任何的修饰符的时候,就默认为inner join

left join & right join

left join和right join是相对的,left join是指当左边有满足条件的数据时进行返回,而不在乎右边是否具有满足条件的记录,只是会将左边的数据记录下来,而右边的显示null
LEFT JOIN 以左表为主,即左表中的所有记录都会被返回,具体分为以下三种情况:

如果 table1 中的某条记录在 table2 中刚好只有一条记录可以匹配,那么在返回的结果中会生成一个新的行。

如果 table1 中的某条记录在 table2 中有 N 条记录可以匹配,那么在返回结果中也会生成 N 个新的行,这些行所包含的 table1 的字段值是重复的。

如果 table1 中的某条记录在 table2 中没有匹配的记录,那么在返回结果中仍然会生成一个新的行,只是该行所包含的 table2 的字段值都是 NULL。

select website.name,website2.name from website left join website2 on website2.name
= website.name;
+----------------+--------+
| name           | name   |
+----------------+--------+
| 百度           | 百度   |
| 淘宝           | NULL   |
| 京东           | 京东   |
| google         | NULL   |
| stack-overflow | NULL   |
+----------------+--------+
 select website.name,website2.name from website right join website2 on website2.name
 = website.name;
 +--------+--------+
| name   | name   |
+--------+--------+
| 京东   | 京东   |
| 百度   | 百度   |
+--------+--------+

full join

full join 是将左边的所有符合条件的数据和右边的所有符合条件的数据集合起来,相当于先进行一边left join 在使用right join,但是会出现重复的数据情况

mysql不适用这条指令 可以使用 UNION ALL 将 LEFT JOIN 和 RIGHT JOIN 组合起来,如下所示:

SQL> SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS
     LEFT JOIN ORDERS
     ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
UNION ALL
     SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS
     RIGHT JOIN ORDERS
     ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

self join

self join 是用来创建一个表来和自己进行连接,为了制造出区别,至少需要有一个有别名

select a.column,b.column2 from table as a,table as b where a.column < b.column;

我们可以发现sql中并没有self join字段 而是通过where来进行模拟的

cross join

称为交叉连接,也称为笛卡尔连接,就是将一边的每个数据和另外一边的每个数据进行连接,形成一个临时表

select website.name , website2.name from website cross join website2;
| name           | name   |
+----------------+--------+
| 百度           | 百度   |
| 百度           | 京东   |
| 淘宝           | 百度   |
| 淘宝           | 京东   |
| 京东           | 百度   |
| 京东           | 京东   |
| google         | 百度   |
| google         | 京东   |
| stack-overflow | 百度   |
| stack-overflow | 京东   |
+----------------+--------+

会形成一个左边每一个都和右边的每一个进行连接的组合,为什么会出现这种情况,是因为我们没有加任何的约束,当我们使用on或者where进行筛选的话就会得到和inner join一样的结果

select website.name,website2.name from website cross join website2 on website.name = website2.name;

当我们在实际的使用情况下时,发生10000*10000的表类数据的情况非常常见,这时候出现一亿条数据就会非常的考验性能,所以在使用cross join的时候一定要慎重

union & union all

union 用来连接两次查询的结果,并且将其中重复的数据进行剔除
union all 则不删除重复的数据,类似于 full join

select website.id,website.name,website.url,website2.id,website2.name,website2.url from website left join website2 on website.name = website2.name  unionall select website.id ,website.name,website.url,website2.id,website2.name,website2.url from website  right join website2 on website.name = website2.name;
+------+----------------+--------------------------------+------+--------+--------------------------+
| id   | name           | url                            | id   | name   | url                      |
+------+----------------+--------------------------------+------+--------+--------------------------+
|    1 | 百度           | https://www.baidu.com          |    1 | 百度   | https://www.baidu.com    |
|    2 | 淘宝           | https://www.tabao.com          | NULL | NULL   | NULL                     |
|    3 | 京东           | https://www.jingdong.com       |    2 | 京东   | https://www.jingdong.com |
|    4 | google         | https://www.goggle.com         | NULL | NULL   | NULL                     |
|    5 | stack-overflow | https://www.stack-overflow.com | NULL | NULL   | NULL                     |
+------+----------------+--------------------------------+------+--------+--------------------------+
select website.id,website.name,website.url,website2.id,website2.name,website2.url from website left join website2 on website.name = website2.name  union all select website.id ,website.name,website.url,website2.id,website2.name,website2.url from website  right join website2 on website.name = website2.name;
+------+----------------+--------------------------------+------+--------+--------------------------+
| id   | name           | url                            | id   | name   | url                      |
+------+----------------+--------------------------------+------+--------+--------------------------+
|    1 | 百度           | https://www.baidu.com          |    1 | 百度   | https://www.baidu.com    |
|    2 | 淘宝           | https://www.tabao.com          | NULL | NULL   | NULL                     |
|    3 | 京东           | https://www.jingdong.com       |    2 | 京东   | https://www.jingdong.com |
|    4 | google         | https://www.goggle.com         | NULL | NULL   | NULL                     |
|    5 | stack-overflow | https://www.stack-overflow.com | NULL | NULL   | NULL                     |
|    3 | 京东           | https://www.jingdong.com       |    2 | 京东   | https://www.jingdong.com |
|    1 | 百度           | https://www.baidu.com          |    1 | 百度   | https://www.baidu.com    |
+------+----------------+--------------------------------+------+--------+--------------------------+

sql union all 可以在mysql中代替full join使用

AS

as在sql中代表对表或者是字段表别名的基本语法如下:

SELECT column1, column2....
FROM table_name AS alias_name
WHERE [condition];
字段别名的基本语法如下:
SELECT column_name AS alias_name
FROM table_name
WHERE [condition];的重命名的意思,仅在当前语句中奏效

alter table

在前面我们也用到了很多的alter table语句了
alter table主要是对表的一些属性发生变化时会用到的
SQL ALTER TABLE 语句用来修改、添加、删除、修改与表相关的各种要素,比如:

  • 给表添加新的字段
  • 修改现有字段的名字
  • 修改现有字段的类型
  • 添加约束
  • 删除约束

使用 ALTER TABLE 为表添加一个新字段的基本语法如下:

ALTER TABLE table_name ADD column_name datatype;

使用 ALTER TABLE 删除表中某个字段的基本语法如下:

ALTER TABLE table_name DROP COLUMN column_name;

使用 ALTER TABLE 修改字段数据类型的基本语法如下:

ALTER TABLE table_name MODIFY COLUMN column_name datatype;

使用 ALTER TABLE 添加 NOT NULL 约束的基本语法如下:

ALTER TABLE table_name MODIFY column_name datatype NOT NULL;

使用 ALTER TABLE 添加 UNIQUE 约束的基本语法如下:

ALTER TABLE table_name
ADD CONSTRAINT MyUniqueConstraint UNIQUE(column1, column2…);

使用 ALTER TABLE 添加 CHECK 约束的基本语法如下:

ALTER TABLE table_name
ADD CONSTRAINT MyUniqueConstraint CHECK (CONDITION);

使用 ALTER TABLE 添加主键约束的基本语法如下:
ALTER TABLE table_name

ADD CONSTRAINT MyPrimaryKey PRIMARY KEY (column1,column2…);

使用 ALTER TABLE 删除 UNIQUE 约束的基本语法如下:

ALTER TABLE table_name
DROP CONSTRAINT MyUniqueConstraint;

如果您使用的是 MySQL,请修改为:

ALTER TABLE table_name
DROP INDEX MyUniqueConstraint;

使用 ALTER TABLE 删除主键约束的基本语法如下:

ALTER TABLE table_name
DROP CONSTRAINT MyPrimaryKey;

如果您使用的是 MySQL,请修改为:

ALTER TABLE table_name
DROP PRIMARY KEY;

TRUNCATE TABLE

truncate table 的意思是清空表中的所有数据 类似于不带有where的delete from
truncate table和 drop table的区别:

drop table是删除了整个表,而truncate table则是删除表中的所有数据,drop之后表将不再可用,约束,字段等统统都没了,而truncate则还都有

truncate table和delete from的区别

delete from是一条条删的,所以会产生过多的日志文件,并且对于自然增长的数据不能做到关闭,而truncate table则可以

  • 想要删除表使用drop table
  • 想要删除表中所有数据使用truncate table
  • 想要删除部分数据使用具有where的delete from
TRUNCATE TABLE CUSTOMERS;

view 视图

视图是由一个select查询所定义出的一个虚拟表,但是在结构上和真实表是相似的

create view uv100 as select * from website where uv<100; 

创建一个名为uv100的视图来显示website表下所有uv<100的数据

使用视图

select * from uv100;

我们也可以在uv100中进行增删改的操作,并且会影响到原来的表website,所以增加的时候,数据规范一定要符合原表website;
如果我们增加的数据不符合where规范,依然能够插入成功,但是不会在view中显示
当不需要视图的时候可以进行删除

DROP VIEW view_name;

HAVING

having子句通常与group by进行结合使用,但是group by不能配合where使用,所以having子句就是在group by中替代where而进行使用的

SELECT column1, column2
FROM table1, table2
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2

having后的筛选条件是和where可用的筛选条件是相同的

为什么需要用到having以及语句的执行顺序

  • where必须跟在from语句后进行第一次筛选
  • group by需要跟在where后进行第二次筛选
  • having是对group by筛选后得到的结果进行的下一次筛选
  • order by对所有筛选后得到的结果进行排序,位于最后
select name,sum(uv) as total from website where age = 20 group by age having total >= 2;

在website中查找age = 20 并且total大于2的age相同的数据 显示name和total

可以总结为having是对分组后的数据进行的又一次筛选

事务

sql中会有多条语句同时组合起来进行执行的语句,这样的过程就称作为一次事务

事务具有以下的特性

  • 原子性

要么全部成功,要么全部失败,当有一条语句或一个过程进行不下去的时候,将会进行回滚,将之前所有已经执行过的语句形成的效果进行撤销,即从没有发生过,和执行前一致

  • 一致性

事务中的每一条语句都必须严格遵循规范,执行之前和执行之后数据库都不能被破坏,这就意味着我们进行的每一步操作都要符合数据库的预设规则

  • 隔离性

当我们在事务结束之前,不会造成因为多并发而导致的数据不一致的情况出现
事务隔离分为以下几个状态 读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)

  • 持久性

一旦事务提交,即使发生宕机,系统故障,都不会出现数据丢失的情况

与事务控制有关的 SQL 命令包括:

  • BEGIN 或者 START TRANSACTION:开始事务;
  • COMMIT:提交事务;
  • ROLLBACK:回滚事务;
  • SAVEPOINT:在事务内部设置回滚标记点;
  • RELEASE SAVEPOINT:删除回滚标记点;
  • ROLLBACK TO:将事务回滚到标记点(ROLLBACK 命令的一种变形写法)。

一个事务要么提交(Commit),要么回滚(Rollback),提交意味着成功,回滚意味着失败。

临时表

mysql作为关系性数据库是可以建立临时表的,临时表的也可以进行增删改查操作,只不过在关闭数据库时临时表会被删除
创建临时表的语法如下

CREATE TEMPORARY TABLE table_name(
   column1 datatype,
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
   PRIMARY KEY( one or more columns )
);

删除临时表

 DROP TABLE table_name;

AUTO_INCREMENT

在一个数据库中只有一个字段可以被设置为AUTO_INCREMENT,我们一般默认为主键
AUTO_INCREMENT可以进行自动增长,不用进行手动添加,默认增长长度为1

AUTO_INCREMENT

在一个数据库中只有一个字段可以被设置为AUTO_INCREMENT,我们一般默认为主键
AUTO_INCREMENT可以进行自动增长,不用进行手动添加,默认增长长度为1

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值