子类自己学习时整理的Mysql笔记(观看的视频是b站Up主狂神说Java的Mysql教程)
1.创建数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名;
2.删除数据库
DROP DATABASE [IF EXISTS] 数据库名;
3.使用数据库
-- 如果你的表名或者字段名是一个特殊字符,就需要带``
USE 数据库名;
4.查看数据库
SHOW DATABASE; --查看所有的数据库
数值
tinyint 十分小的数据 1个字节
smallint 较小的数据 2个字节
mediumint 中等大小的数据 3个字节
int 标准的整数 4个字节 常用的
bigint 较大的数据 8个字节
float 浮点数 4个字节
double 浮点数 8个字节 (精度问题!)
decimal 字符串形式的浮点数 金融计算的时候,一般是使用decimal
字符串
char 字符串,固定大小 0~255
varchar 可变字符串 0~65535 常用的 String
tinytext 微型文本 2^8-1
text 文本串 2^16-1 保存大文本
时间日期
java.util.Date
date YYYY-MM-DD, 日期
time HH:mm:ss, 时间
datetime YYYY-MM-DD HH:mm:ss 最常用的时间格式
timestamp 时间戳 1970.1.1 到现在的毫秒数 也较为常用
year 年份表示
null
没有值,未知
注意,不要使用NULL进行运算,结果为NULL
Unsigned :
zerofill:
auto increament:
not null / null:
default:
拓展:
/* 每一个表,都必须存在以下五个字段!未来做项目用的,表示一个记录存在的意义!
id 主键
`version` 乐观锁
is_delete 伪删除
gmt_create 创建时间
gmt_update 修改时间
*/
-- 目标:创建一个school数据库
-- 创建学生表(列,字段) 使用SQL 创建
-- 学号int 登录密码varchar(20) 姓名,性别(varchar),出生日期(datetime) ,家庭住址,email
-- 注意点,使用英文( ),表的名称和字段尽量使用 ` ` 括起来
-- AUTO_INCREMENT自增
-- 字符串使用 单引号括起来
-- 所有的语句后面加, (英文的) ,最后一个不用加
-- PRIMARY KEY 主键,一般一个表只有一个唯一的主键
CREATE TABLE IF NOT EXISTS `student` (
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT ‘学号‘,
`name` VARCHAR(30) NOT NULL DEFAULT ‘匿名‘ COMMENT ‘姓名‘,
`password` VARCHAR(20) NOT NULL DEFAULT ‘123456‘ COMMENT ‘密码‘,
`sex` VARCHAR(2) NOT NULL DEFAULT ‘男‘ COMMENT ‘性别‘,
`birthday` DATETIME DEFAULT NULL COMMENT ‘出生日期‘,
`address` VARCHAR(100) DEFAULT NULL COMMENT ‘家庭住址‘,
`email` VARCHAR(50) DEFAULT NULL COMMENT ‘邮箱‘,
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
格式:
CREATE TABLE [IF NOT EXISTS] `表名` (
`字段名` 列类型 [属性] [索引] [注释] ,
`字段名` 列类型 [属性] [索引] [注释] ,
......
`字段名` 列类型 [属性] [索引] [注释]
)[表类型][字符集设置][注释]
常用命令
SHOW CREATE DATABASE 数据库名 -- 查看创建数据库的语句
SHOW CREATE TABLE 数据库表名 -- 查看数据库表的语句
DESC 数据库表名 -- 显示表的结构
-- 关于数据库引擎
/*
INNODB 默认使用
MyiSAME 早些年使用
*/
MyiSAME | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间的大小 | 较小 | 较大,约为MyiSAME的2倍 |
常规使用操作:
在物理空间存在的位置
所有的数据库文件都存在 data 目录下,一个文件夹就对应一个数据库,本质还是文件存储
Mysql引擎在物理文件上取得区别:
设置数据库表的字符集编码
CHARSET=utf8
不设置的话,会是mysql默认的字符集编码~(不支持中文!)
修改
-- 修改表名
ALTER TABLE 旧表名 RENAME AS 新表名
-- 增加表的字段
ALTER TABLE 表名 ADD 字段名 列属性
-- 修改表的字段(重命名,修改约束)
ALTER TABLE 表名 MODIFY 字段名 列属性[] -- 修改约束
ALTER TABLE 表名 CHANGE 旧名字 新名字 列属性[] -- 字段重命名
-- 删除表的字段
ALTER TABLE 表名 DROP 字段名
删除
DROP TABLE IF EXISTS 表名
所有的创建和删除操作尽量加上判断,以免报错~
注意点:
`` 字段名,使用这个包裹!
注释 -- 或 /**/
sql关键字大小写不敏感,建议写小写
所有的符号全部用英文
方式一:创建表的时候,增加约束
CREATE TABLE IF NOT EXISTS `grade`(
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT ‘年级id‘,
`gradename` VARCHAR(50) NOT NULL COMMENT ‘年级名称‘,
PRIMARY KEY(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 学生表的 gradeid字段要去引用年级表的gradeid
-- 定义外键key
-- 给这个外键添加约束 (执行引用)references
CREATE TABLE IF NOT EXISTS `student` (
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT ‘学号‘,
`name` VARCHAR(30) NOT NULL DEFAULT ‘匿名‘ COMMENT ‘姓名‘,
`password` VARCHAR(20) NOT NULL DEFAULT ‘123456‘ COMMENT ‘密码‘,
`sex` VARCHAR(2) NOT NULL DEFAULT ‘男‘ COMMENT ‘性别‘,
`birthday` DATETIME DEFAULT NULL COMMENT ‘出生日期‘,
`gradeid` INT(10) NOT NULL COMMENT ‘学生的年级‘,
`address` VARCHAR(100) DEFAULT NULL COMMENT ‘家庭住址‘,
`email` VARCHAR(50) DEFAULT NULL COMMENT ‘邮箱‘,
PRIMARY KEY (`id`),
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
删除有外键关系的表时,必须要先删除引用别人的表(从表),再删除被引用的表(主表)
方式二:alter 增加外键约束
CREATE TABLE IF NOT EXISTS `grade`(
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT ‘年级id‘,
`gradename` VARCHAR(50) NOT NULL COMMENT ‘年级名称‘,
PRIMARY KEY(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
CREATE TABLE IF NOT EXISTS `student` (
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT ‘学号‘,
`name` VARCHAR(30) NOT NULL DEFAULT ‘匿名‘ COMMENT ‘姓名‘,
`password` VARCHAR(20) NOT NULL DEFAULT ‘123456‘ COMMENT ‘密码‘,
`sex` VARCHAR(2) NOT NULL DEFAULT ‘男‘ COMMENT ‘性别‘,
`birthday` DATETIME DEFAULT NULL COMMENT ‘出生日期‘,
`gradeid` INT(10) NOT NULL COMMENT ‘学生的年级‘,
`address` VARCHAR(100) DEFAULT NULL COMMENT ‘家庭住址‘,
`email` VARCHAR(50) DEFAULT NULL COMMENT ‘邮箱‘,
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 创建表的时候没有外键关系
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);
/*
ALTER TABLE 表名
ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) REFERENCES 引用哪个表(哪个字段);
*/
以上的操作都是物理外键,数据库级别的外键,不建议使用!(避免数据库过多造成困扰)
最佳实践:
数据库的意义:数据存储,数据管理
DML语言:数据操作语言
-- 插入语句(添加)
-- insert into 表名([字段1,字段2,字段3]) values(‘值1‘,‘值2‘,‘值3‘),(......)
INSERT INTO grade(`gradename`) VALUES(‘大一‘)
-- 由于主键自增我们可以省略,如果不写表的字段,就会一一匹配
-- 一般写插入语句,一定要数据和字段一一对应!
-- 插入多个字段
INSERT INTO grade(`gradename`) VALUES(‘大二‘),(‘大三‘),(‘大四‘)
语法: insert into 表名([字段1,字段2,字段3]) values(‘值1‘,‘值2‘,‘值3‘),(......)
update 修改谁 (条件) set 原来的值 = 新值
-- 修改学员的名字
UPDATE `student` SET `name` = ‘YeCaiYu‘ WHERE id = 1;
-- 不指定条件的情况下,会改动所有的记录
UPDATE `student` SET `name` = ‘长江七号‘;
-- 修改多个属性,逗号隔开
UPDATE `student` SET `name` = ‘YeCaiYu‘,`email` = ‘123456789@qq.com‘ WHERE id = 1;
语法:UPDATE 表名 SET 列名 = 值,[列名 = 值] WHERE [条件];
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 5=6 | false |
<> 或 != | 不等于 | 5<>6 | true |
> | 大于 | 5 > 6 | false |
< | 小于 | 5 < 6 | true |
>= | 大于等于 | 5 >= 5 | true |
<= | 小于等于 | 5 <= 4 | false |
BETWEEN...AND... | 在某个范围 | [2,5] | |
AND | 我和你&& | 5>1 and 1>2 | false |
OR | 我或你|| | 5>1 or 1>2 | true |
delete命令
DELETE FROM `student` -- 避免这样写,全删除了
DELETE FROM `student` where `id ` = 1
语法:delete from 表名 [where 条件]
TRUNCATE命令
作用:完全清空一个数据库表,表的结构和索引不会变
-- 清空 student 表
TRUNCATE `student`
delete 和 TRUNCATE 区别
了解即可:delete删除问题,重启数据库,现象
(Data Query Language:数据查询语言)
SELECT语法
SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
? [left | right | inner join table_name2] ?-- 联合查询
? [WHERE ...] ?-- 指定结果需满足的条件
? [GROUP BY ...] ?-- 指定结果按照哪几个字段来分组
? [HAVING] ?-- 过滤分组的记录必须满足的次要条件
? [ORDER BY ...] ?-- 指定查询记录按一个或多个条件排序
? [LIMIT {[offset,]row_count | row_countOFFSET offset}];
? ?-- 指定查询的记录从哪条至哪条
注意 : [ ] 括号代表可选的 , { }括号代表必选得
**指定查询字段**
-- 查询表中所有的数据列结果 , 采用 **" \* "** 符号; 但是效率低,不推荐 .
-- 查询所有学生信息
SELECT * FROM student;
-- 查询指定列(学号 , 姓名)
SELECT studentno,studentname FROM student;
语法: SELECT 字段,... FROM 表
AS 子句作为别名
作用:
-- 这里是为列取别名(当然as关键词可以省略)
SELECT studentno AS 学号,studentname AS 姓名 FROM student;
-- 使用as也可以为表取别名
SELECT studentno AS 学号,studentname AS 姓名 FROM student AS s;
-- 使用as,为查询结果取一个新名字
-- CONCAT()函数拼接字符串
SELECT CONCAT(‘姓名:‘,studentname) AS 新姓名 FROM student;
语法:SELECT 字段名 AS 新字段名 FROM 表名 AS 新表名
DISTINCT关键字的使用 (去重)
作用 : 去掉SELECT查询返回的记录结果中重复的记录 ( 返回所有列的值都相同 ) , 只返回一条
-- # 查看哪些同学参加了考试(学号) 去除重复项
SELECT * FROM result; -- 查看考试成绩
SELECT studentno FROM result; -- 查看哪些同学参加了考试
SELECT DISTINCT studentno FROM result; -- 了解:DISTINCT 去除重复项 , (默认是ALL)
语法: SELECT DISTINCT 字段名 FROM 表名
使用表达式的列
数据库中的表达式 : 一般由文本值 , 列值 , NULL , 函数和操作符等组成
应用场景 :
SELECT语句返回结果列中使用
SELECT语句中的ORDER BY , HAVING等子句中使用
DML语句中的 where 条件语句中使用表达式
-- selcet查询中可以使用表达式
SELECT @@auto_increment_increment; -- 查询自增步长
SELECT VERSION(); -- 查询版本号
SELECT 100*3-1 AS 计算结果; -- 表达式
-- 学员考试成绩集体提分一分查看
SELECT studentno,StudentResult+1 AS ‘提分后‘ FROM result;
where条件语句
作用:用于检索数据表中 符合条件 的记录
搜索条件可由一个或多个逻辑表达式组成 , 结果一般为真或假.
逻辑操作符
操作符名称 | 语法 | 描述 |
---|---|---|
AND 或 && | a AND b 或 a && b | 逻辑与,同为真才为真 |
OR 或 || | a OR b 或 a || b | 逻辑或,只要一个为真,则为真 |
NOT 或 ! | NOT a 或 !a | 逻辑非,操作数为假,则为真,为真则为假,取反 |
-- 满足条件的查询(where)
SELECT Studentno,StudentResult FROM result;
-- 查询考试成绩在95-100之间的
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult>=95 AND StudentResult<=100;
-- AND也可以写成 &&
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult>=95 && StudentResult<=100;
-- 模糊查询(对应的词:精确查询)
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult BETWEEN 95 AND 100;
-- 除了1000号同学,要其他同学的成绩
SELECT studentno,studentresult
FROM result
WHERE studentno!=1000;
-- 使用NOT
SELECT studentno,studentresult
FROM resultWHERE NOT studentno=1000;
模糊查询 :比较操作符
操作符名称 | 语法 | 描述 |
---|---|---|
IS NULL | a IS NULL | 若操作符为NULL,则结果为真 |
IS NOT NULL | a IS NOT NULL | 若操作符不为NULL,则结果为真 |
BETWEEN | a BETWEEN b AND c | 若a范围在b与c之间,则结果为真 |
LIKE | a LIKE b | SQL模式匹配,若a匹配b,则结果为真 |
IN | a IN (a1 , a2 , a3 , ......) | 若a等于a1,a2,a3,......中的某一个,则结果为真 |
注意:
-- 模糊查询 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;
连接查询
JOIN 对比
操作符名称 | 描述 |
---|---|
INNER JOIN | 如果表中至少一个匹配,则返回行 |
LEFT JOIN | 即使右边没有匹配,也从左表中返回所有行 |
RIGHT JOIN | 即使左边没有匹配,也从右表中返回所有行 |
其中JOIN理论
/*
连接查询
? ?如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
内连接 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 r.studentno = s.studentno
-- 右连接(也可实现)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
RIGHT JOIN result r
ON r.studentno = s.studentno
-- 等值连接
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s , result r
WHERE r.studentno = s.studentno
-- 左连接 (查询了所有同学,不考试的也会查出来)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno
-- 查一下缺考的同学(左连接应用场景)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno
WHERE StudentResult IS NULL
-- 思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON sub.subjectno = r.subjectno
注意:
两个表连接时用on
在使用left jion时,on和where条件的区别如下:
1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉
自连接
/*
自连接
? ?数据表与自身进行连接
需求:从一个包含栏目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 * FROM student ORDER BY StudentResult DESC
/*============== 分页 ================
语法 : SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
好处 : (用户体验,网络传输,查询压力)
推导:
? ?第一页 : limit 0,5
? ?第二页 : limit 5,5
? ?第三页 : limit 10,5
? ?......
? ?第N页 : limit (pageNo-1)*pageSzie,pageSzie
? ?[pageNo:页码,pageSize:单页面显示条数]
*/
-- 每页显示5条数据
SELECT * FROM student LIMIT 0,5
子查询
/*============== 子查询 ================
什么是子查询?
? ?在查询语句中的WHERE条件子句中,又嵌套了另一个查询语句
? ?嵌套查询可由多个子查询组成,求解的方式是由里及外;
? ?子查询返回的结果一般都是集合,故而建议使用IN关键字;
*/
-- 查询 数据库结构-1 的所有考试结果(学号,科目编号,成绩),并且成绩降序排列
-- (执行顺序:由里及外)
SELECT studentno,subjectno,StudentResult
FROM result
WHERE subjectno=(
? ?SELECT subjectno FROM `subject`
? ?WHERE subjectname = ‘数据库结构-1‘
)
ORDER BY studentresult DESC;
-- 查询课程为 高等数学-2 且分数不小于80分的学生的学号和姓名
-- 分步写简单sql语句,然后将其嵌套起来
SELECT studentno,studentname FROM student WHERE studentno IN(
? ?SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=(
? ? ? ?SELECT subjectno FROM `subject` WHERE subjectname = ‘高等数学-2‘
? )
)
菜鸟教程:https://www.runoob.com/mysql/mysql-functions.html
-- 数学运算
SELECT ABS(-8) -- 绝对值
SELECT CEIL(1.4) -- 向上取整
SELECT FLOOR(1.6) -- 向下取整
SELECT RAND() -- 返回一个 0~1 之间的随机数
SELECT SIGN(5) -- 判断一个数的符号 0 -> 0 ; 负数 -> -1 ; 整数 -> 1
-- 字符串函数
SELECT CHAR_LENGTH(‘冰冻三尺,非一日之寒‘) 长度 -- 字符串长度
SELECT CONCAT(‘我是‘,‘YeCaiYu,‘,‘你们好‘) 拼接 -- 拼接字符串
SELECT INSERT(‘我爱编程,Hello World!‘,2,1,‘超级热爱‘) -- 插入,替换 从某个位置开始替换某个长度
SELECT LOWER(‘KDSUHGISUAGNOIPN‘) -- 转小写
SELECT UPPER(‘ufdsghiuasdhguidfhshg‘) -- 转大写
SELECT INSTR(‘YeCaiYu‘,‘a‘) -- 返回第一次出现的子串的索引
SELECT REPLACE(‘I Love You‘,‘You‘,‘Your Mother‘) -- 替换出现的指定字符串
SELECT SUBSTRING(‘我爱编程!‘,1,2) -- 返回指定位置指定长度的字符串
SELECT REVERSE(‘123456‘) -- 反转
-- 时间和日期函数(记住)
SELECT CURRENT_DATE() -- 获取当前日期
SELECT CURDATE() -- 获取当前日期
SELECT NOW() -- 获取当前的时间
SELECT LOCALTIME() -- 本地时间
SELECT SYSDATE() -- 系统时间
SELECT YEAR(NOW()) -- 年
SELECT MONTH(NOW()) -- 月
SELECT DAY(NOW()) -- 日
SELECT HOUR(NOW()) -- 时
SELECT MINUTE(NOW()) -- 分
SELECT SECOND(NOW()) -- 秒
-- 系统
SELECT SYSTEM_USER() -- 返回当前用户
SELECT USER() -- 返回当前用户
SELECT VERSION() -- 返回数据库的版本号
函数名称 | 描述 |
---|---|
COUNT() | 计数 |
SUM() | 求和 |
AVG() | 平均值 |
MAX() | 最大值 |
MIN() | 最小值 |
...... |
-- 聚合函数
SELECT COUNT(字段名) FROM 表名 -- Count(字段) 会忽略所有的null值
SELECT COUNT(*) FROM 表名 -- Count(*) 不会忽略null值,本质 计算行数
SELECT COUNT(1) FROM 表名 -- Count(1) 不会忽略null值,本质 计算行数
SELECT SUM(字段名) AS 总和 FROM 表名
SELECT AVG(字段名) AS 平均分 FROM 表名
SELECT MAX(字段名) AS 最高分 FROM 表名
SELECT MIN(字段名) AS 最低分 FROM 表名
-- 查询不同课程的平均分,最高分,最低分,且平均分大于80分
-- 表名 Subject 字段:subjectNo 课程id、subjectName 课程名、subjectScore课程分数
SELECT subjectName,AVG(subjectScore) 平均分,MAX(subjectScore) 最高分,MIN(subjectScore) 最低分
FROM `Subject`
GROUP BY subjectNo -- 通过什么字段来分组
HAVING 平均分 >= 80 -- 分组后过滤要用having
事务原则:ACID原则 :原子性、一致性、隔离性、持久性(脏读,幻读...)
可以看下这个老哥的博客:https://blog.csdn.net/dengjili/article/details/82468576
原子性(Atomicity)
要么都成功,要么都失败
一致性(Consistency)
事务前后数据的完整性必须保持一致
持久性(Durability)
事务一旦提交则不可逆,被持久化到数据中!
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
隔离锁导致的问题
脏读:
不可重复读:
虚读(幻读)
MySQL官方对索引的定义为: 索引(index)是帮助MySQL高效获取数据的数据结构。
提取句子主干,就可以得到索引的本质:索引是数据结构。
在一个表中,主键索引只能有一个,唯一索引可以有多个
-- 添加索引
CREATE INDEX 索引名 ON 表(字段)
-- 显示所有的索引信息
SHOW INDEX FROM 表名
-- 分析sql执行的状况
EXPLAIN sql语句
-- 创建用户
CREATE USER 用户名 IDENTIFIED BY ‘密码‘
-- 修改密码(修改当前用户密码)
SET PASSWORD = PASSWORD(‘新密码‘)
-- 修改密码(修改指定用户密码)
SET PASSWORD FOR 用户名 = PASSWORD(‘新密码‘)
-- 重命名
RENAME USER 原来的用户名 TO 新的用户名
-- 用户授权 ALL PRIVILEGES 全部权限 ,这个权限 除了给别人权限,啥都能干
GRANT ALL PRIVILEGES ON *.* TO 用户名
-- 查询权限
SHOW GRANTS FOR 用户名 -- 查询指定用户的权限
SHOW GRANTS FOR root@localhost
-- root 用户权限
-- GRANT PROXY ON ‘‘@‘‘ TO ‘root‘@‘localhost‘ WITH GRANT OPTION
-- 撤销权限
REVOKE ALL PRIVILEGES ON *.* FROM 用户名
-- 删除用户
DROP USER 用户名
原文:https://www.cnblogs.com/YeCaiYu/p/12912561.html