python全栈开发基础知识学习——数据库表操作

表单操作

  • 一、表结构操作
    • 1.创建表
    • 2.查看表信息
    • 3.修改表结构
  • 二、表记录操作
    • 1.表纪录之增,删,改
    • 2.表记录之查
  • 三、外键约束
  • 四、多表查询
    • 准备两张表
    • 笛卡尔积查询
    • 内连接查询
    • 外连接查询
  • 五、索引
    • 1.索引简介
    • 2. 索引语法
      • 1.创建表时创建索引
      • 2.已存在的表创建索引
      • 3.删除索引
    • 3.索引测试实验

一、表结构操作

1.创建表

        create table tab_name(
            field1 type[完整性约束条件],
            field2 type,
            ...
            fieldn type
        )[character set xxx];

创建表头时,我们要注意:在最后一列时,不需要加逗号,其余的都以逗号进行分隔。

举例:我们需要创建一个员工表employee

         create table employee(
            id int primary key auto_increment ,
            name varchar(20),
            gender bit default 1,   -- gender char(1)  default 1 
            birthday date,
            entry_date date,
            job varchar(20),
            salary double(4,2) unsigned  -- 注意,这里作为最后一个字段不加逗号 
          );

常用的约束条件有以下这些,约束条件为可选的条件。

       primary key (非空且唯一)  :能够唯一区分出当前记录的字段称为主键!
       unique
       not null
       auto_increment 主键字段必须是数字类型。

2.查看表信息

语法 描述
desc tab_name 查看表结构
show columns from tab_name 查看表结构
show tables 查看当前数据库中的所有的表
show create table tab_name 查看当前数据库表建表语句

3.修改表结构

语法 描述
alter table tab_name add [column] 列名 类型[完整性约束条件][first|after 字段名]; 关键字:add;添加列(字段),可同时添加多个列(字段)
alter table tab_name modify 列名 类型 [完整性约束条件][first|after 字段名]; 关键字:modify;修改一列类型
alter table tab_name change [column] 列名 新列名 类型 [完整性约束条件][first|after 字段名]; 关键字:change;修改列名
alter table tab_name drop [column] 列名; 关键字:drop;删除一列
rename table 表名 to 新表名; 关键字:to修改表名
alter table tab_name add primary key(字段名称,…) 关键字:add primary key;添加主键
drop table tab_name; 删除表,需要区分删除字段
添加主键的易错点:
		1. 主键的作用主要确定该数据的唯一性。一个表中只有一个主键,当有主键时,不能再添加;
		2. eg:
    mysql> create table test5(num int auto_increment);
    ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
    create table test(num int primary key auto_increment);
    -- 思考,如何删除主键?这就需要用到下面的两句
    alter table test modify id int;   -- auto_increment没了,但这样写主键依然存在,所以还要加上下面这句
    alter table test drop primary key;-- 仅仅用这句也无法直接删除主键

除了单字段主键,还有多字段主键:

单字段主键的创建
 create table users(
            id INT primary key,
            name varchar(20),
            city varchar(20)
          );
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
| city  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+


多字段主键的创建:
 create table users2(
            id INT,
            name varchar(20),
            city varchar(20),
            primary key(name,id)
          );
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(20) | NO   | PRI | NULL    |       |
| city  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

二、表记录操作

创建一个表单,以下例子都将使用该表单。
CREATE TABLE ExamResult(
id INT PRIMARY KEY auto_increment,
name VARCHAR (20),
Chinese DOUBLE,
Math DOUBLE ,
English DOUBLE
);

表操作的关键字

关键字 描述
WHERE 子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。
SET 子句指示要修改哪些列和要给予哪些值
UPDATE 语法可以用新值更新原有表行中的各列

1.表纪录之增,删,改

语法 描述
insert [into] tab_name (field1,filed2,…) values (value1,value2,…); 关键字:insert;添加一条表单记录
delete from tab_name [where …] 关键字:delete;delete语句只能删除表中的内容,不能删除表本身,想要删除表,用drop
truncate table tab_name 关键字:truncate;TRUNCATE TABLE也可以删除表中的所有数据,词语句首先摧毁表,再新建表。此种方式删除的数据不能在事务中恢复。
update tab_name set field1=value1,field2=value2,…[where 语句] 关键字:update;修改表记录

增加一条记录insert:


insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......);

	insert into examresult (id,name,Chinese,Math,English) values (1,"小明",80,90,100);
	
	如果需要对每一个都需要赋值时,可以不加字段名,直接写values。
    insert into Examresult values(2,"晓燕",90,92,96);
    
·	除了对每一个赋值,还可以选择性的为某个字段赋值。
	insert into Examresult (name,Chinese) value ("Jon",40);

	插入多条记录
	insert into Examresult value (4,"Jerry",90,71,99),
    (5,"alivin",30,40,66);


		+----+--------+---------+------+---------+
		| id | name   | Chinese | Math | English |
		+----+--------+---------+------+---------+
		|  1 | 小明   |      80 |   90 |     100 |
		|  2 | 晓燕   |      90 |   92 |      96 |
		|  3 | Jon    |      40 | NULL |    NULL |
		|  4 | Jerry  |      90 |   71 |      99 |
		|  5 | alivin |      30 |   40 |      66 |
		+----+--------+---------+------+---------+

修改表记录


	update tab_name set field1=value1,field2=value2,......[where 语句]
	  update examresult set English=40 WHERE id=1;
	修改表记录时,我们可以添加限制条件--WHERE,WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。
	+----+-------+---------+------+---------+
	| id | name  | Chinese | Math | English |
	+----+-------+---------+------+---------+
	|  1 | 小明  |      80 |   90 |      40 |
	|  2 | 晓燕  |      90 |   92 |      96 |
	|  3 | Jon   |      40 | NULL |    NULL |
	|  4 | Jerry |      90 |   71 |      99 |
	|  5 | alivin |      30 |   40 |      66 |
	+----+-------+---------+------+---------+

删除表记录


delete from tab_name [where ....]

如果不跟where语句则删除整张表中的数据
            delete只能用来删除一行记录
            delete语句只能删除表中的内容,不能删除表本身,想要删除表,用drop
            TRUNCATE TABLE也可以删除表中的所有数据,词语句首先摧毁表,再新建表。此种方式删除的数据不能在事务中恢复。

-- 删除id为5的记录
 delete from examresult where id=5;
 
 -- 删除表中所有记录。
 delete from employee_new;-- 注意auto_increment没有被重置:alter table employee auto_increment=1;
auto_increment是用于主键自动增长的,从1开始增长,当你把第5条记录删除时,再插入一条数据时,主键值是6,不是5,主键值只会递增,不会因为删除了一条记录,主键值就发生改变.

 -- 使用truncate删除表中记录。
 truncate table emp_new;

2.表记录之查

表记录查询之关键字 描述
where 用来添加限制条件
distinct 用来剔除重复行
as 取别名作为显示使用
between (xx and xx) 用来匹配值在某个范围内
in (xx,xx,xx); 用来匹配某个值的信息.
% 表示任意多字符
_ 表示一个字符
Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的别名
Asc 升序,其中asc为默认值
Desc 降序

查询表达式

   SELECT *|field1,filed2 ...   FROM tab_name
        -- 其中from指定从哪张表筛选,*表示查找所有列,也可以指定一个列
        -- 表明确指定要查找的列,distinct用来剔除重复行。
                  WHERE 条件
                  GROUP BY field
                  HAVING 筛选
                  ORDER BY field
                  LIMIT 限制条数
    查询表单记录时,我们可以添加限制条件.

select子句查询

1.查看完整的数据表单:
select * from ExamResult;	
2.查询完整的表单,并显示总成绩
select *,(Chinese+Math+English) as 总成绩 from Examresult;
3.过滤表中重复数据。
select distinct * from ExamResult;

4.思考题:查找的列之间没有用逗号隔开,会发生什么情况?
select name Chinese from ExamResult;

where子句,进行过滤查询.

1.查询学生姓名为晓燕的成绩.
select * from ExamResult where name='yuan';	
2.查询语文分数大于90分(含90分)的学生.
select id,name,Chinese from ExamResult where Chinese>=90;
3.查询总分在250分以上的学生的所有同学成绩.
 select name,Chinese+Math+English as 总成绩 from ExamResult where Chinese+Math+English>200 ;
 ------->注意点:where后面跟的子句不能用as的结果来代替,这与执行的优先级相关.
 4.查询Chinese分数在80-95之间的同学.
 select id,name,Chinese from examresult where Chinese between 80 and 95;
 5.查询Math分数为90,91,92分的同学.
 select id,name,Math from examresult where Math in (90,91,92);
 6.查询缺考Math的学生的姓名.
 select name from examresult where Math is null;
 7.查询所有以J开头的同学的名字及所有成绩.
 select * from examresult where name like "J%";

