其他分享
首页 > 其他分享> > 11.1 总结

11.1 总结

作者:互联网

上节课回顾:

索引:

索引的作用:提高查询效率,好比字典中的目录。

底层原理:B+树,索引本质上就是一个特殊文件。

索引的分类:

主键索引:加快查询速度+不能重复+不能为空

```python

增加:

第一种方法:
create table 表名(
id int auto_increment primary key #主键自增id
)
注意:auto_increment 依赖primary key,而primary key不依赖auto_increment
第二种方法:
alter table 表名 change 旧字段名 新字段名 数据类型 自增 主键;
第三种方法:
alter table 表名 add 主键(字段名)
场景:一般是加在id这列

删除:

如果要删除带有auto_increment的primary key 需要提前删除auto_increment。
alter table 表名 drop 主键;

```

```

​ 唯一索引:加快查询速度+不能重复

##增加:
第一种方法:
create table 表名(
   id int auto_increment primary key, #主键自增id
   phone int not null default 0,
   name varchar(32)
   unique 索引名(phone字段名)
)
第二种方法:
alter table 表名 add unique index 索引名(phone字段名);
第三种方法:
create unique index 索引名 on 表名 (phone字段名);
场景:应用在需要唯一值的时候
##删除:
alter table 表名 drop index 索引名;

联合唯一索引,使用方法同上。

create table user (
        id int auto_increment primary key,
        a int not null default 0,
        b int not null default 0,
        unique ix_ab (a,b)
        )charset utf8;

        insert into user (a,b) values (1,2);
        insert into user (a,b) values (1,3);
        insert into user (a,b) values (3,2);

        mysql> insert into user (a,b) values (1,2);
        ERROR 1062 (23000): Duplicate entry '1-2' for key 'ix_ab'

        mysql> insert into user (a,b) values (1,3);
        Query OK, 1 row affected (0.05 sec)

普通索引作用:加速查找

增加:
第一种方法:
create table 表名(
      id int auto_increment primary key,
      name varchar(32) not null default '',
      index 索引名(name)
)
第二种方法:
alter table 表名 add index 索引名(name);
第三种方法:
create index 索引名 on 表名(字段名);
删除:
alter table 表名 drop index 索引名;
联合(组合)索引
index(name,age)

今日内容:

1.事务:通俗的说,事务指一组操作,要么都执行成功,要么都执行失败

思考:
            我去银行给朋友汇款,
            我卡上有1000元,
            朋友卡上1000元,
            我给朋友转账100元(无手续费),
            如果,我的钱刚扣,而朋友的钱又没加时,
            网线断了,怎么办?
            
演示:开两个cmd,用同一个数据里的同一个表
#第一个cmd:
mysql> create table uu(
    -> id int auto_increment primary key,
    -> name varchar(32) not null default '',
    -> salary int not null default 0
    -> )charset utf8;
Query OK, 0 rows affected (0.03 sec)

mysql> insert into uu (name,salary) values('jshsdh',1000);
Query OK, 1 row affected (0.01 sec)

mysql> insert into uu (name,salary) values('uwgdg',1000);
Query OK, 1 row affected (0.00 sec)
解决方法:
使用事务:
start transaction;
sql语句
例子:
commit/rollback;
commit成功:
mysql> update uu set salary=900 where name='jshsdh';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from uu;
+----+--------+--------+
| id | name   | salary |
+----+--------+--------+
|  1 | jshsdh |    900 |
|  2 | uwgdg  |   1000 |
+----+--------+--------+
2 rows in set (0.00 sec)

mysql> update uu set salary=1100 where name='uwgdg';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from uu;
+----+--------+--------+
| id | name   | salary |
+----+--------+--------+
|  1 | jshsdh |    900 |
|  2 | uwgdg  |   1100 |
+----+--------+--------+
2 rows in set (0.00 sec)
#第二个cmd:
mysql> select * from uu;
+----+--------+--------+
| id | name   | salary |
+----+--------+--------+
|  1 | jshsdh |   1000 |
|  2 | uwgdg  |   1000 |
+----+--------+--------+
2 rows in set (0.00 sec)
一查询结果没变
#第一个cmd:
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
#第二个cmd:
mysql> select * from uu;
+----+--------+--------+
| id | name   | salary |
+----+--------+--------+
|  1 | jshsdh |    900 |
|  2 | uwgdg  |   1100 |
+----+--------+--------+
2 rows in set (0.00 sec)
只有第一个cmd提交,第二个cmd才能得到同步。
rollback 回滚:
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> update uu set salary=800 where name='jshsdh';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from uu;
+----+--------+--------+
| id | name   | salary |
+----+--------+--------+
|  1 | jshsdh |    800 |
|  2 | uwgdg  |   1100 |
+----+--------+--------+
2 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from uu;
+----+--------+--------+
| id | name   | salary |
+----+--------+--------+
|  1 | jshsdh |    900 |
|  2 | uwgdg  |   1100 |
+----+--------+--------+
2 rows in set (0.00 sec)

rollback回滚,影响所有:
无论改了几次值,回滚都会让他返回到回滚前的那个最后状态。

事务的特性:(***)

原子性(Atomicity) :原子意为最小的粒子,即不能再分的事务,要么全部执行,要么全部取消(银行转账例子)

一致性(Consistency):指事务发生前和发生后,数据的总额依然匹配

隔离性(Isolation):简单来说,某个事务的操作对其他事务不可见的

持久性(Durability):当事务完成后,其影响应保留下来,不能撤销,只能通过‘补偿性事务’来抵消之前的错误

2.存储引擎:

InnoDB:保时捷引擎

MyIsam:奔奔引擎

建表的时候

mysql> create table uu(
    -> id int auto_increment primary key,
    -> name varchar(32) not null default '',
    -> salary int not null default 0
    -> )engine=Innodb charset utf8;

mysql 5.5 以上,默认用InnoDB引擎。

两个引擎的区别:

​ 1.InnoDB支持事务,MyIsam不支持。

​ 2.InnoDB支持行锁,MyIsam支持表锁。

3.视图:

项目,有100个SQL,其中80个SQL都是:

select * from 表名 where 字段='xxx';

增加视图:(视图是SQL语句的影子,不能修改,底层非常消耗MySQL的性能,一般很少用)

​ create view 视图名 as SQL语句;

删除:

​ drop view v1;

例子:

mysql> select * from uu where name='jshsdh';
+----+--------+--------+
| id | name   | salary |
+----+--------+--------+
|  1 | jshsdh |    900 |
+----+--------+--------+
1 row in set (0.00 sec)

mysql> create view v1 as select * from uu where name='jshsdh';
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+--------------+
| Tables_in_tt |
+--------------+
| boy          |
| boy2girl     |
| class        |
| course       |
| department   |
| employee     |
| girl         |
| school       |
| score        |
| student      |
| t1           |
| t2           |
| teacher      |
| user         |
| userinfo     |
| uu           |
| v1           |
| xxx          |
+--------------+
18 rows in set (0.00 sec)

mysql> select * from v1;
+----+--------+--------+
| id | name   | salary |
+----+--------+--------+
|  1 | jshsdh |    900 |
+----+--------+--------+
1 row in set (0.01 sec)

4.触发器:

两张表:订单表 库存表

场景:当我下一个订单的时候,订单表中需要增加一个记录,同时库存表中需要减1。这两个操作是同时发生的,并且前一个操作触发后一个操作。

使用触发器可以定制用户对某一张表的数据进行[增,删,改]操作时前后的行为(没有查询),在进行增删改的时候触发某个动作叫做触发器。其实就是在增删改的时候另外执行了一段SQL语句,触发器是被动调用的,不能由用户直接调用。

使用方法:

增加:

mysql> delimiter //
mysql> select * from t2;
    -> //

mysql>  CREATE TRIGGER tri_before_insert_t2 BEFORE INSERT ON t2 FOR EACH ROW
    ->  BEGIN
    ->  INSERT INTO t1 (NAME) VALUES ('aa');
    ->  END //
Query OK, 0 rows affected (0.02 sec)

mysql>  delimiter ;

查看触发器:

mysql> show triggers\G
*************************** 1. row ***************************
             Trigger: tri_before_insert_t2
               Event: INSERT
               Table: t2
           Statement: BEGIN
 INSERT INTO t1 (NAME) VALUES ('aa');
 END
              Timing: BEFORE
             Created: NULL
            sql_mode: NO_ENGINE_SUBSTITUTION
             Definer: root@localhost
character_set_client: gbk
collation_connection: gbk_chinese_ci
  Database Collation: utf8_general_ci
1 row in set (0.02 sec)

删除:drop trigger 触发器名;

5.存储过程

像一个SQL函数

创建:

mysql> delimiter //
mysql> select * from uu;
    -> //
+----+--------+--------+
| id | name   | salary |
+----+--------+--------+
|  1 | jshsdh |    900 |
|  2 | uwgdg  |   1100 |
+----+--------+--------+
2 rows in set (0.00 sec)

mysql> create procedure p1()
    -> BEGIN
    ->     select * from uu where id=2;
    -> END//
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter;
mysql> call p1();
+----+------+--------+
| id | name | salary |
+----+------+--------+
|  2 | uwgdg|   1100 |
+----+------+--------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

删除:drop procedure p1;

6.函数

        CHAR_LENGTH(str)
            返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
            对于一个包含五个二字节字符集, LENGTH()返回值为 10, 而CHAR_LENGTH()的返回值为5。

        CONCAT(str1,str2,...)
            字符串拼接
            如有任何一个参数为NULL ,则返回值为 NULL。
        FORMAT(X,D)
            将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若  D 为 0, 则返回结果不带有小数点,或不含小数部分。
            例如:
                SELECT FORMAT(12332.1,4); 结果为: '12,332.1000'
        INSTR(str,substr)
            返回字符串 str 中子字符串的第一个出现位置。
        LEFT(str,len)
            返回字符串str 从开始的len位置的子序列字符。
        LOWER(str)
            变小写
        UPPER(str)
            变大写
        LTRIM(str)
            返回字符串 str ,其引导空格字符被删除。
        RTRIM(str)
            返回字符串 str ,结尾空格字符被删去。
        SUBSTRING(str,pos,len)
            获取字符串子序列
        LOCATE(substr,str,pos)
            获取子序列索引位置
        REPEAT(str,count)
            返回一个由重复的字符串str 组成的字符串,字符串str的数目等于count 。
            若 count <= 0,则返回一个空字符串。
            若str 或 count 为 NULL,则返回 NULL 。
        REPLACE(str,from_str,to_str)
            返回字符串str 以及所有被字符串to_str替代的字符串from_str 。
        REVERSE(str)
            返回字符串 str ,顺序和字符顺序相反。
        RIGHT(str,len)
            从字符串str 开始,返回从后边开始len个字符组成的子序列

7.数据库的备份

备份的原因:将重要的数据保存下来。

语法:mysqldump -h 服务器 -u用户名 -p密码 数据库名 表名1,表名2,...>

                #示例:
                #单库备份
                mysqldump -uroot -p123 db1 > db1.sql
                mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql

                #多库备份
                mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql

                #备份所有库
                mysqldump -uroot -p123 --all-databases > all.sql

            重新导入:
                mysql> source D:/test3.sql;

标签:总结,name,uu,11.1,sec,str,mysql,id
来源: https://www.cnblogs.com/lidandanaa/p/11783771.html