MySQL数据库基础-全网最详细-程序员宅基地

技术标签: 程序员  mysql  数据库  

– 查询成绩表

SELECT * FROM result;

– 查询成绩表中的学号,及查询哪些同学参加了考试(有成绩的学生)

SELECT studentno FROM result;

– 根据学号去重

SELECT DISTINCT studentno FROM result;

使用表达式的列

数据库中的表达式:一般由文本、列值、null、函数和操作符组成

应用场景:

  • SELECT语句中返回结果列中使用

  • SELECT语句中ORDER BY ,HAVING等子句使用

  • DML语句中的where条件语句中使用的表达式

– selcet查询中可以使用表达式

SELECT @@auto_increment_increment; – 查询自增步长

SELECT VERSION(); – 查询版本号

SELECT 88*3-1 AS 计算结果; – 表达式

– 学员考试成绩集体提分一分查看

SELECT studentno,studentresult+1 AS ‘分数加1’ FROM result;

3、where条件语句


作用:

  • 用于检索数据表中符合条件的记录

搜索的条件可以由一个或者多个逻辑表达式组成,结果一般为真或假

逻辑操作符

| 运算符号 | 作用 |

| :-- | :-- |

| NOT 或 ! | 逻辑非 |

| AND | 逻辑与 |

| OR | 逻辑或 |

| XOR | 逻辑异或 |

– 指定字段全表

SELECT Studentno,StudentResult FROM result;

– 查询成绩在95-100之间的 ADN 也可以写成 &&

SELECT studentno,studentresult

FROM result

WHERE studentresult >=95 AND studentresult <=100;

– 模糊查询(对应的词:精确查询)

SELECT studentno,studentresult

FROM result

WHERE studentresult BETWEEN 95 AND 100;

– 除了888号同学,要其他同学的成绩

SELECT studentno,studentresult

FROM result

WHERE studentno != 888

– 除了888号同学,要其他同学的成绩 使用not

SELECT studentno,studentresult

FROM result

WHERE NOT studentno = 888

算术运算符

| 运算符 | 作用 |

| :-- | :-- |

| + | 加法 |

| - | 减法 |

| * | 乘法 |

| / 或 DIV | 除法 |

| % 或 MOD | 取余 |

比较操作符

| | | |

| :-- | :-- | :-- |

| 符号 | 描述 | 备注 |

| = | 等于 | |

| <>, != | 不等于 | |

| > | 大于 | |

| < | 小于 | |

| <= | 小于等于 | |

| >= | 大于等于 | |

| BETWEEN | 在两值之间 | >=min&&<=max |

| NOT BETWEEN | 不在两值之间 | |

| IN | 在集合中 | |

| NOT IN | 不在集合中 | |

| <=> | 严格比较两个NULL值是否相等 | 两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0 |

| LIKE | 模糊匹配 | |

| REGEXP 或 RLIKE | 正则式匹配 | |

| IS NULL | 为空 | |

| IS NOT NULL | 不为空 | |

注意:

  • 数值类型之间才能使用算术运算符

  • 相同的数据类型之间才能比较

– 模糊查询 between and \ like \ in \ null

– LIKE

– like结合使用的通配符 : % (代表0到任意个字符) _ (一个字符)

– 查询姓李的同学的学号及姓名

SELECT studentno, studentname FROM student

WHERE studentname LIKE ‘李%’;

– 查询姓李的同学,后面只有一个字的 _ (一个字符)

SELECT studentno,studentname FROM student

WHERE studentname LIKE ‘李_’;

– 查询姓李的同学,后面只有两个字的 _ (一个字符)

SELECT studentno,studentname FROM student

WHERE studentname LIKE ‘李__’;

– 查询姓名中含有 捌 字的

SELECT studentno,studentname FROM student

WHERE studentname LIKE ‘%捌%’;

– 查询姓名中含有特殊字符的需要使用转义符号 ‘’

– 自定义转义符关键字: ESCAPE ‘:’