order by 进行排序

  • Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的别名。
  • Asc 升序、Desc 降序,其中asc为默认值 ORDER BY 子句应位于SELECT语句的结尾。
   -- select *|field1,field2... from tab_name order by field [Asc|Desc]
1.对所有的同学以语文成绩,从高到低排序
 select name,chinese from examresult order by Chinese;
 2.对所有同学的总成绩从高到低排序
select *,(Chinese+Math+English) as 总成绩 from examresult order by 总成绩 desc;,
如果直接相加时,我们发现任何值与null相加都为null,所以我们遇到null应将值转化成0.

 改进方法:ifnull()
 select *,(ifnull(Chinese,0)+ifnull(MAth,0)+ifnull(English,0)) as 总成绩 from examresult order by 总成绩 desc;

having和where的区别:
having 和 where两者都可以对查询结果进行进一步的过滤,差别有:
<1>where语句只能用在分组之前的筛选,having可以用在分组之后的筛选;
<2>使用where语句的地方都可以用having进行替换
<3>having中可以用聚合函数,where中就不行。

聚合函数

聚合函数 描述
COUNT(列名) 统计行的个数,count(字段)不统计null值
SUM(列名) 统计满足条件的行的内容和,sum仅对数值起作用,否则会报错
AVG(列名) 统计满足条件的行的内容的平均数
Max(列名) 求满足条件的行的最大值
Min(列名) 求满足条件的行的最小值

Mysql在执行sql语句时的执行顺序: from where select group by having order by

分析:
select Chinese as Chinese成绩 from ExamResult where Chinese成绩 >70; ---- 不成功
select Chinese as Chinese成绩 from ExamResult having Chinese成绩 >90; — 成功

使用正则表达式查询
匹配名字以 小 开头的同学所有成绩
SELECT * FROM ExamResult WHERE name REGEXP ‘^小’;

	匹配名字以 燕 结尾的同学所有成绩
    SELECT * FROM ExamResult  WHERE name REGEXP '燕$';

    SELECT * FROM ExamResult  WHERE name REGEXP 'J{2}';

三、外键约束

语法 描述
ALTER TABLE 表名 ADD FOREIGN KEY [CONSTRAINT 外键名字] (外键字段) REFERENCES 父表 (主键字段); 如果没有定义外键名,默认为 “表名_ibfk_1”
ALTER TABLE 表名 DROP FOREIGN KEY 外键名字;
innodb支持的四种方式 描述
ON DELETE CASCADE -cascade方式 在父表上update/delete记录时,同步update/delete掉子表的匹配记录----外键的级联删除:如果父表中的记录被删除,则子表中对应的记录自动被删除
ON DELETE SET NULL set null方式 在父表上update/delete记录时,将子表上匹配记录的列设为null-- 要注意子表的外键列不能为not null
ON DELETE Restrict 拒绝对父表进行删除更新操作(了解)
ON DELETE No action 在mysql中同Restrict,如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作(了解)

创建外键
使用MySQL关联数据表时,创建外键的两种方式:创建表时增加外键,已存在表增加外键。
方式一:

---  每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任

----主表

CREATE TABLE ClassCharger(

       id TINYINT PRIMARY KEY auto_increment,
       name VARCHAR (20),
       age INT ,
       is_marriged boolean  -- show create table ClassCharger: tinyint(1)

);

INSERT INTO ClassCharger (name,age,is_marriged) VALUES ("冰冰",12,0),
                                                       ("丹丹",14,0),
                                                       ("歪歪",22,0),
                                                       ("姗姗",20,0),
                                                       ("小雨",21,0);


----子表

CREATE TABLE Student(

       id INT PRIMARY KEY auto_increment,
       name VARCHAR (20),
       charger_id TINYINT,     --切记:作为外键一定要和关联主键的数据类型保持一致
       -- [ADD CONSTRAINT charger_fk_stu]FOREIGN KEY (charger_id) REFERENCES ClassCharger(id)

) ENGINE=INNODB;

INSERT INTO Student(name,charger_id) VALUES ("alvin1",2),
                                            ("alvin2",4),
                                            ("alvin3",1),
                                            ("alvin4",3),
                                            ("alvin5",1),
                                            ("alvin6",3),
                                            ("alvin7",2);


