精华内容
下载资源
问答
  • Oracle 建立索引及SQL优化 数据库索引: 索引有单列索引 复合索引之说 如何某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引。数据库索引主要进行提高访问速度。 建设原则...

    Oracle 建立索引及SQL优化

    数据库索引:

    索引有单列索引
    复合索引之说


    如何某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引。数据库索引主要进行提高访问速度。

    建设原则:

     1、索引应该经常建在Where 子句经常用到的列上。如果某个大表经常使用某个字段进行查询,并且检索行数小于总表行数的5%。则应该考虑。

     2、对于两表连接的字段,应该建立索引。如果经常在某表的一个字段进行Order By 则也经过进行索引。

     3、不应该在小表上建设索引。

    优缺点:
     1、索引主要进行提高数据的查询速度。 当进行DML时,会更新索引。因此索引越多,则DML越慢,其需要维护索引。 因此在创建索引及DML需要权衡。

    创建索引:
     单一索引:Create Index <Index-Name> On <Table_Name>(Column_Name);

     复合索引: Create Index i_deptno_job on emp(deptno,job); —>在emp表的deptno、job列建立索引。

      select * from emp where deptno=66 and job='sals' ->走索引。

      select * from emp where deptno=66 OR job='sals' ->将进行全表扫描。不走索引

      select * from emp where deptno=66 ->走索引。

      select * from emp where job='sals' ->进行全表扫描、不走索引。

      如果在where 子句中有OR 操作符或单独引用Job 列(索引列的后面列) 则将不会走索引,将会进行全表扫描。

     


    Sql 优化:

    当Oracle数据库拿到SQL语句时,其会根据查询优化器分析该语句,并根据分析结果生成查询执行计划。
    也就是说,数据库是执行的查询计划,而不是Sql语句。
    查询优化器有rule-based-optimizer(基于规则的查询优化器) 和Cost-Based-optimizer(基于成本的查询优化器)。
    其中基于规则的查询优化器在10g版本中消失。
    对于规则查询,其最后查询的是全表扫描。而CBO则会根据统计信息进行最后的选择。


    1、先执行From ->Where ->Group By->Order By

    2、执行From 字句是从右往左进行执行。因此必须选择记录条数最少的表放在右边。这是为什么呢?  

    3、对于Where字句其执行顺序是从后向前执行、因此可以过滤最大数量记录的条件必须写在Where子句的末尾,而对于多表之间的连接,则写在之前。
    因为这样进行连接时,可以去掉大多不重复的项。  

    4. SELECT子句中避免使用(*)ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间

    5、索引失效的情况:
     ① Not Null/Null 如果某列建立索引,当进行Select * from emp where depto is not null/is null。 则会是索引失效。
     ② 索引列上不要使用函数,SELECT Col FROM tbl WHERE substr(name ,1 ,3 ) = 'ABC' 
    或者SELECT Col FROM tbl WHERE name LIKE '%ABC%' 而SELECT Col FROM tbl WHERE name LIKE 'ABC%' 会使用索引。

     ③ 索引列上不能进行计算SELECT Col FROM tbl WHERE col / 10 > 10 则会使索引失效,应该改成
    SELECT Col FROM tbl WHERE col > 10 * 10

     ④ 索引列上不要使用NOT ( != 、 <> )如:SELECT Col FROM tbl WHERE col ! = 10 
    应该 改成:SELECT Col FROM tbl WHERE col > 10 OR col < 10 。

    6、用UNION替换OR(适用于索引列)
      union:是将两个查询的结果集进行追加在一起,它不会引起列的变化。 由于是追加操作,需要两个结果集的列数应该是相关的,
    并且相应列的数据类型也应该相当的。union 返回两个结果集,同时将两个结果集重复的项进行消除。 如果不进行消除,用UNOIN ALL.

    通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 
    如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引.

      高效:
      SELECT LOC_ID , LOC_DESC , REGION
      FROM LOCATION
      WHERE LOC_ID = 10
      UNION
      SELECT LOC_ID , LOC_DESC , REGION
      FROM LOCATION
      WHERE REGION = “MELBOURNE”

      低效:
      SELECT LOC_ID , LOC_DESC , REGION
      FROM LOCATION
      WHERE LOC_ID = 10 OR REGION = “MELBOURNE”
      如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.

    7. 用EXISTS替代IN、用NOT EXISTS替代NOT IN
    在许多基于基础表的查询中, 为了满足一个条件, 往往需要对另一个表进行联接. 在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 
    在子查询中, NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下, NOT IN都是最低效的(因为它对子查询中的表执行了一个全表遍历). 
    为了避免使用NOT IN, 我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.

    例子:

    高效: SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X’ FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB’)

    低效: SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB’)

    展开全文
  • MySQL创建数据库和创建数据表

    万次阅读 多人点赞 2019-10-20 23:44:40
    MySQL 创建数据库和创建数据表 MySQL 是最常用的数据库,在数据库操作中,基本都是增删改查操作,简称CRUD。 在这之前,需要先安装好 MySQL ,然后创建好数据库、数据表、操作用户。 一、数据库操作语言 数据库...

    MySQL 创建数据库和创建数据表

    MySQL 是最常用的数据库,在数据库操作中,基本都是增删改查操作,简称CRUD。

    在这之前,需要先安装好 MySQL ,然后创建好数据库、数据表、操作用户。

    一、数据库操作语言

    数据库在操作时,需要使用专门的数据库操作规则和语法,这个语法就是 SQL(Structured Query Language) 结构化查询语言。

    SQL 的主要功能是和数据库建立连接,进行增删改查的操作。SQL是关系型数据库管理系统的标准语言。

    SQL 语言的作用:

    1. 数据定义语言 DDL(Data Definition Language) 。用于创建数据库,数据表。

    2. 数据操作语言 DML(Data Manipulation Language) 。用于从数据表中插入、修改、删除数据。

    3. 数据查询语言 DQL(Data Query Language) 。用于从数据表中查询数据。

    4. 数据控制语言 DCL(Data Control Language) 。用来设置或修改数据库用户或角色的权限。

    使用 SQL 操作数据库时,所有的 SQL 语句都以分号结束。(切换数据库时可以不用分号)

    在 SQL 语句中,不区分大小写,编写 SQL 语句时可以根据情况用大小写的区别来增加可读性。

    二、创建数据库

    1. 连接 MySQL

    输入 mysql -u root -p 命令,回车,然后输入 MySQL 的密码(不要忘记了密码),再回车,就连接上 MySQL 了。

    mysql -u root -p

    最初,都是使用 root 用户登录,工作中如果一直用 root 用户登录,因为权限太大,风险是很大的,所以等创建好权限适合的用户后,就不要经常登录 root 用户了。

    2. 查看当前的数据库

    使用 show databases; 查看当前安装的 MySQL 中有哪些数据库。

    show databases;

    刚安装 MySQL 时,默认有四个数据库,information_schema,mysql,perfomance_schema,sys 。通常情况下,我们不会直接使用这四个数据库,但千万不要把这四个数据库删了,否则会带来很多不必要的麻烦。如果不小心删了,建议是重新安装 MySQL ,在重装之前把自己的数据迁移出来备份好,或者从其他服务器上迁移一个相同的数据库过来。

    3. 创建数据库

    使用 create database 数据库名; 创建数据库。

    create database MyDB_one;

    创建数据库成功后,数据库的数量变成了5个,多了刚才创建的 MyDB_one 。

    4. 创建数据库时设置字符编码

    使用 create database 数据库名 character set utf8; 创建数据库并设置数据库的字符编码。

    create database MyDB_two character set utf8;
    

    直接创建的数据库,数据库的编码方式是 MySQL 默认的编码方式 latin1 (单字节编码) ,通常我们会在数据库中存放中文数据,所以最好把数据库的编码方式设置成 utf-8 ,这样中文才能正常显示。

    create database MyDB_three charset utf8;

    character set 可以缩写成 charset ,效果是一样的。

    5. 查看和显示数据库的编码方式

    使用 show create database 数据库名; 显示数据库的创建信息。

    show create database MyDB_one;
    show create database MyDB_two;

    如果不知道一个数据库的编码方式是什么,可以使用 show create database 数据库名 来查看数据库的编码方式。可以看到刚才创建的 MyDB_one 的编码方式是 MySQL 的默认编码 latin1 ,MyDB_two 的编码方式是 utf-8 。

    当然,这种方式不能在创建的同时显示,只能查看一个已经存在的数据库的编码方式。

    6. 使用 alter database 数据库名 character set utf8; 修改数据库编码

    alter database MyDB_one character set utf8;

    如果一个数据库的编码方式不符合使用需求,可以进行修改。刚才创建的 MyDB_one 经过修改后,编码方式也变成了 utf-8 。

    7. 进入或切换数据库

    使用 use 数据库名 进入或切换数据库。

    use MyDB_one
    use MyDB_two;

    刚连接上 MySQL 时,没有处于任何一个数据库中,如果要使用某一个数据库,就需要进入到这个数据库中。

    use 数据库名 这个命令后面的分号可以省略,这是 SQL 语句中唯一可以省略分号的语句。

    8. 显示当前数据库 select database();

    select database();

    进入数据库中,可以使用 select database(); 来查看当前处于哪个数据库中。长时间操作数据库时,在很多数据库中来回切换后,查看当前的数据库,避免操作错了数据库。

    三、创建数据表

    1. 查看当前数据库中的表

    使用 show tables;查看当前数据库中有哪些表。

    show tables;
    

    在刚才创建的数据库 MyDB_one 中,还没有创建任何表,所以当前是空的。

    2. 创建表

    使用 create table 表名(字段1 字段类型,字段2 字段类型,字段3 字段类型,…); 来创建一张表。

    create table Phone_table(pid INT, name CHAR(20), price INT);

    在 MyDB_one 中创建了一个叫 Phone_table 的数据表,这张表有三个字段 pid,name,price 。为了增加 SQL 的可读性,字段名我用的是小写,字段类型用大写。

    3. 显示表信息

    用 show create table 表名; 来显示已创建的表的信息。

    show create table Phone_table;

    使用 show create table 表名;  可以显示表的字段信息, MySQL 的引擎,和默认的字符编码等信息。与显示数据库信息一样,show 只能显示已经创建了的数据表的信息,不能在创建的同时显示信息。

    如果想更好地展示表的字段信息,可以使用 desc 表名; 来显示表的字段信息。

    4. 给表增加字段

    使用 alter table 表名 add 字段名 数据类型; 为已存在的表添加一个新字段。

    alter table Phone_table add color CHAR(20);

    添加后,刚才的表中多了一个字段,新增成功。

    5. 删除表的字段

    使用 alter table 表名 drop 字段名; 删除一个表中已存在的字段。

    alter table Phone_table drop price;

    删除字段后,表中不再有该字段。

    6. 修改字段的数据类型

    使用 alter table 表名 modify 字段名 数据类型; 修改表中现有字段的数据类型。

    alter table Phone_table modify name VARCHAR(12);

    修改之后,该字段的数据类型发生改变。

    7. 修改字段的数据类型并且改名

    使用 alter table 表名 change 原字段名 新字段名 数据类型; 修改表中现有字段的字段名和类型。

    alter table Phone_table change name pname CHAR(18);

    现在,将表的 name 改成了 pname ,同时修改了 pname 的数据类型。

    四、MySQL 常用字段类型

    一个数据表是由若干个字段组成的,一个表十几个字段也很正常,每个字段表示不同的信息,需要使用不同类型的数据。

    所以在创建表的时候,要为每个字段指定适合的数据类型。

    MySQL 中常用的字段类型有以下这些:

    1. 整数类型

    数据类型数据范围
    TINYINT-128 -- 127
    SMALLINT-32768 -- 32767
    MEDIUMINT-2^23 -- 2^23-1
    INT-2^31 -- 2^31-1
    BIGINT-2^63 -- 2^63-1

    2. 字符串类型

    数据类型字节范围用途
    CHAR(n)0 -- 255字节定长字符串
    VARCHAR(n)0 -- 65535字节变长字符串
    TEXT0 -- 65535字节长文本数据
    LONGTEXT0 -- 2^32-1字节极大文本数据
    BLOB0 -- 65535字节二进制长文本数据
    LONGBLOB0 -- 2^32-1字节二进制极大文本数据

    3. 小数类型

    m 表示浮点数的总长度,n 表示小数点后有效位数。

    数据类型数据用法数据范围
    FloatFloat(m,n)7位有效数
    DoubleDouble(m,n)15位有效数
    DecimalDecimal(m,n)28位有效数

    4. 时间类型

    数据类型格式用途
    DATEYYYY-MM-DD日期
    TIMEHH:MM:SS时间
    YEARYYYY年份
    DATETIMEYYYY-MM-DD HH:MM:SS日期和时间
    TIMESTAMP10位或13位整数(秒数)时间戳

    5. 枚举类型

    enum(枚举值1,枚举值2,...)

    枚举类型只能在列出的值中选择一个,如性别。

     

     

    展开全文
  • SQL语句 创建表、模式、索引

    千次阅读 2020-04-10 11:16:45
    一、数据定义语句 一、 数据定义: 操作对象 创建 删除 修改 模式 CREATE SCHEMA DROP ~ 表 CREATE TABLE DROP ~ ALTER TABLE 视图 CREATE VIEW DROP VIEW 索引 CREATE INDEX DROP INDEX ALTER ...

    一、数据定义语句

    一、 数据定义:

    操作对象创建删除修改
    模式CREATE SCHEMADROP ~
    CREATE TABLEDROP ~ALTER TABLE
    视图CREATE VIEWDROP VIEW
    索引CREATE INDEXDROP INDEXALTER INDEX
    • 一个数据库中可以建立多个模式,一个模式下通常包括多个表、视图和索引等数据库对象。(什么是索引???)

    二、数据字典
    数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有对象的定义信息以及一些统计信息:

    • 关系模式、表、视图、索引的定义
    • 完整性约束的定义
    • 各类用户对数据库的操作权限
    • 统计信息
      关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典表中的相应信息。(数据字典怎么查看??????)

    三、创建表

    1. 创建表
    【例3.1】建立“学生”表Student。学号是主码,姓名取值唯一。

    CREATE TABLE Student
    (Sno CHAR(9) PRIMARY KEY,   // 列级完整性约束条件,Sno是主码
    Sname CHAR(20) unique,		// Sname取唯一值  UNIQUE约束
    Ssex CHAR(2),
    Sage SMALLINT,
    Sdept CHAR(20)
    );
    

    【例3.2】建立一个“课程”表Course

    CREATE TABLE Course
    (Cno CHAR(4) PRIMARY KEY,
    Cname CHAR(40),
    Cpno CHAR(4),
    Ccredit SMALLINTFOREIGN KEY (Cpno)	REFERENCES Course(Cno)    //Cpno是外码,被参照的是Course表,被参照的列是cno
    );
    

    【例3.3】建立一个学生选课表SC

    CREATE TABLE SC(
    Sno CHAR(9),
    Cno CHAR(4),
    Grade SMALLINT,
    			//主码由两个属性构成,必须作为表级完整性进行定义
    PRIMARY KEY (Sno,Cno),
    			//表级完整性约束条件,Sno是外码,被参照表示Student
    FOREIGN KEY (Sno)REFERENCES Student(Sno)
       			//表级完整性越是条件,Cno是外码,被参照表示Course
    FOREIGN KEY (Cno)REFERENCES Course(Cno)
    )
    

    四、模式的创建于删除

    一、模式的创建

    • CREATE SCHEMA <模式名> AUTHORIZATION <用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>]
    • 定义模式实际上定义了一个命名空间(或者说是目录)
    • 在这个空间中可以定义该模式包含的数据库对象,例如基本表、视图、索引等。
    • 在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句。(啥是GRANT子句?)

    【例题3.1】为用户WANG定义一个学生-课程模式S-T

    CREATE SCHEMA "S-T" AUTHORIZATION WANG;	
    

    【例题3.2】为用户ZHANG创建了一个模式TEST,并且在其中定义一个表TABE1

    CREATE SCHEMA TEST AUTHORIZATION ZHANG
    CREATE TABLE TABE1 ( COL1 SMALLINT,
    COL2 INT,
    COL3 CHAR(20),
    COL4 NUMERIC(10,3),
    COL5 DECIMAL(5,2)
    );
    

    二、模式的删除
    DROP SCHEMA <模式名> <CASCADE|RESTRICT>

    • CASCADE(级联)
      • 删除模式的同事把该模式中所有的数据库对象全部删除
    • RESTRICT(限制)
      • 如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行

    【例3.3】删除模式ZHANG,同时该模式中定义的表TABE1也被删除

    DROP SCHEMA ZHANG CASCADE
    

    五、修改基本表

    ALTER TABLE <表名>
    [ADD[COLUMN] <新列名> <数据类型> [ 完整性约束 ] ]
    [ADD <表级完整性约束>]
    [DROP [ COLUMN ] <列名> [CASCADE| RESTRICT] ]
    [DROP CONSTRAINT<完整性约束名>[ RESTRICT | CASCADE ] ]
    [ALTER COLUMN <列名><数据类型> ]   
    

    <表名>是要修改的基本表
    ADD子句用于增加新列、新的列级完整性约束条件和新的表级完整
    性约束条件
    DROP COLUMN子句用于删除表中的列
     如果指定了CASCADE短语,则自动删除引用了该列的其他对象
     如果指定了RESTRICT短语,则如果该列被其他对象引用,关系数据库
    管理系统将拒绝删除该列
    DROP CONSTRAINT子句用于删除指定的完整性约束条件
    ALTER COLUMN子句用于修改原有的列定义,包括修改列名和数据
    类型
    【例5.1】向Student表增加“入学时间”列,其数据类型为日期型

    ALTER TABLE Student ADD S_entrance DATE;  //这里可以顺便加个完整性约束
    

    【例5.2】将Student 的年龄的数据类型由字符型(假设原来的数据类型是字符型)改为整数。

    ALTER TABLE Student ALTER COLUMN Sage INT;
    

    【例5.3】增加课程名称必须取唯一值得约束条件。

    ALTER TABLE Course ADD UNIQUE(Cname)
    

    六、删除基本表

    DROP TABLE<表名> [RESTRICT| CASCADE]
    【例6.1】删除Student表

    DROP TABLE Student CASCADE;  //级联删除
    		//表的定义被删除,数据被删除。
    		//表上建立的索引、视图、触发器也一并被删除
    

    七、索引

    一、索引的概念

    • 建立索引的目的:加快查询速度
    • 关系数据库管理系统中常见的索引:
      1. 顺序文件上的索引
      2. B+树索引 (参见爱课程网3.2节动画《B+树的增删改》) //具有动态平衡的优点 ?????????????
      3. 散列(hash)索引 //HASH索引具有查找速度快的特点
      4. 位图索引
    • 聚集索引和非聚集索引的区别
      https://blog.csdn.net/jiadajing267/article/details/54581262
      https://www.cnblogs.com/hyd1213126/p/5828937.html
      二、建立索引
      语句格式
      CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
      ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
       <表名>:要建索引的基本表的名字
       索引:可以建立在该表的一列或多列上,各列名之间用逗号分隔
       <次序>:指定索引值的排列次序,升序:ASC,降序:DESC。缺省
      值:ASC
      UNIQUE:此索引的每一个索引值只对应唯一的数据记录
      CLUSTER:表示要建立的索引是聚簇索引

    【例7.1】为学生-课程数据库中的Student,Course,SC三个表建立索引。Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引:

    CREATE UNIQUE INDEX Stusno ON Student(Sno);
    CREATE UNIQUE INDEX Coucno ON Course(Cno);
    CREATE UNIQUE INDEX SCno ON SC(Sno ASC , Cno DEC);
    

    三、删除索引

    DROP INDEX <索引名> on <表名>;
    
    展开全文
  • 9、创建索引(CREATE INDEX)

    千次阅读 2020-10-16 09:58:46
    可以使用专门用于创建索引的 CREATE INDEX 语句在一个已有的表上创建索引,但该语句不能创建主键。 语法格式: CREATE <索引名> ON <表名> (<列名> [<长度>] [ ASC | DESC]) 语法说明如下...

    创建索引是指在某个表的一列或多列上建立一个索引,可以提高对表的访问速度。创建索引对 MySQL 数据库的高效运行来说是很重要的。
    基本语法

    MySQL 提供了三种创建索引的方法:

    1) 使用 CREATE INDEX 语句

    可以使用专门用于创建索引的 CREATE INDEX 语句在一个已有的表上创建索引,但该语句不能创建主键。

    语法格式:

    CREATE <索引名> ON <表名> (<列名> [<长度>] [ ASC | DESC])
    

    语法说明如下:

    • <索引名>:指定索引名。一个表可以创建多个索引,但每个索引在该表中的名称是唯一的。
    • <表名>:指定要创建索引的表名。
    • <列名>:指定要创建索引的列名。通常可以考虑将查询语句中在 JOIN 子句和 WHERE 子句里经常出现的列作为索引列。
    • <长度>:可选项。指定使用列前的 length个字符来创建索引。使用列的一部分创建索引有利于减小索引文件的大小,节省索引列所占的空间。在某些情况下,只能对列的前缀进行索引。索引列的长度有一个最大上限255 个字节(MyISAM 和 InnoDB 表的最大上限为 1000个字节),如果索引列的长度超过了这个上限,就只能用列的前缀进行索引。另外,BLOB 或 TEXT 类型的列也必须使用前缀索引。
    • ASC|DESC:可选项。ASC指定索引按照升序来排列,DESC指定索引按照降序来排列,默认为ASC。

    2) 使用 CREATE TABLE 语句

    索引也可以在创建表(CREATE TABLE)的同时创建。在 CREATE TABLE 语句中添加以下语句。语法格式:

    CONSTRAINT PRIMARY KEY [索引类型] (<列名>,)
    

    在 CREATE TABLE 语句中添加此语句,表示在创建新表的同时创建该表的主键

    语法格式:

    KEY | INDEX [<索引名>] [<索引类型>] (<列名>,)
    

    在 CREATE TABLE 语句中添加此语句,表示在创建新表的同时创建该表的索引。

    语法格式:

    UNIQUE [ INDEX | KEY] [<索引名>] [<索引类型>] (<列名>,)
    

    在 CREATE TABLE 语句中添加此语句,表示在创建新表的同时创建该表的唯一性索引

    语法格式:

    FOREIGN KEY <索引名> <列名>
    

    在 CREATE TABLE 语句中添加此语句,表示在创建新表的同时创建该表的外键。

    在使用 CREATE TABLE 语句定义列选项的时候,可以通过直接在某个列定义后面添加 PRIMARY KEY 的方式创建主键。而当主键是由多个列组成的多列索引时,则不能使用这种方法,只能用在语句的最后加上一个 PRIMARY KRY(<列名>,…) 子句的方式来实现。

    3) 使用 ALTER TABLE 语句

    CREATE INDEX 语句可以在一个已有的表上创建索引,ALTER TABLE 语句也可以在一个已有的表上创建索引。在使用 ALTER TABLE 语句修改表的同时,可以向已有的表添加索引。具体的做法是在 ALTER TABLE 语句中添加以下语法成分的某一项或几项。

    语法格式:

    ADD INDEX [<索引名>] [<索引类型>] (<列名>,)
    

    在 ALTER TABLE 语句中添加此语法成分,表示在修改表的同时为该表添加索引。

    语法格式:

    ADD PRIMARY KEY [<索引类型>] (<列名>,)
    

    在 ALTER TABLE 语句中添加此语法成分,表示在修改表的同时为该表添加主键。

    语法格式:

    ADD UNIQUE [ INDEX | KEY] [<索引名>] [<索引类型>] (<列名>,)
    

    在 ALTER TABLE 语句中添加此语法成分,表示在修改表的同时为该表添加唯一性索引。

    语法格式:

    ADD FOREIGN KEY [<索引名>] (<列名>,)
    

    在 ALTER TABLE 语句中添加此语法成分,表示在修改表的同时为该表添加外键。

    创建普通索引

    创建普通索引时,通常使用 INDEX 关键字。
    例 1
    创建一个表 tb_stu_info,在该表的 height 字段创建普通索引。输入的 SQL 语句和执行过程如下所示。

    mysql> CREATE TABLE tb_stu_info
        -> (
        -> id INT NOT NULL,
        -> name CHAR(45) DEFAULT NULL,
        -> dept_id INT DEFAULT NULL,
        -> age INT DEFAULT NULL,
        -> height INT DEFAULT NULL,
        -> INDEX(height)
        -> );
    
    mysql> SHOW CREATE TABLE tb_stu_info\G
    *************************** 1. row ***************************
           Table: tb_stu_info
    Create Table: CREATE TABLE `tb_stu_info` (
      `id` int(11) NOT NULL,
      `name` char(45) DEFAULT NULL,
      `dept_id` int(11) DEFAULT NULL,
      `age` int(11) DEFAULT NULL,
      `height` int(11) DEFAULT NULL,
      KEY `height` (`height`)
    ) ENGINE=InnoDB DEFAULT CHARSET=gb2312
    

    创建唯一索引

    创建唯一索引,通常使用 UNIQUE 参数。

    例 2
    创建一个表 tb_stu_info2,在该表的 id 字段上使用 UNIQUE 关键字创建唯一索引。输入的 SQL 语句和执行过程如下所示。

    mysql> CREATE TABLE tb_stu_info2
        -> (
        -> id INT NOT NULL,
        -> name CHAR(45) DEFAULT NULL,
        -> dept_id INT DEFAULT NULL,
        -> age INT DEFAULT NULL,
        -> height INT DEFAULT NULL,
        -> UNIQUE INDEX(height)
        -> );
    
    mysql> SHOW CREATE TABLE tb_stu_info2\G
    *************************** 1. row ***************************
           Table: tb_stu_info2
    Create Table: CREATE TABLE `tb_stu_info2` (
      `id` int(11) NOT NULL,
      `name` char(45) DEFAULT NULL,
      `dept_id` int(11) DEFAULT NULL,
      `age` int(11) DEFAULT NULL,
      `height` int(11) DEFAULT NULL,
      UNIQUE KEY `height` (`height`)
    ) ENGINE=InnoDB DEFAULT CHARSET=gb2312
    
    展开全文
  • 我们通常的做法都是通过export with rows=no来得到,但它的输出因为格式的问题并不能直接拿来。而另一种方法就是写复杂的脚本来查询数据字典,但这对于一稍微复杂的对象,如IOT和嵌套表等,还是无法查到。 从...
  • 一、可以创建多个索引嘛? 可以创建多个索引的。 需要开发人员根据实际的用途以及数据库中记录的情况,来进行判断。 通常来说,表的索引越多,其查询的速度也就越快。但是,表的insert/update速度则会降低。这主要是...
  • 创建索引的语法

    千次阅读 2018-09-28 19:59:08
    首先创建一个表:create table t1 (id int primary key,username varchar(20),password varchar(20)); 创建单个索引的语法:...例如:给id创建索引:CREATE INDEX t1_id on t1(id); 创建联合索引的语法:CREATE IN...
  • MySQL 面试题

    万次阅读 多人点赞 2019-09-02 16:03:33
    索引。 锁。 事务和隔离级别。 因为 MySQL 还会有部分内容和运维相关度比较高,所以本文我们分成两部分【开发】【运维】两部分。 对于【开发】部分,我们需要掌握。 对于【运维】部分,更多考验开发的知识储备情况...
  • 我们通常的做法都是通过export with rows=no来得到,但它的输出因为格式的问题并不能直接拿来。而另一种方法就是写复杂的脚本来查询数据字典,但这对于一稍微复杂的对象,如IOT和嵌套表等,还是无法查到。 从...
  • 数据库索引:索引有单列索引复合索引之说如何某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引。数据库索引主要进行提高访问速度。建设原则: 1、索引应该经常建在Where 子句...
  • mysql面试题

    千次阅读 2019-09-23 12:28:36
    如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该关键字UNIQUE把它定义为一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一性。   主键,是一种特殊的唯一索引,在...
  • 面试 SQL整理 常见的SQL面试题:经典50题

    万次阅读 多人点赞 2019-09-12 22:16:11
    索引:提高查询效率 --自动创建:Oracle 会为具有唯一约束(唯一约束,主键约束)的列,自动创建索引 create table emp2( id number(10) primary key, name varchar2(30) ) --手动创建 create index emp_idx on emp2...
  • 创建索引原则及SQL添加索引

    万次阅读 2018-08-14 10:40:07
    检查自己的sql语句,为那些频繁在where子句中出现的字段建立索引。  3.尝试建立复合索引来进一步提高系统性能。修改复合索引将消耗更长时间,同时,复合索引也占磁盘空间。  4.对于小型的表,建立索引可能会影响...
  • mongodb创建索引及索引优化效率案例

    千次阅读 2018-10-22 11:26:43
    语法: db.collection.createIndex...创建索引示例: 单键唯一索引:db.users. createIndex({username :1},{unique:true}); 单键唯一稀疏索引:db.users. createIndex({username :1},{unique:true,sparse:true});...
  • MySQL 创建索引和索引效率验证

    千次阅读 2019-10-27 17:41:44
    MySQL 创建索引和索引效率验证 对于一张存储数据的表来说,通常来说数据量会很大。 项目中总会有一些表数据量非常大,并且在使用过程中,需要频繁地到这些表中查询数据。 数据量大的时候,查询速度会明显变慢,这...
  • 数据库面试

    千次阅读 多人点赞 2019-02-13 09:03:42
    索引可以是唯一的,创建索引允许指定单个列或者是多个列。 缺点:它减慢了数据录入和修改的速度,同时索引也会占用一定的存储资源,因此我们在建索引的时候需要斟酌。 6. 维护数据库的完整性和一致性,你喜欢...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    -n:防止sync系统调用,它fsck修补根分区之后,以阻止内核老版本的超级块覆盖修补过的超级块。 -w:并不是真正的重启或关机,只是写wtmp(/var/log/wtmp)纪录。 -f:没有调用shutdown,而强制关机或...
  • MATLAB教程(1) MATLAB 基础知识

    万次阅读 多人点赞 2017-10-26 20:57:32
    3D图像通常用有两个参数的函数来定义一个曲面,z = f(x,y) 。 对于z,首先使用meshgrid命令在函数定义域内创建若干(x,y)。 这里需要注意的是,在matlab中,.2代表0.2 (-2:.2:2)表示在-2到2的区间上以0.2...
  • 数据库面试题

    千次阅读 多人点赞 2018-05-24 10:46:20
    1.什么是存储过程?什么来调用? 存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要...
  • SQLServer索引管理——索引创建建议和经验 索引创建的建议 检查WHERE语句和JOIN关联列 使用窄索引 检查列的唯一值(基数) 考虑列的顺序 考虑索引类型(行索引 VS.列索引;聚集索引VS非...
  • 如何在SQL创建索引

    千次阅读 2019-10-30 19:34:56
    我们通过一个简单的例子来开始教程,解释为什么我们需要数据库索引。假设我们有一个数据库表 Employee, 这个表有三个字段(列)分别是 Employee_Name、Employee_Age 和Employee_Address。假设表Employee 有上千行...
  • MySQL索引创建与使用

    万次阅读 多人点赞 2018-08-06 18:49:59
    声明:本人主要简单示例MySQL中的单列索引、组合索引创建与使用。 索引创建: 建表时创建: CREATE TABLE 表名( 字段名 数据类型 [完整性约束条件], ……, [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY ...
  • Oracle中索引创建和使用

    万次阅读 2016-09-07 13:38:39
    创建索引的作用 1、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 2、可以大大加快数据的检索速度,这也是创建索引的最主要的原因。 3、可以加速表和表之间的连接,特别是在实现数据的参考完整性...
  • 【数据库学习】数据库总结

    万次阅读 多人点赞 2018-07-26 13:26:41
    ),视图中不能创建索引,但视图可以基于索引生成 。 C.场景 重用SQL语句; 简化复杂SQL操作(生成视图),重用查询且不需要知道基本查询细节。 保护数据。用户有表的部分权限。 更改数据格式和表示。视图可返回与...
  • Python 元组详解

    千次阅读 多人点赞 2019-08-31 14:19:05
    文章目录Python 元组详解1、元组的定义2、元组的创建3、访问元组中的值4、更新元组5、删除元组元素6、基本元组操作7、索引,切片和矩阵8、元组 循环遍历9、 元组应用场景10、元组和格式化字符串11、元组和列表之间的...
  • mysql如何给列创建索引

    千次阅读 2017-08-25 16:25:19
    前些时候,一位颇高级的程序员居然问我什么叫做索引,令我感到十分的惊奇,我想这绝不会是沧海一粟,因为有成千上万的开发者(可能大部分是使用MySQL的)都没有受过有关数据库的正规培训,尽管他们都为客户做过一些...
  • 索引什么,有什么用,怎么

    万次阅读 2016-12-27 16:56:51
    一、索引什么 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(B树)中,使 SQL Server 可以快速有效地查找与键值...
  • SQL岗位30个面试题,SQL面试问题及答案

    万次阅读 多人点赞 2019-06-19 17:42:34
    什么是SQL? SQL(结构化查询语言)是一种设计用于检索和操作数据的数据库。它属于美国国家标准协会(ANSI)的一种标准,可用于执行Select(选择)、Update(更新)、Delete(删除)和Insert(插入)等数据任务。 ...
  • MySQL创建索引需要注意的地方

    千次阅读 2018-01-14 17:00:45
    索引:提高数据查询的速度,一般创建索引的列为很少改动的列。 1、例句: select * from user where userId = '123456789'; userId很少改变且是唯一值,可以对userID创建索引; 2、例句:select * from user ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 185,303
精华内容 74,121
关键字:

创建索引通常是用什么语句