– 查询成绩表
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;
作用:
搜索的条件可以由一个或者多个逻辑表达式组成,结果一般为真或假
逻辑操作符
| 运算符号 | 作用 |
| :-- | :-- |
| 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;
| 操作符名称 | 描述 |
| — | — |
| 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
– 排序
/**
语法 : 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;
/*============== 子查询 ================
什么是子查询?
在查询语句中的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’
)
)
=========================================================================
/* 取绝对值 */
SELECT ABS(-10);
/* 向上取整 */
SELECT CEILING(9.1);
/* 向下取整 */
SELECT FLOOR(9.9);
/* 返回一个0-1之间的随机数 0.7898709874505838 */
SELECT RAND();
/* 符号函数 正数返回1、负数返回-1、0返回0*/
SELECT SIGN(-1)
/* 返回字符串的长度 */
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);
/* 获取当前日期 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())
/* 获取版本号 8.0.15*/
SELECT VERSION();
/* 用户 root@localhost*/
SELECT USER();
– 创建测试表
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’);
– 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();
====================================================================
数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
——《百度百科》
一个事务被视为一个不可分割的最小工作单元,这个事务里的所有操作要么全部成功执行,要么全都不执行,不能只执行其中的一部分操作。实现事务的原子性,要支持回滚操作,在某个操作失败后,回滚到事务执行之前的状态。
回滚是一个抽象概念,大多数数据库在实现事务时是在事务操作的数据快照上进行,并不修改实际的数据,发生错误时并不提交。
一致性是指事务使得系统从一个一致性的状态转换到另一个一致性的状态。在实际的工程项目中事务可以有不同程度的一致性:
强一致性:读操作可以立即读到提交的更新数据。
弱一致性:提交的更新操作,不一定立即会被读操作读到,这种情况存在不一致窗口,指的是读操作要延迟一定时间才能读到最新值。
最终一致性:弱一致性的特例。事务更新一份数据,最终一致性保证在没有其他事务更新同样的值的话,最终所有的事务都会读到之前事务更新的最新值。如果没有错误发生,不一致窗口的大小依赖于通信延迟、系统负载等。
其他一致性变体还有:
单调一致性:如果一个进程已经读到一个值,那么后续不会读到更早的值。
会话一致性:保证客户端和服务器交互的会话过程中,读操作可以读到更新操作后的最新值。
一个事务所做的修改在最终提交以前对其他事务是不可见的。
一旦事务提交,则所做的修改会永久保存在数据库中。
最低隔离级别。事务可以读取到未提交的数据,也即脏读(Dirty read)。存在脏读、不可重复读、幻读的问题。实际应用中一般很少使用这个隔离级别。
大多数数据库系统默认的隔离级别(mysql不是)。只有在事务提交后,其更新结果才会被其他事务看见。该级别也叫 不可重复读(nonrepeatable read),两次执行同样的查询语句可能得到不同的结果。可以解决脏读问题,存在不可重复读、幻读的问题。
不可重复读发生的一个场景:事务A需要多次读取同一个数据,当再次读取该数据的时候 另一个事务B修改了该数据,导致事务A读到的该数据 与 上一次读到的数据不一致。(侧重在数据被修改了update)
mysql默认的事务隔离级别。在同一个事务中多次读取同样记录的结果总是一致的。可以解决脏读、不可重复读,存在幻读(Phantom read)问题。幻读指的是当某个事务在读取某个范围内的记录时,会产生幻行(Phantom Rows)。
幻读发生的一个场景:select检测某数据是否存在,当不存在时插入数据,但在执行insert 语句插入数据时发现此记录已经存在了,不能再插入,此时即发生了幻读。
另一个场景:事务A执行 select语句1 返回 5条记录,再次执行 select语句1 时返回了 6条 记录,也即与上次返回的结果集不一致。(侧重在插入了新数据insert)
InnoDB引擎通过使用 NK锁(Next-Key Locks)解决幻读问题。
事务串行化执行,隔离级别最高,牺牲了系统的并发性。解决脏读、不可重复读、幻读,可保证事务安全。通过强制事务串行执行避免了幻读问题,它在读取的每一行数据上都加锁,会导致大量的超时和锁争用问题。实际应用中很少使用这个隔离级别。
注意:
不可重复读的重点于在修改 – 同样的检索条件读取数据,再次读取出来时发现值不一致
幻读的重点在于新增或者删除 – 同样的条件,第1次和第2次读出来的记录数量不一样
– 由于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 shop
CHARACTER 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; – 事务提交
SET AUTOCOMMIT=1; – 开启自动提交
====================================================================
索引是一种特殊的文件,包含着对数据表中所有的记录的引用指针,数据库索引好比是一本书前面的目录,能加快数据库的查询速度,数据库索引就是为了提高表的搜索效率而对某些字段中的值建立的目录。
建立索引的目的是加快对表中记录的查找或排序,为表设置索引要付出代价;
一是增加了数据库的存储空间
二是在插入和修改数据时要花费更多的时间(因为索引也会随之改变)。
(1)设置合适的索引之后,数据库利用各种快速的定位技术,可以大大加快数据的查询速度,这也是创建索引的最主要的原因。
(2)当表很大的时候,或者查询涉及到多个表时,使用索引可以使查询速度快上成千倍。
(3)可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本。
(4)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
(5)在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间。
1.普通索引:列值可以取空值或重复值。创建使用关键字INDEX或KEY;
2.唯一索引:列值不能重复;即索引列值必须是唯一的,但可以是空值;创建使用关键字UNIQUE;
3.主键索引:主键索引是系统自动创建的主键索引,并且是唯一的。与唯一索引区别是;列值不能为空;
4.聚簇索引:就是数据存储的物理存储顺序,非聚簇索引就是索引顺序与数据的物理顺序无关。一个表只能有一个聚簇索引。目前只有InoDB和solidDB支持。
5.全文索引:只能创建在varchar或text的列上;建立全文索引能够在全文索引的列上进行查找。
(1)单列索引:就是一个索引只包含表中的一个列;比创建一个学号ID的索引;以name再创建一个姓名的单列索引。即每个索引包含一个列。
(2)组合索引(复合索引或多列索引):就是表中的两个列或多个列来创建成一个索引;比如;以用户ID、用户名Name、用户年龄Age来创建的索引就是联合索引。
(1)表的主键、外建必须有索引,主键具有唯一性,索引值也是唯一性,查询时可以快速定位到数据行,外键一般关联的是另一个表的主键,所有在多表查询时也可以快速定位。
(2)数据量过300行的表应该有索引,数据量较大的时候,如果没有索引,需要把表遍历一遍,严重影响数据库的性能。
(3)经常与其他表进行表连接的表,在连接字段上应该建立索引。
(4)唯一性太差的字段不适合建立索引,如果索引字段的数据唯一性太差,是不适合创建索引。
(5)更新太频繁的字段不合适创建索引,在表中进行增加、删除、修改操作时,索引也有相应操作产生、字段更新得过于频繁,对于系统资源占用也会更多。
(6)经常出现在where(条件判断)字句中的字段,特别是大表的字段,应该建立索引。
(7)索引应该建立在选择性高的字段上,如果很少的字段拥有相同值,即有很多独特值,则选择性很高。
(8)索引应该建在小字段上,对于大的文本段甚至超长字段,不要建索引。
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 [<索引名>] (<列名>,…)
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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
笔者已经把面试题和答案整理成了面试专题文档
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
_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-vL5FYvgi-1713249741702)]
[外链图片转存中…(img-eKEZuUZC-1713249741702)]
[外链图片转存中…(img-wo6PNP6P-1713249741703)]
[外链图片转存中…(img-ujgxFl7j-1713249741703)]
[外链图片转存中…(img-FJEgPQ9G-1713249741703)]
[外链图片转存中…(img-waydSUzU-1713249741704)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数