DELETE FROM ClassCharger WHERE name="冰冰";
INSERT student (name,charger_id) VALUES ("yuan",1);
-- 删除居然成功,可是 alvin3显示还是有班主任id=1的冰冰的;

-----------增加外键和删除外键---------

ALTER TABLE student  ADD CONSTRAINT abc
                     FOREIGN KEY(charger_id)
                     REFERENCES  classcharger(id);


ALTER TABLE student DROP FOREIGN KEY abc;

四、多表查询

准备两张表

-- 准备两张表
-- company.employee
-- company.department

      create table employee(
      emp_id int auto_increment primary key not null,
      emp_name varchar(50),
      age int,
      dept_id int
      );

      insert into employee(emp_name,age,dept_id) values
        ('A',19,200),
        ('B',26,201),
        ('C',30,201),
        ('D',24,202),
        ('E',20,200),
        ('F',38,204);


    create table department(
       dept_id int,
       dept_name varchar(100)
      );

    insert into department values
      (200,'人事部'),
      (201,'技术部'),
      (202,'销售部'),
      (203,'财政部');

mysql> select * from employee;
+--------+----------+------+---------+
| emp_id | emp_name | age  | dept_id |
+--------+----------+------+---------+
|      1 | A        |   19 |     200 |
|      2 | B        |   26 |     201 |
|      3 | C        |   30 |     201 |
|      4 | D        |   24 |     202 |
|      5 | E        |   20 |     200 |
|      6 | F        |   38 |     204 |
+--------+----------+------+---------+
rows in set (0.00 sec)

mysql> select * from department;
+---------+-----------+
| dept_id | dept_name |
+---------+-----------+
|     200 | 人事部    |
|     201 | 技术部    |
|     202 | 销售部    |
|     203 | 财政部    |
+---------+-----------+
rows in set (0.01 sec)

笛卡尔积查询

语法:SELECT * FROM employee,department;
笛卡尔积查询的结果为多张表的记录数的乘积.因为例子中的employee有6条记录,department有4条记录,所以笛卡儿积有24条记录.

+--------+----------+------+---------+---------+-----------+
| emp_id | emp_name | age  | dept_id | dept_id | dept_name |
+--------+----------+------+---------+---------+-----------+
|      1 | A        |   19 |     200 |     200 | 人事部    |
|      1 | A        |   19 |     200 |     201 | 技术部    |
|      1 | A        |   19 |     200 |     202 | 销售部    |
|      1 | A        |   19 |     200 |     203 | 财政部    |
|      2 | B        |   26 |     201 |     200 | 人事部    |
|      2 | B        |   26 |     201 |     201 | 技术部    |
|      2 | B        |   26 |     201 |     202 | 销售部    |
|      2 | B        |   26 |     201 |     203 | 财政部    |
|      3 | C        |   30 |     201 |     200 | 人事部    |
|      3 | C        |   30 |     201 |     201 | 技术部    |
|      3 | C        |   30 |     201 |     202 | 销售部    |
|      3 | C        |   30 |     201 |     203 | 财政部    |
|      4 | D        |   24 |     202 |     200 | 人事部    |
|      4 | D        |   24 |     202 |     201 | 技术部    |
|      4 | D        |   24 |     202 |     202 | 销售部    |
|      4 | D        |   24 |     202 |     203 | 财政部    |
|      5 | E        |   20 |     200 |     200 | 人事部    |
|      5 | E        |   20 |     200 |     201 | 技术部    |
|      5 | E        |   20 |     200 |     202 | 销售部    |
|      5 | E        |   20 |     200 |     203 | 财政部    |
|      6 | F        |   38 |     204 |     200 | 人事部    |
|      6 | F        |   38 |     204 |     201 | 技术部    |
|      6 | F        |   38 |     204 |     202 | 销售部    |
|      6 | F        |   38 |     204 |     203 | 财政部    |
+--------+----------+------+---------+---------+-----------+



关键字 描述
inner join 内连接
left join 左连接
right join 右连接
full join 全外连接,但是MySQL中不支持全外连接,可通过其他方式间接实现全外连接

内连接查询

语法:select * from 表单1,表单2 where 表单1.字段名 = 表单2.字段名;
------->等价于: select * from 表单1 inner join表单2 on 表单1.字段名 = 表单2.字段名;