– IN

– 查询学号为1000,1001,1002的学生姓名

SELECT studentno,studentname FROM student

WHERE studentno IN (1000,1001,1002);

– 查询地址在深圳,长沙,娄底的学生

SELECT studentno,studentname,address FROM student

WHERE address IN (‘深圳’,‘长沙’,‘娄底’);

– NULL

– 查询出生日期没有填写的同学

– 不能直接写=NULL , 这是代表错误的 , 用 is null

SELECT studentname FROM student

WHERE BornDate IS NULL;

– 查询出生日期填写的同学

SELECT studentname FROM student

WHERE BornDate IS NOT NULL;

– 查询没有写家庭住址的同学(空字符串不等于null)

SELECT studentname FROM student

WHERE Address=‘’ OR Address IS NULL;

4、连接查询


| 操作符名称 | 描述 |

| — | — |

| INNER JOIN | 如果表中至少一个匹配,则返回 |

| LEFT JOIN | 返回左表的所有行,右表匹配行 |

| RIGHT JOIN | 返回右表的所有行,左表匹配行 |

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LQR1TnC2-1622729395022)(C:\Users\Leon Plious\Desktop\u=813688978,869557195&fm=15&gp=0.jpg)]

/*

连接查询

如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询

内连接 inner join

查询两个表中的结果集中的交集

外连接 outer join

左外连接 left join

(以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充)

右外连接 right join

(以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充)

等值连接和非等值连接

自连接

*/

– 查询参加了考试的同学信息(学号,学生姓名,科目编号,分数)

SELECT * FROM student;

SELECT * FROM result;

/*思路:

(1):分析需求,确定查询的列来源于两个类,student result,连接查询

(2):确定使用哪种连接查询?(内连接)

*/

SELECT s.studentno, studentname, subjectno, studentresult

FROM student s

INNER JOIN result r

ON s.studentno = r.studentno;

– 右连接实现

SELECT s.studentno, studentname, subjectno, studentresult

FROM student s

RIGHT JOIN result r

ON s.studentno = r.studentno;

– 左连接(注意左表为student,没有成绩的学生信息也会被查出)

SELECT s.studentno, studentname, subjectno, studentresult

FROM student s

LEFT JOIN result r

ON s.studentno = r.studentno;

– 等值连接

SELECT s.studentno, studentname, subjectno, studentresult

FROM student s, result r

WHERE s.studentno = r.studentno;

– 查一下缺考的同学(左连接应用场景)

SELECT s.studentno, studentname, subjectno, studentresult

FROM student s

LEFT JOIN result r

ON s.studentno = r.studentno

WHERE studentresult IS NULL;

– 查询参加了考试的同学信息(学号,学生姓名,科目名,分数)

SELECT s.studentno, studentname, subjectno, subjectname, studentresult

FROM student s

INNER JOIN result r

ON s.studentno = r.studentnos

INNER JOIN subject sub

ON sub.subjectno = r.subjectno

自连接

/*

自连接

数据表与自身进行连接

需求:从一个包含栏目ID , 栏目名称和父栏目ID的表中

查询父栏目名称和其他子栏目名称

*/

– 创建一个表

CREATE TABLE category (

categoryid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ‘主题id’,

pid INT(10) NOT NULL COMMENT ‘父id’,

categoryName VARCHAR(50) NOT NULL COMMENT ‘主题名字’,

PRIMARY KEY (categoryid)

) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8

– 插入数据

INSERT INTO category (categoryid, pid, categoryName)

VALUES(‘2’,‘1’,‘信息技术’),

(‘3’,‘1’,‘软件开发’),

(‘4’,‘3’,‘数据库’),

(‘5’,‘1’,‘美术设计’),

(‘6’,‘3’,‘web开发’),

(‘7’,‘5’,‘ps技术’),

(‘8’,‘2’,‘办公信息’);

– 编写SQL语句,将栏目的父子关系呈现出来 (父栏目名称,子栏目名称)

