数据库的操作
数据库的概念
1.数据库是用于存放数据和数据库对象的容器。数据库对象包括表、索引、存储过程、视图、触发器、用户、角色、类型、函数等。
2.每个数据库都有唯一的名称,并且数据库的名字都是有实际意义的。
数据库的操作命令
创建数据库 create
查看数据库 show
选择数据库 use
修改数据库 alter
删除数据库 drop
创建数据库
1 | CREATE DATABASE database_name character set character_name; |
1 | 举例:创建数据库cms。 |
注意:MySQL不允许两个数据库使用相同的名字。
每条SQL语句都以“;”作为结束标志。
查看数据库
show databases;
成功创建数据库后,可用show命令查看MySQL服务器中的所有数据库信息。
1 | 举例:查看MySQL服务器中的所有数据库。 |
选择数据库
成功创建数据库后,该数据库不会自动成为当前数据库,需要用use语句来指定当前数据库。
1 | 举例:选择名称为cms的数据库。 |
修改数据库
alter DATABASE database_name character set character_name;
database_name:表示所要修改的数据库名;
character_name:是修改诉字符集的名称。
1 | 举例:修改数据库cms。 |
删除数据库
DROP DATABASE database_name;
database_name:表示所要删除的数据库名;
删除数据的操作应谨慎使用,一旦执行该操作,数据库的所有结构和数据都会被删除,没有恢复的可能,除非数据库有备份。
1 | 举例:删除数据库cms。 |
表的操作
表的概念
1.表是包含数据库中所有数据的数据库对象。按行和列格式组织,每一行代表一条唯一的记录,每一列代表记录中的一个字段
2.表中的数据库对象包含列、索引和触发器。
列:属性列,创建表时,必须指定列的名字和数据类型。
索引:根据指定数据表的列建立起来的顺序,提供快速访问数据的途径且可监督表的数据,使其索引所指向的列中的数据不重复。
触发器:指用户定义的事务命令的集合,当对一个表中的数据进行插入、更新或删除时,这组命令就会自动执行。
创建表
CREATE TABLE table_name(
属性名 数据类型,
属性名 数据类型,
…
属性名 数据类型
)
表的具体内容定义在括号之中,各列之间用逗号分隔。
属性名:字段的名称;数据类型:字段的数据类型。
表名:不能与已经存在的表对象重名。
1 | 举例:创建数据库company,在数据库中创建表t_dept。 |
查看表结构
语法格式:DESCRIBE 表名
表名:查看表对象定义信息的名字
1 | 举例:查看数据库company中创建名为t_dept表时的定义信息。 |
DESCRIBE语句查看表定义
SHOW CREATE TABLE语句查看表详细定义
语法格式:SHOW CREATE TABLE 表名
表名:查看表对象定义的名字
1 | 举例:查看数据库company中创建名为t_dept表时的详细信息。 |
DESCRIBE语句查看表定义演示
SHOW CREATE table t_dept\G 执行结果
SHOW CREATE table t_dept\g 执行结果
SHOW CREATE table t_dept; 执行结果
DESCRIBE语句和SHOW CREATE TABLE语句的区别
DESCRIBE 表名:表结构定义信息,字段名,字段类型,是否为空,是否主键,默认值等;
SHOW CREATE TABLE 表名:除上述信息外,还有存储引擎和默认字符集。
删除表
删除数据库中已存在的表,会删除表中所保存的所有数据。
语法格式:DROP TABLE 表名
表名:表示所要删除的表名字,表必须是数据库中已经存在的表。
1 | 举例:删除数据库company中名为t_dept的表。 |
修改表
增加字段
如果表已建好,数据已录入,但是需要增加一列或几列,怎么办?
(1)ALTER TABLE 表名 ADD 属性名 属性类型
增加到所有字段的最后一个位置。
(2)ALTER TABLE 表名 ADD 属性名 属性类型 FIRST
FIRST关键字:字段将增加到所有字段的第一个位置。
(3) ALTER TABLE 表名 ADD 属性名 属性类型 AFTER 属性名
在表的指定字段之后增加字段
表名:表示所要修改的表名字,“属性名”:要增加字段的名称,“属性类型”:数据类型。
1 | 举例1:为数据库company中表t_dept表增加一个名为descri,类型为VARCHAR的字段,所增加字段在表中所有字段的最后一个位置。 |
1 | 举例2:为数据库company中表t_dept表增加一个名为no1,类型为VARCHAR的字段,所增加字段在表中所有字段的第一个位置。 |
1 | 举例3:为数据库company中表t_dept表增加一个名为no2,类型为VARCHAR的字段,所增加字段在deptno字段之后的位置。 |
删除字段
删除字段:删除已经在表中定义好的某个字段。
ALTER TABLE 表名 DROP 属性名
表名:表示所要修改的表名字,“属性名”:要删除字段的名称。
1 | 举例1:为数据库company中表t_dept删除名为no2的字段。 |
修改字段
1、修改字段的数据类型
1 | ALTER TABLE 表名 MODIFY 属性名 数据类型 |
2、修改字段的名字1
ALTER TABLE 表名 CHANGE 旧属性名 新属性名 旧数据类型
3、同时修改字段的名字和属性
1 | ALTER TABLE 表名 CHANGE 旧属性名 新属性名 新数据类型 |
4、修改字段的顺序
1 | ALTER TABLE 表名 CHANGE 属性名1 数据类型 FIRST|AFTER 属性名2 |
修改字段数据类型
1 | 举例1:在数据库company中表t_dept中,将deptno字段的数据类型由原来的int(11)类型修改为varchar(20)类型。 |
修改字段的名字
1 | 举例2:在数据库company中表t_dept中,将loc字段的字段名改为location。 |
同时修改字段的名字和属性
1 | 举例3:在数据库company中表t_dept中,将location字段的字段名改为loc,数据类型由原来的varchar(40)类型修改为varchar(20)类型。 |
修改字段的顺序
1 | 举例4-1:为数据库company中表t_dept中,将loc字段调整到表的第一个位置,把字段deptno调整到字段的dname字段之后。 |
1 | 举例4-2:为数据库company中表t_dept中,将loc字段调整到表的第一个位置,把字段deptno调整到字段的dname字段之后。 |
修改表名
表名可以在一个数据库中唯一地确定一张表。数据库系统通过表名来区分不同的表。
1 | ALTER TABLE 表名 rename [as] new_tablename |
1 | rename table tablename to new_tablename |
1 | 举例:将表名tb_user改为tb_user2。 |
操作表的约束
完整性约束
完整性:指数据的准确性和一致性。
完整性检查:指检查数据的准确性和一致性。
完整性约束:检查数据库表中的数据是否满足规定的条件,以保证数据库表中数据的准确性和一致性。
完整性约束关键字 | 含义 |
---|---|
NOT NULL | 约束字段的值不能为空 |
DEFAULT | 设置字段的默认值 |
UNIQUE KEY(UK) | 约束字段的值是唯一 |
PRIMARY KEY (PK) | 约束字段为表的主键,可为作为该表记录的唯一标记 |
AUTO_INCREMENT | 约束字段的值为自动增加 |
FOREIGN(FK) | 约束字段为表的外键 |
备注:不支持check约束,使用check约束没有任何效果;单列约束和多列约束。(一个约束只约束一列车或多列)
设置非空约束 NOT NULL,NK
当数据库表中的某个字段上的内容不希望设置为NULL时,则可以使用NK约束进行设置。
约束设置方法:在创建数据库表时为某些字段加上“NOT NULL”,保证所有记录中该字段都有值。若该字段为空值,则会报错。
1 | Create table table_name( |
设置字段的默认值 DEFAULT
在数据库表中插入一条新记录时,若没有为某个字段赋值,则自动为这个字段插入默认值。
约束设置方法: DEFAULT
1 | Create table table_name( |
设置唯一约束 UNIQUE,UK
当数据库表中的某个字段上的内容不允许重复时,用UK约束进行设置。
约束设置方法:在创建数据库表时为某些字段加上“UNIQUE”,保证所有记录中该字段上的值不重复。若该字段的值有重复,则会报错。
1 | Create table table_name( |
设置主键约束 PRIMARY ,PK
当用数据库表中的某个字段来唯一标识所有记录时,则可以使用PK约束进行设置。
约束设置方法:在创建数据库表时为某些字段加上“PRIMARY KEY”,则该字段可以唯一地标示所有记录。
设置主键约束时,必须要满足主键字段的值是唯一、非空的。
主键可以是单一字段、也可为多个字段,因此分为单字段主键和多字段主键。
1 | 单字段主键: |
1 | 多字段主键: |
设置字段值自动增加AUTO_INCREMENT
当数据库表中插入新记录时,字段上的值会自动生成唯一的ID。
约束设置方法:在创建数据库表时为某些字段加上“AUTO_INCREMENT”。
一个数据库表中只能有一个字段使用该约束,该字段的数据类型必须是整数类型。
1 | Create table table_name( |
设置外键约束FOREIGN,FK
外键约束保证多个表(通常为两个表)之间的参照完整性,构建于两个表的两个字段之间的参照关系。
设置外键约束的两个表之间具有父子关系,即子表中某个字段的取值范围由父表决定。
约束设置方法:在创建数据库表时为某些字段加上“FOREIGN KEY”。
1 | Create table table_name( |
设置外键约束的两个表之间具有父子关系,即子表中某个字段的取值范围由父表决定。
例如:部门表和雇员表,雇员表中有一个表示部门编号的字段deptno,其依赖于部门表的主键,字段deptno就是雇员表的外键,通过该字段部门表和雇员表建立了关系。
设置外键约束的字段必须依赖于数据库中已经存在的父表的主键,同时外键可以为NULL。
1 | Create table table_name( |
数据的操作
数据库是存储数据的仓库。数据库基本对象—-表,用来存储数据。
1 | 数据的操作包括 |
插入数据记录
插入完整数据记录
1 | Insert into 数据表名(field1,field2,……fieldn) |
1 | 例一: |
1 | 例2: |
1 | 例3: |
1 | 例4: |
1 | 例5: |
同时插入多条记录
1 | 插入时指定多个值列表,每个值列表之间用逗号分隔开 |
1 | 插入时指定多个值列表,每个值列表之间用逗号分隔开 |
插入完整数据记录
1 | 例6: |
1 | 例7: |
1 | 例8: |
将查询结果插入到表中
1 | INSERT语句和SELECT语句组成的组合语句即可快速地从一个或多个表中向一个表中插入多个行。 |
1 | 例9: |
更新数据记录
1 | MySQL中使用UPDATE语句更新表中的记录,可以更新特定的行或者同时更新所有的行。 |
1 | 例10: |
1 | 例10: |
删除数据记录
从数据表中删除数据
使用DELETE
语句,DELETE
语句允许WHERE
子句指定删除条件。
DELETE FROM 数据表名[WHERE condition>]
1 | 例12: |
1 | 例13: |
TRUNCATE TABLE语句
TRUNCATE将直接删除原来的表并重新创建一个表,其语法结构为:
TRUNCATE TABLE table_name
TRUNCATE直接删除表而不是删除记录,因此执行速度比DELETE快。
综合案例——记录的插入、更新和删除
对数据进行更新和删除时,MySQL中对数据操作没有任何提示,因此在更新和删除数据时,一要谨慎小心,查询条件一定要准确,避免造成数据的丢失。本章的综合案例包含了对数据表中数据的基本操作,包括记录的插入、更新和删除。
创建数据表books,并定义各个字段
1 | CREATE TABLE books |
插入数据到books表中
1 | 看看:SELECT * FROM books; |
同时插入多条记录
1 | INSERT INTO books |
批量更新数据
1 | 一、 |
子查询和正则表达式查询
本章有点杂乱,抓重点记一下,重在体会方法。
子查询
带ANY、SOME关键字的子查询
ANY和SOME关键字是同义词,表示满足其中任一条件,它们允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。
下面定义两个表tb1和tb2:
1 | CREATE table tbl1 ( num1 INT NOT NULL); |
示例:
1 | 示例: |
带ALL关键字的子查询
ALL关键字与ANY和SOME不同,使用ALL时需要同时满足所有内层查询的条件。
1 | 示例: |
带EXISTS关键字的子查询
EXISTS关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,那么EXISTS的结果为true,此时外层查询语句将进行查询;如果子查询没有返回任何行,那么EXISTS返回的结果是false,此时外层语句将不进行查询。
1 | 查询suppliers表中是否存在s_id=87的供应商,如果存在,则查询fruits表中的记录。 |
1 | 查询suppliers表中是否存在s_id=87的供应商,如果存在,则查询fruits表中的f_price大于8.20的记录。 |
1 | 查询suppliers表中是否存在s_id=87的供应商,如果不存在则查询fruits表中的记录。 |
带IN关键字的子查询
IN关键字进行子查询时,内层查询语句仅仅返回一个数据列,这个数据列里的值将提供给外层查询语句进行比较操作。
在orderitems表中查询f_id为c0的订单号,并根据订单号查询具有订单号的客户c_id。SELECT c_id FROM orders WHERE
o_numIN
(SELECT
o_numFROM orderitems WHERE f_id = 'c0');
1 | SELECT o_num FROM orderitems WHERE f_id = 'c0'; |
1 | 在SELECT语句中使用NOT IN关键字。 |
带比较运算符的子查询
在前面介绍的带ANY、ALL关键字的子查询时使用了>比较运算符,子查询时还可以使用其他的比较运算符,如<、<=、=、>=和!=等。
1 | 在suppliers表中查询s_city等于“Tianjin”的供应商s_id,然后在fruits表中查询所有该供应商提供的水果的种类。 |
1 | 在suppliers表中查询s_city等于“Tianjin”的供应商s_id,然后在fruits表中查询所有非该供应商提供的水果的种类。 |
合并查询结果
利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同。各个SELECT语句之间使用UNION或UNION ALL关键字分隔。
1 | 查询所有价格小于9的水果的信息,查询s_id等于81和83所有的水果的信息,使用UNION ALL |
为表和字段取别名
为表取别名
为了方便操作或者需要多次使用相同的表时,可以为表指定别名,用这个别名替代表原来的名称。
表名 [AS] 表别名
为字段取别名
MySQL可以指定列别名,替换字段或表达式。
列名 [AS] 列别名
使用正则表达式查询
例如:在文本文件中提取电话号码;
查找文章中重复的单词;
或替换用户输入的某些敏感词语;
正则表达式强大灵活,可以应用于非常复杂的查询;
REGEXP 正则表达式匹配模式;
可以使用多种不同的匹配字符;
查询以特定字符或字符串开头的记录
字符‘^’
匹配以特定字符或者字符串开头的文本。
1 | 在fruits表中,查询f_name字段以字母’b’开头的记录 |
查询以特定字符或字符串结尾的记录
字符‘$’
匹配以特定字符或者字符串结尾的文本。
1 | 在fruits表中,查询f_name字段以字母’y’结尾的记录 |
用符号”.”来替代字符串中的任意一个字符
字符‘.’匹配任意一个字符。
1 | 在fruits表中,查询f_name字段值包含字母’a’与’g’且两个字母之间只有一个字母的记录 |
使用”*”和”+”来匹配多个字符
1 | 星号‘*’匹配前面的字符任意多次,包括0次。 |
星号’*’可以匹配任意多个字符,blackberry和berry中字母b后面并没有出现字母a,但是也满足匹配条件。
1 | 在fruits表中,查询f_name字段值以字母’b’开头,且’b’后面出现字母’a’至少一次的记录 |
‘a+’匹配字母’a’至少一次,只有banana满足匹配条件。
匹配指定字符串
正则表达式可以匹配指定字符串,只要这个字符串在查询文本中即可,如要匹配多个字符串,多个字符串之间使用分隔符‘|’隔开。
1 | 在fruits表中,查询f_name字段值包含字符串“on”的记录 |
1 | 在fruits表中,查询f_name字段值包含字符串“on”或者“ap”的记录 |
与LIKE子句的对比1
2
3
4
5
6
7
8
9
10
11
12
13
14SELECT * FROM fruits WHERE f_name LIKE 'on';
查询结果为:
Empty set
如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的
'%a' //以a结尾的数据
'a%' //以a开头的数据
'%a%' //含有a的数据
'_a_' //三位且中间字母是a的
'_a' //两位且结尾字母是a的
'a_' //两位且开头字母是a的
匹配指定字符中的任意一个
方括号“[]”指定一个字符集合,只匹配其中任何一个字符,即为所查找的文本。
1 | 在fruits表中,查找f_name字段中包含字母’o’或者’t’的记录 |
1 | 例:在fruits表,查询s_id字段中数值中包含4、5或者6的记录 |
注意:
查询结果中,s_id字段值中有3个数字中的1个即为匹配记录字段。
匹配集合“[456]”
也可以写成“[4-6]”
即指定集合区间。例如“[a-z]”
表示集合区间为从a~z
的字母,“[0-9]”
表示集合区间为所有数字。
匹配指定字符以外的字符
“[^字符集合]”匹配不在指定集合中的任何字符。
1 | 在fruits表中,查询f_id字段包含字母a~e和数字1~2以外的字符的记录,即非a1 a2 b1 b2的字符。 |
使用{M}或者{M,N}来指定字符串连续出现的次数
“字符串{n,}”表示至少匹配n次前面的字符。“字符串{n,m}”表示匹配前面的字符串不少于n次,不多于m次。
1 | 在fruits表中,查询f_name字段值出现字母’x’至少2次的记录 |
1 | 例:在fruits表中,查询f_name字段值出现字符串“ba”最少1次,最多3次的记录 |
综合案例——数据表查询操作
数据表查询操作
SQL语句可以分为两部分,一部分用来创建数据库对象,另一部分用来操作这些对象,本章详细介绍了操作数据库对象的数据表查询语句。通过本章的介绍,读者可以了解到SQL中的查询语言功能的强大,用户可以根据需要灵活使用。本章的综合案例将回顾这些查询语句。
创建数据表employee和dept。
1 | CREATE TABLE dept |
employee表dept_no依赖于父表dept的主键d_no,因此需要先创建dept表,然后创建employee表。
1 | CREATE TABLE employee |
将指定记录分别插入两个表中。
1 | 向dept表中插入数据 |
向employee表中插入数据
1 | INSERT INTO employee |
查询操作
在employee表中,查询所有记录的e_no、e_name和e_salary字段值
1 | SELECT e_no, e_name, e_salary FROM employee; |
在employee表中,查询dept_no等于10和20的所有记录
1 | SELECT * FROM employee WHERE dept_no IN (10, 20); |
在employee表中,查询工资范围在800~2500之间的员工信息。
1 | SELECT * FROM employee WHERE e_salary BETWEEN 800 AND 2500; |
在employee表中,查询部门编号为20的部门中的员工信息
1 | SELECT * FROM employee WHERE dept_no = 20; |
在employee表中,查询每个部门最高工资的员工信息。
1 | SELECT dept_no, MAX(e_salary) FROM employee GROUP BY dept_no; |
查询员工BLAKE所在部门和部门所在地。
1 | SELECT d_name,d_no, d_location |
使用连接查询,查询所有员工的部门和部门信息。
1 | SELECT e_no, e_name, dept_no, d_name,d_location |
在employee表中,计算每个部门各有多少名员工。
用到GROUP BY分组1
SELECT dept_no, COUNT(*) FROM employee GROUP BY dept_no;
在employee表中,计算不同类型职工的总工资数。
用到GROUP BY分组1
SELECT e_job, SUM(e_salary) FROM employee GROUP BY e_job;
在employee表中,计算不同部门的平均工资。
用到GROUP BY分组1
SELECT dept_no, AVG(e_salary) FROM employee GROUP BY dept_no;
在employee表中,查询工资低于1500的员工信息。
1 | SELECT * FROM employee WHERE e_salary < 1500; |
在employee表中,将查询记录先按部门编号由高到低排列,再按员工工资由高到低排列。
1 | SELECT e_name,dept_no, e_salary |
在employee表中,查询员工姓名以字母’A’或’S’开头的员工的信息。
1 | SELECT * FROM employee WHERE e_name REGEXP '^[as]'; |
在employee表中,查询到目前为止,工龄大于等于10年的员工信息。
1 | SELECT * FROM employee where YEAR(CURDATE()) -YEAR(hireDate) >= 10; |
视图的操作
视图介绍
为什么使用视图
视图 VIEW:可实现查询简化,会提高安全性。
视图:一种虚拟表,不以存储数据值的形式存在,引用表中的数据,可提高数据库中数据的安全性。
Select语句的结果集构成视图所返回的虚拟表。
当数据表中的数据发生变化时,从视图中查询出来的数据也随之改变。
视图的作用
(1)将用户限定在数据表中的特定行上。如,只允许部门经理查看本部门的员工信息。
(2)将用户限定在特定列上。如可以让用户查看新闻的内容,但不允许用户查看新闻的发布者名字。
(3)将多个表中的列连接起来,使它们看起来像一个表,采用连接查询,用于报表的制作 。
(4)聚合信息而非提供详细信息。显示一个列的和,或者列的最大值和最小值。
视图的特点
(1)视图的列可来自于不同的表,是表的抽象和在逻辑意义上建立的新关系。
(2)视图由基本表(实表)产生的表(虚表)。
(3)视图的建立和删除不影响基本表。
(4)对视图内容的更新(添加、删除和修改)直接影响基本表。
(5)当视图来自多个基本表时,不允许添加和删除数据。
视图的优点
(1)数据保密。对不同的用户定义不同的视图,使用户只能看到与自己有关的数据。
(2)简化查询操作。为复杂的查询建立一个视图,用户不必输入复杂的查询语句,只需针对视图作简单的查询即可。
(3)保证数据的逻辑独立性。对于视图的操作,只依赖于视图的定义,当构成视图的数据表要修改时,只需修改视图定义中的子查询部分,而基于视图的查询不用改变。
视图的缺点
当更新视图中的数据时,是对数据表的数据进行更新。但,某些视图是不能更新数据的。这些视图有如下的特征:
(1)有UNION等集合操作符的视图。
(2)有GROUP BY子句的视图。
(3)有AVG、SUM或者MAX等函数的视图。
(4)使用DISTINCT短语的视图。
(5)连接表的视图。
视图的操作
创建视图
1 | CREATE VIEW 视图名 |
视图由视图名和视图定义两部分组成。
视图名不能和表名、其它视图名重名。
1 | 例1:创建查看普通用户的视图。 |
1 | 例2:创建二级部门的视图,使用check option选项,并在使用该选项前后插入一条一级部门的记录,观察发生的情况。 |
查看视图
1 | 1.显示表的名字和视图的名字 |
1 | 1.显示表的名字和视图的名字 |
1 |
|
修改视图
方法一:
(1)先删除视图
DROP VIEW 视图名;
(2)新建视图
CREATE VIEW 视图名 AS SELECT 字段名 FROM 表名
方法二:
(1)ALTER语句修改视图
ALTER VIEW 视图名 AS 查询
(2)查看视图
SELECT * FROM 视图名 ;
1 | 修改视图:ALTER VIEW 视图名 AS 查询 |
视图的更名
视图的更名:
视图创建之后,可以对其重新命名。在mysql中,视图被当作表看待,对视图的重命名就像对表的重命名一样。
Rename table 原视图名 to 新视图名
例:将视图tv_test重命名为tv_dep_1
Rename table tv_test to tv_dep_1;
删除视图
语法格式:DROP VIEW 视图名 [,视图名]…
举例:删除视图tv_test
Drop view tv_test;
利用视图操作基本表
通过视图检索基本表数据;
通过视图修改基本表中的数据;
检索(查询)数据
通过视图查询数据,比通过表进行查询更安全、更简单、实用。只需将表名换为视图名。
举例:SELECT * FROM 视图名
利用视图操作基本表数据
1、添加数据操作
INSERT INTO 视图名(字段名1,字段名2,…,字段n)VALUES(值1,值2,…,值n)
2、删除数据操作
DELETE FROM 视图名 WHERE 条件)
3、更新数据操作
UPDATE 视图名 SET 表达式 WHERE 条件
索引的操作
索引简介
索引的含义和特点
索引是一个单独的、存储在磁盘上的数据库结构,它们包含着对数据表里所有记录的引用指针。
索引的优点。
索引的缺点。
索引的好处是为了增加查询速度 建的不好的话会导致查询非常的慢
建立索引的好处
创建索引可以大大提高数据库系统的查询性能。
a) 通过创建唯一性索引
,可以保证数据库表中每一行数据的唯一性
。
b) 可以大大加快数据的检索速度
,这也是创建索 引的最主要的原因。
c) 可以加速表和表之间的连接
,特别是在实现数据的参考完整性方面特别有意义。
d) 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
。
e) 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
建立索引需要付出的代价
建立索引的目的是加快对表中记录的查找或排序。
a) 索引需要占物理空间
数据表占数据空间,每一个索引要占一定的物理空间,聚簇索引,需要的空间更大。
b) 创建索引和维护索引要耗费时间
这种时间随着数据量的增加而增加。
c)降低维护速度,降低了效率
当对表中的数据进行增加、删除和修改的时候,索引也要动态的维 护,这样就降低了数据的维护速度
索引的分类
普通索引和唯一索引
单列索引和组合索引
全文索引
空间索引
索引的设计原则
索引并非越多越好。
避免对经常更新的表进行过多的索引,并且索引中的列尽可能少。
数据量小的表最好不要使用索引。
在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。
当唯一性是某种数据本身的特征时,指定唯一索引
在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引
创建索引
创建表的时候创建索引
1 | 创建表时创建索引的基本语法格式如下: |
在已经存在的表上创建索引
1.使用ALTER TABLE语句创建索引
2.使用CREATE INDEX创建索引
建立数据库
1 | Create database test_db; |
1 | 例1:在book表中的year_publication字段上建立普通索引。(建表) |
1 | 例2:创建一个表t1,在表中的id字段上使用UNIQUE关键字创建唯一索引 |