select * from employee,department where employee.dept_id = department.dept_id;

      +--------+----------+------+---------+---------+-----------+
      | emp_id | emp_name | age  | dept_id | dept_id | dept_name |
      +--------+----------+------+---------+---------+-----------+
      |      1 | A        |   19 |     200 |     200 | 人事部    |
      |      2 | B        |   26 |     201 |     201 | 技术部    |
      |      3 | C        |   30 |     201 |     201 | 技术部    |
      |      4 | D        |   24 |     202 |     202 | 销售部    |
      |      5 | E        |   20 |     200 |     200 | 人事部    |
      +--------+----------+------+---------+---------+-----------+

外连接查询

左外连接:在内连接得到的匹配结果的基础上增加左边有右边没有的结果.
语法: select * from 表单1 left join表单2 on 表单1.字段名 = 表单2.字段名;

 select * from employee left join department on employee.dept_id = department.dept_id;

    +--------+----------+------+---------+---------+-----------+
    | emp_id | emp_name | age  | dept_id | dept_id | dept_name |
    +--------+----------+------+---------+---------+-----------+
    |      1 | A        |   19 |     200 |     200 | 人事部    |
    |      5 | E        |   20 |     200 |     200 | 人事部    |
    |      2 | B        |   26 |     201 |     201 | 技术部    |
    |      3 | C        |   30 |     201 |     201 | 技术部    |
    |      4 | D        |   24 |     202 |     202 | 销售部    |
    |      6 | F        |   38 |     204 |    NULL | NULL      |
    +--------+----------+------+---------+---------+-----------+

右外连接:在内连接的基础上增加右边有左边没有的结果
语法: select * from 表单1 right join表单2 on 表单1.字段名 = 表单2.字段名;

 select * from employee RIGHT JOIN department on employee.dept_id = department.dept_id;

        +--------+----------+------+---------+---------+-----------+
        | emp_id | emp_name | age  | dept_id | dept_id | dept_name |
        +--------+----------+------+---------+---------+-----------+
        |      1 | A        |   19 |     200 |     200 | 人事部    |
        |      2 | B        |   26 |     201 |     201 | 技术部    |
        |      3 | C        |   30 |     201 |     201 | 技术部    |
        |      4 | D        |   24 |     202 |     202 | 销售部    |
        |      5 | E        |   20 |     200 |     200 | 人事部    |
        |   NULL | NULL     | NULL |    NULL |     203 | 财政部    |
        +--------+----------+------+---------+---------+-----------+

全外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果
语法:
select * from 表单1 left join表单2 on 表单1.字段名 = 表单2.字段名;
Union
select * from 表单1 right join表单2 on 表单1.字段名 = 表单2.字段名;

   select * from employee RIGHT JOIN department on employee.dept_id = department.dept_id
   UNION
   select * from employee LEFT JOIN department on employee.dept_id = department.dept_id;

        

        +--------+----------+------+---------+---------+-----------+
        | emp_id | emp_name | age  | dept_id | dept_id | dept_name |
        +--------+----------+------+---------+---------+-----------+
        |      1 | A        |   19 |     200 |     200 | 人事部    |
        |      2 | B        |   26 |     201 |     201 | 技术部    |
        |      3 | C        |   30 |     201 |     201 | 技术部    |
        |      4 | D        |   24 |     202 |     202 | 销售部    |
        |      5 | E        |   20 |     200 |     200 | 人事部    |
        |   NULL | NULL     | NULL |    NULL |     203 | 财政部    |
        |      6 | F        |   38 |     204 |    NULL | NULL      |
        +--------+----------+------+---------+---------+-----------+

五、索引

1.索引简介

  1. 什么是索引?

    一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。说起加速查询,就不得不提到索引了。

  2. 为什么要有索引?
    索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。
    打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。

    拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。

  3. 索引分类
    索引分单列索引和组合索引(又称多列索引)。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。

  4. 索引的应用
    创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

  5. 索引的缺点
    上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。

  6. 索引的特点
    索引特点:创建与维护索引会消耗很多时间与磁盘空间,但查询速度大大提高!

2. 索引语法

创建索引也有两种方法:1.在创建表时创建索引;2.对已存在的表创建索引。

1.创建表时创建索引

  1. 创建索引语法
    CREATE TABLE 表名 (
                字段名1  数据类型 [完整性约束条件…],
                字段名2  数据类型 [完整性约束条件…],
                [UNIQUE | FULLTEXT | SPATIAL ]   INDEX | KEY
                [索引名]  (字段名[(长度)]  [ASC |DESC])
                );