– 核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询(自连接)

SELECT a.categoryName AS ‘父栏目’, b.categoryName AS ‘子栏目’

FROM category AS a, category AS b

WHERE a.categoryid = b.pid

5、排序和分页


– 排序

/**

语法 : ORDER BY

ORDER BY 语句用于根据指定的列对结果集进行排序。

ORDER BY 语句默认按照ASC升序对记录进行排序。

如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。

*/

– 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)

– 按成绩降序排序

SELECT s.sudentno, studentname, subjectname, sudentresult

FROM student s

INNER JOIN result r

ON r.sudentno = s.sudentno

INNER JOIN subject sub

ON sub.subjectno = r.subjectno

WHERE subjectname = ’ 数据库结构-1’

ORDER BY sudentresult DESC;

– 分页

/**

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

pageNo pageSize

LIMIT (pageNo - 1)*pageSize, pageSize

*/

– 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)

– 按成绩降序排序

– 每页显示100条数据

SELECT s.sudentno, studentname, subjectname, sudentresult

FROM student s

INNER JOIN result r

ON r.sudentno = s.sudentno

INNER JOIN subject sub

ON sub.subjectno = r.subjectno

WHERE subjectname = ’ 数据库结构-1’

ORDER BY sudentresult DESC

LIMIT 0, 100;

6、子查询


/*============== 子查询 ================

什么是子查询?

在查询语句中的WHERE条件子句中,又嵌套了另一个查询语句

嵌套查询可由多个子查询组成,求解的方式是由里及外;

子查询返回的结果一般都是集合,故而建议使用IN关键字;

*/

– 查询 数据库结构-1 的所有考试结果(学号,科目编号,成绩),并且成绩降序排列

SELECT studentno, subjectno, studentresult

FROM result

WHERE subjectno=(

SELECT subjectno FROM subjct

WHERE subjectname = ‘数据库结构-1’

) ORDER BY studentresult DESC;

– 查询课程为 高等数学-2 且分数不小于80分的学生的学号和姓名

SELECT studentno, studentname

FROM student

WHERE studentno IN(

SELECT studentno

FROM result

WHERE studentresult >=80 AND subjectno = (

SELECT subjectno

FROM subjct

WHERE subjectname = ‘高等数学-2’

)

)

十二、MySQL函数

=========================================================================

1、数据函数


/* 取绝对值 */

SELECT ABS(-10);

/* 向上取整 */

SELECT CEILING(9.1);

/* 向下取整 */

SELECT FLOOR(9.9);

/* 返回一个0-1之间的随机数 0.7898709874505838 */

SELECT RAND();

/* 符号函数 正数返回1、负数返回-1、0返回0*/

SELECT SIGN(-1)

2、字符串函数


/* 返回字符串的长度 */

SELECT CHAR_LENGTH(‘成功绝不是偶然’)

/* 字符串拼接 */

SELECT CONCAT(‘李’,‘子’,‘捌’)

/* 字符串插入 注意第一个参数是开始替换的位置索引从1开始,不是0开始, 第二个参数是替换的长度*/

SELECT INSERT(‘我是李子捌我热爱三国’,7,2,‘非常热爱’);

/* 转大写 */

SELECT UPPER(‘liziba’);

/* 转小写 */

SELECT LOWER(‘LIZIBA’);

/* 从左边截取 */

SELECT LEFT(‘李子捌热爱编程’,3);

/* 从右边截取 */

SELECT RIGHT(‘李子捌热爱编程’,4);

/* 替换指定字符串 */

SELECT REPLACE(‘李子捌说李子捌热爱编程’,‘李子捌’,‘借力好风’);

/* 字符串截取 第一个参数为起始索引,第二个参数为字符串长度*/

SELECT SUBSTR(‘李子捌说李子捌热爱编程’,5, 7);

3、日期和时间函数


/* 获取当前日期 2021-01-01*/

SELECT CURRENT_DATE();

/* 获取当前日期 2021-01-01*/

SELECT CURDATE();

/* 获取当前日期 + 时间 2021-01-01 13:04:48 */

SELECT NOW();

/* 获取当前日期 + 时间 2021-01-01 13:05:48*/

SELECT LOCALTIME();

/* 获取当前日期 + 时间 2021-01-01 13:05:53*/

SELECT SYSDATE();

/* 获取年、月、日、时、分、秒 */

SELECT YEAR(NOW())

SELECT MONTH(NOW())

SELECT DAY(NOW())

SELECT HOUR(NOW())

SELECT MINUTE(NOW())

SELECT SECOND(NOW())

4、系统信息函数


/* 获取版本号 8.0.15*/

SELECT VERSION();

/* 用户 root@localhost*/

SELECT USER();

5、MD5加密


– 创建测试表

CREATE TABLE md5 (

id int(10) unsigned zerofill NOT NULL AUTO_INCREMENT,

name varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,

pwd varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

– 插入测试数据(无md5加密)

INSERT INTO md5 (name, pwd) VALUES(‘liziba’, ‘123456’),(‘xieli’, ‘123456’),(‘newnow’, ‘123456’);

– 插入测试数据(有md5加密)

INSERT INTO md5 (name, pwd) VALUES(‘liziba’, MD5(‘123456’)),(‘xieli’, MD5(‘123456’)),(‘newnow’, MD5(‘123456’));

– MySQL md5加密采用MD5()函数实现

MD5(‘STR’);

– 查询用户登录信息

SELECT * FROM md5 WHERE name = ‘liziba’ AND pwd = MD5(‘123456’);

6、 总结


– MySQL内置函数

– 数值函数

abs(x) – 绝对值 abs(-10.9) = 10

format(x, d) – 格式化千分位数值 format(1234567.456, 2) = 1,234,567.46

ceil(x) – 向上取整 ceil(10.1) = 11

floor(x) – 向下取整 floor (10.1) = 10

round(x) – 四舍五入去整

mod(m, n) – m%n m mod n 求余 10%3=1

pi() – 获得圆周率

pow(m, n) – m^n

sqrt(x) – 算术平方根

rand() – 随机数

truncate(x, d) – 截取d位小数

– 时间日期函数

now(), current_timestamp(); – 当前日期时间

current_date(); – 当前日期

current_time(); – 当前时间

date(‘yyyy-mm-dd hh:ii:ss’); – 获取日期部分

time(‘yyyy-mm-dd hh:ii:ss’); – 获取时间部分

date_format(‘yyyy-mm-dd hh:ii:ss’, ‘%d %y %a %d %m %b %j’); – 格式化时间

unix_timestamp(); – 获得unix时间戳

from_unixtime(); – 从时间戳获得时间

– 字符串函数

length(string) – string长度,字节

char_length(string) – string的字符个数

substring(str, position [,length]) – 从str的position开始,取length个字符

replace(str ,search_str ,replace_str) – 在str中用replace_str替换search_str

instr(string ,substring) – 返回substring首次在string中出现的位置

concat(string [,…]) – 连接字串

charset(str) – 返回字串字符集

lcase(string) – 转换成小写

left(string, length) – 从string2中的左边起取length个字符

load_file(file_name) – 从文件读取内容

locate(substring, string [,start_position]) – 同instr,但可指定开始位置

lpad(string, length, pad) – 重复用pad加在string开头,直到字串长度为length

ltrim(string) – 去除前端空格

repeat(string, count) – 重复count次

rpad(string, length, pad) --在str后用pad补充,直到长度为length

rtrim(string) – 去除后端空格

strcmp(string1 ,string2) – 逐字符比较两字串大小

– 聚合函数

count()

sum();

max();

min();

avg();

group_concat()

– 其他常用函数

md5();

default();

十三、事务

====================================================================

1、事务简介


数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

——《百度百科》

2、事务的ACID特性


1、原子性(Atomic)

一个事务被视为一个不可分割的最小工作单元,这个事务里的所有操作要么全部成功执行,要么全都不执行,不能只执行其中的一部分操作。实现事务的原子性,要支持回滚操作,在某个操作失败后,回滚到事务执行之前的状态。

回滚是一个抽象概念,大多数数据库在实现事务时是在事务操作的数据快照上进行,并不修改实际的数据,发生错误时并不提交。

2 、 一致性(Consistency)

一致性是指事务使得系统从一个一致性的状态转换到另一个一致性的状态。在实际的工程项目中事务可以有不同程度的一致性:

强一致性:读操作可以立即读到提交的更新数据。

弱一致性:提交的更新操作,不一定立即会被读操作读到,这种情况存在不一致窗口,指的是读操作要延迟一定时间才能读到最新值。

最终一致性:弱一致性的特例。事务更新一份数据,最终一致性保证在没有其他事务更新同样的值的话,最终所有的事务都会读到之前事务更新的最新值。如果没有错误发生,不一致窗口的大小依赖于通信延迟、系统负载等。

其他一致性变体还有:

单调一致性:如果一个进程已经读到一个值,那么后续不会读到更早的值。

会话一致性:保证客户端和服务器交互的会话过程中,读操作可以读到更新操作后的最新值。

3、隔离性(Isolation)

一个事务所做的修改在最终提交以前对其他事务是不可见的。

4、持久性(Durability)

一旦事务提交,则所做的修改会永久保存在数据库中。

3、四种隔离级别


1、Read Uncommitted(未提交读)

最低隔离级别。事务可以读取到未提交的数据,也即脏读(Dirty read)。存在脏读、不可重复读、幻读的问题。实际应用中一般很少使用这个隔离级别。

2、Read Committed(提交读)

大多数数据库系统默认的隔离级别(mysql不是)。只有在事务提交后,其更新结果才会被其他事务看见。该级别也叫 不可重复读(nonrepeatable read),两次执行同样的查询语句可能得到不同的结果。可以解决脏读问题,存在不可重复读、幻读的问题。

不可重复读发生的一个场景:事务A需要多次读取同一个数据,当再次读取该数据的时候 另一个事务B修改了该数据,导致事务A读到的该数据 与 上一次读到的数据不一致。(侧重在数据被修改了update)

3、Repeated Read(可重复读)

mysql默认的事务隔离级别。在同一个事务中多次读取同样记录的结果总是一致的。可以解决脏读、不可重复读,存在幻读(Phantom read)问题。幻读指的是当某个事务在读取某个范围内的记录时,会产生幻行(Phantom Rows)。

幻读发生的一个场景:select检测某数据是否存在,当不存在时插入数据,但在执行insert 语句插入数据时发现此记录已经存在了,不能再插入,此时即发生了幻读。

另一个场景:事务A执行 select语句1 返回 5条记录,再次执行 select语句1 时返回了 6条 记录,也即与上次返回的结果集不一致。(侧重在插入了新数据insert)

InnoDB引擎通过使用 NK锁(Next-Key Locks)解决幻读问题。

4、Serialization(可串行化)

事务串行化执行,隔离级别最高,牺牲了系统的并发性。解决脏读、不可重复读、幻读,可保证事务安全。通过强制事务串行执行避免了幻读问题,它在读取的每一行数据上都加锁,会导致大量的超时和锁争用问题。实际应用中很少使用这个隔离级别。

注意:

不可重复读的重点于在修改 – 同样的检索条件读取数据,再次读取出来时发现值不一致

幻读的重点在于新增或者删除 – 同样的条件,第1次和第2次读出来的记录数量不一样

4、事务的基本语法


– 由于MySQL默认是开启自动提交所以在使用事务的时候我们要先关闭自动提交 SET AUTOCOMMIT = 0;

– 关闭和开启自动提交模式

SET AUTOCOMMIT = 0; – 关闭

SET AUTOCOMMIT = 1; – 开启(MySQL默认是开启自动提交)

– 开始一个事务

START TRANSACTION;

– 事务提交

COMMIT;

– 事务回滚

ROLLBACK;

– 事务结束后设置MySQL数据的自动提交

SET AUTOCOMMIT = 1;-- 开启(MySQL默认是开启自动提交)

– 保存点

– 使用保存点,可以在回滚操作时只回滚到该保存点即可,而非事务的开头。

SAVEPOINT 保存点名称 --设置一个事务的保存点

ROLLBACK TO SAVEPOINT 保存点名称 – 回滚到保存点

RELEASE SAVEPOINT 保存点名称 – 删除保存点

– 测试题

/*

李子捌在线买一款价格为500元商品,网上银行转账.

李子捌的银行卡余额为2000,然后给商家李子柒支付500.

商家李子柒一开始的银行卡余额为10000

创建数据库shop和创建表account并插入2条数据

*/

– 创建数据库shop

CREATE DATABASE shopCHARACTER SET utf8 COLLATE utf8_general_ci;

USE shop;

– 创建表account

CREATE TABLE account (

id INT(11) NOT NULL AUTO_INCREMENT,

name VARCHAR(32) NOT NULL,

cash DECIMAL(9,2) NOT NULL,

PRIMARY KEY (id)

) ENGINE=INNODB DEFAULT CHARSET=utf8

– 插入2条数据

INSERT INTO account (name,cash)

VALUES(‘李子捌’,2000.00),(‘李子柒’,10000.00)

– 通过事务控制转账的实现

SET AUTOCOMMIT=0; – 关闭自动提交

START TRANSACTION; – 开启事务

UPDATE account SET cash=cash-500 WHERE name = ‘李子捌’;

UPDATE account SET cash=cash+500 WHERE name = ‘李子柒’;

COMMIT; – 事务提交

ROLLBACK; – 事务会滚(出现异常)

SET AUTOCOMMIT=1; – 开启自动提交

十四、索引

====================================================================

1、索引的概念


索引是一种特殊的文件,包含着对数据表中所有的记录的引用指针,数据库索引好比是一本书前面的目录,能加快数据库的查询速度,数据库索引就是为了提高表的搜索效率而对某些字段中的值建立的目录。

2、索引的作用


建立索引的目的是加快对表中记录的查找或排序,为表设置索引要付出代价;

一是增加了数据库的存储空间

二是在插入和修改数据时要花费更多的时间(因为索引也会随之改变)。

(1)设置合适的索引之后,数据库利用各种快速的定位技术,可以大大加快数据的查询速度,这也是创建索引的最主要的原因。

(2)当表很大的时候,或者查询涉及到多个表时,使用索引可以使查询速度快上成千倍。

(3)可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本。

(4)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

(5)在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间。

3、索引的分类


1.普通索引:列值可以取空值或重复值。创建使用关键字INDEX或KEY;

2.唯一索引:列值不能重复;即索引列值必须是唯一的,但可以是空值;创建使用关键字UNIQUE;

3.主键索引:主键索引是系统自动创建的主键索引,并且是唯一的。与唯一索引区别是;列值不能为空;

4.聚簇索引:就是数据存储的物理存储顺序,非聚簇索引就是索引顺序与数据的物理顺序无关。一个表只能有一个聚簇索引。目前只有InoDB和solidDB支持。

5.全文索引:只能创建在varchar或text的列上;建立全文索引能够在全文索引的列上进行查找。

(1)单列索引:就是一个索引只包含表中的一个列;比创建一个学号ID的索引;以name再创建一个姓名的单列索引。即每个索引包含一个列。

(2)组合索引(复合索引或多列索引):就是表中的两个列或多个列来创建成一个索引;比如;以用户ID、用户名Name、用户年龄Age来创建的索引就是联合索引。

4、创建索引的原则


(1)表的主键、外建必须有索引,主键具有唯一性,索引值也是唯一性,查询时可以快速定位到数据行,外键一般关联的是另一个表的主键,所有在多表查询时也可以快速定位。

(2)数据量过300行的表应该有索引,数据量较大的时候,如果没有索引,需要把表遍历一遍,严重影响数据库的性能。

(3)经常与其他表进行表连接的表,在连接字段上应该建立索引。

(4)唯一性太差的字段不适合建立索引,如果索引字段的数据唯一性太差,是不适合创建索引。

(5)更新太频繁的字段不合适创建索引,在表中进行增加、删除、修改操作时,索引也有相应操作产生、字段更新得过于频繁,对于系统资源占用也会更多。

(6)经常出现在where(条件判断)字句中的字段,特别是大表的字段,应该建立索引。

(7)索引应该建立在选择性高的字段上,如果很少的字段拥有相同值,即有很多独特值,则选择性很高。

(8)索引应该建在小字段上,对于大的文本段甚至超长字段,不要建索引。

6、索引创建基本语法


1、使用 CREATE INDEX 语句

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

2、使用 CREATE TABLE 语句

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

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

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

FOREIGN KEY <索引名> <列名>

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

3、使用 ALTER TABLE 语句

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

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

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

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

7、索引创建示例


1、创建普通索引

– 创建一个表 tb_stu_info,在该表的 height 字段创建普通索引。

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,

INDEX(height)

)ENGINE=INNODB DEFAULT CHARSET=utf8

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=utf8