对语法各选项的说明:
1、unique|fulltext|spatial为可选参数,分别表示唯一索引、全文索引和空间索引;

2、index和key为同义词,两者作用相同,用来指定创建索引

3、col_name为需要创建索引的字段列,该列必须从数据表中该定义的多个列中选择;

4、index_name指定索引的名称,为可选参数,如果不指定,MYSQL默认col_name为索引值;

5、length为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;

6、asc或desc指定升序或降序的索引值存储

特别注意:主键索引是一种特殊的唯一索引,不允许有空值。

  1. 创建普通索引示例:
    CREATE TABLE emp1 (
        id INT,
        name VARCHAR(30) ,
        INDEX index_name (name)
        );
  1. 创建唯一索引示例:
    CREATE TABLE emp2 (
        id INT,
        name VARCHAR(30) ,
        UNIQUE INDEX index_name (name)
        );
  1. 创建全文索引示例:
    CREATE TABLE emp3 (
        id INT,
        name VARCHAR(30) ,
        resume VARCHAR(50),
        FULLTEXT INDEX index_resume (resume)
        );
  1. 创建多列索引示例:
    CREATE TABLE emp4 (
        id INT,
        name VARCHAR(30) ,
        INDEX index_id_name (id_name)
        );

2.已存在的表创建索引

已存在的表创建索引也有两种方式:1.alter;2.create

  1. create
    CREATE在已存在的表上创建索引
      CREATE  [UNIQUE | FULLTEXT | SPATIAL ]  INDEX  索引名
              ON 表名 (字段名[(长度)]  [ASC |DESC]) ;

举例: create index index_name on emp1(name);

  1. alter
    ALTER TABLE在已存在的表上创建索引
      ALTER TABLE 表名 ADD  [UNIQUE | FULLTEXT | SPATIAL ] INDEX
                    索引名 (字段名[(长度)]  [ASC |DESC]) ;

举例: alter table emp1 add unique index index_name(name);

3.删除索引

语法:DROP INDEX 索引名 on 表名

举例: drop index index_name on t1;

3.索引测试实验

  1. 创建一个表单
    create table t1(id int,name varchar(20));

  2. 创建一个函数,自动生成50万条数据

        delimiter $$  #修改结束符为$$,避免函数的提示符与MySQL的结束符混乱。
        
        create procedure autoinsert()   #mysql自定义函数以Begin开头,end结尾
        BEGIN
        declare i int default 1;
        while(i<200000)do
        insert into t1 values(i,'jie');
        set i=i+1;
        end while;
        END$$
        delimiter ;
        
        call autoinsert()  #调用自定义函数
    
  3. 测试创建索引前需要消耗的时间。

    select * from t1 where id=160000;
    
	mysql> select * from t1 where id = 160000;
	+--------+------+
	| id     | name |
	+--------+------+
	| 160000 | yuan |
	+--------+------+
	1 row in set (0.23 sec)
  1. 为id创建索引

    create index index_id on t1(id);
    create index index_name on t1(name);
    

创建索引也是需要消耗时间的,创建索引需要消耗资源

	mysql> create index index_id on t1(id);
	Query OK, 0 rows affected (1.44 sec)
	Records: 0  Duplicates: 0  Warnings: 0
  1. 测试创建索引后查询内容需要消耗的时间。

    select * from t1 where id=300000;

  2. 删除普通索引,创建多列索引

    drop index index_id on t1;
    drop index index_name on t1;
    create index index_id_name on t1(id, name) ;
    
	mysql> select * from t1 where id = 160000;
	+--------+------+
	| id     | name |
	+--------+------+
	| 160000 | yuan |
	+--------+------+
	1 row in set (0.01 sec)
  1. 测试多列索引需要消耗的时间。
    select * from t1 where id=300000;
mysql> create index index_id_name on t1(id, name) ;
Query OK, 0 rows affected (1.38 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from t1 where id = 160000;
+--------+------+
| id     | name |
+--------+------+
| 160000 | yuan |
+--------+------+
1 row in set (0.00 sec)

从实验上我们可以发现,创建多列索引的效率会比普通索引分别创建的效率要高,并且消耗资源比较少。


参考资料

数据库基础

你可能感兴趣的:(python全栈学习)