2、创建唯一索引

– 创建一个表 tb_stu_info2,在该表的 height 字段上使用 UNIQUE 关键字创建唯一索引

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=utf8

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

笔者已经把面试题和答案整理成了面试专题文档

image

image

image

image

image

image

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
_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=utf8

2、创建唯一索引

– 创建一个表 tb_stu_info2,在该表的 height 字段上使用 UNIQUE 关键字创建唯一索引

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=utf8

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-ETHH9Ppu-1713249741701)]

[外链图片转存中…(img-XGJ7Vfh9-1713249741701)]

[外链图片转存中…(img-dOObBOLm-1713249741702)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

笔者已经把面试题和答案整理成了面试专题文档

[外链图片转存中…(img-vL5FYvgi-1713249741702)]

[外链图片转存中…(img-eKEZuUZC-1713249741702)]

[外链图片转存中…(img-wo6PNP6P-1713249741703)]

[外链图片转存中…(img-ujgxFl7j-1713249741703)]

[外链图片转存中…(img-FJEgPQ9G-1713249741703)]

[外链图片转存中…(img-waydSUzU-1713249741704)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jfgkjhghfdgf/article/details/137824755

智能推荐

攻防世界_难度8_happy_puzzle_攻防世界困难模式攻略图文-程序员宅基地

文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文

达梦数据库的导出(备份)、导入_达梦数据库导入导出-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作  导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释:   cwy_init/init_123..._达梦数据库导入导出

js引入kindeditor富文本编辑器的使用_kindeditor.js-程序员宅基地

文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js

STM32学习过程记录11——基于STM32G431CBU6硬件SPI+DMA的高效WS2812B控制方法-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6

计算机网络-数据链路层_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输

软件测试工程师移民加拿大_无证移民,未受过软件工程师的教育(第1部分)-程序员宅基地

文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...

随便推点

Thinkpad X250 secure boot failed 启动失败问题解决_安装完系统提示secureboot failure-程序员宅基地

文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure

C++如何做字符串分割(5种方法)_c++ 字符串分割-程序员宅基地

文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割

2013第四届蓝桥杯 C/C++本科A组 真题答案解析_2013年第四届c a组蓝桥杯省赛真题解答-程序员宅基地

文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答

基于供需算法优化的核极限学习机(KELM)分类算法-程序员宅基地

文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。

metasploitable2渗透测试_metasploitable2怎么进入-程序员宅基地

文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入

Python学习之路:从入门到精通的指南_python人工智能开发从入门到精通pdf-程序员宅基地

文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf

推荐文章

热门文章

相关标签