笔记内容学习来自B站狂神说java,狂神小迷弟一枚
课程链接: 快来点我,支持狂神.
javeEE: 企业级java开发 Web
前端:页面展示,数据
后端:连接点,连接数据库JDBC,链接前端(控制,控制试图跳转,和给前端传递数据)
数据库:存数据,txt,excel,word
除了基础写代码+学好数据库+操作系统+数据结构和算法=不错的程序猿
再+408+编译原理+实战经验 = 高级程序员
岗位需求
mysql处理小型数据,得数据库者的天下
被迫需求:存数据
数据库是所有软件体系中最核心的存在 DBA (数据库管理员)
关系型数据库
非关系型数据库 : {key:value}
DBMS(数据库管理系统)
MySql 是 一个关系型数据库管理系统,属于Oracle旗下,是最好的RDBMS用用软件之一,开源的数据库软件,体积小,速度快,总体拥有成本低,招人成本比较低。
5.7 比较稳定
8.0
MySql 尽可能使用压缩包安装。
练习创建一个数据库
新建一个数据库db_School
新建一张表student
字段: id,name,age
在一张表中添加一组数据
mysql -uroot -p密码 --连接数据库
uodate mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost'; --修改密码
flush privileges; --刷新权限
---------------------------------------------------------------------
show database; --查看所有数据库
mysql> use school; --切换数据库use 数据库名
Database changed
show table; --查看所有表
describe student; --显示数据库中所有的数据
----------------------------------------------------------------------
create database class; --创建一个数据库
exit; --退出连接
CRUD 增删改查
DDL , DML , DQL ,DCL
操作 数据库>表>数据
MySql关键字不区分大小写
[ ]:中括号表示可选
1.新建数据库
CREATE DATABASE [IF NOT EXISTS] CLASS;
2.删除数据库
DROP DATABASE CLASS;
3.使用数据库
USE `school` --若表名或字段名是个特殊字符就需要带``
4.查看数据库
SHOW DATABASE
学习思路:
不会的操作看可视化软件的历史记录
固定语法需要记忆
数值
数据类型 | 描述 | 占用字符 |
---|---|---|
tinyint | 十分小的整数 | 1个字节 |
smallint | 较小的整数 | 2个字节 |
int | 标准整数 | 4个字节 |
middleint | 中等大小的整数 | 3个字节 |
bigint | 较大的整数 | 8个字符 |
float | 浮点数 | 4个字节 |
double | 浮点数 | 8个字节 |
decimal | 字符串形式的浮点数(金融计算一般浮点数用decimal) |
字符串
时间日期
null
Unsigned
zerofill
自增
非空
默认
阿里巴巴手册 (项目级别) 表示记录存在的意义
每一个表都必须存在以下几个字段
id --主键
`version` --乐观锁
is_delete --伪删除
gmt_create --创建时间
gmt_update --修改时间
1.在数据库中用指令新建表
--AUTO_INCREMENT 自增
--字符串用单引号括起来
--所有的语句后面加,(英文的),最后一个不用加
--COMMENT 注释
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`gender` 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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i4dCwe6H-1586686083472)(…/Typora%E5%9B%BE%E7%89%87%E7%BC%93%E5%AD%98/1586614249435.png)]
总结格式
CREATE TABLE [IF NOT EXISTS] `表名`(
`字段名` 列类型 [属性] [索引] [注释],
`字段名` 列类型 [属性] [索引] [注释],
.....
`字段名` 列类型 [属性] [索引] [注释]
)[表类型][字符集设置][注释]
2.查看已创建数据库的语句
SHOW CREATE DATABASE db_school_list --查看表,已db_school_list数据库为例子
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dxtIuXEd-1586686083474)(…/Typora%E5%9B%BE%E7%89%87%E7%BC%93%E5%AD%98/1586615202858.png)]
3.查看已创建表的定义
SHOW CREATE TABLE student --查看表中定义的语句,已student表为例子
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jdV7DPGB-1586686083475)(…/Typora%E5%9B%BE%E7%89%87%E7%BC%93%E5%AD%98/1586615278473.png)]
4.显示表的结构
DESC student --查看表的结构,已student表为例子
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cqISEzpg-1586686083477)(…/Typora%E5%9B%BE%E7%89%87%E7%BC%93%E5%AD%98/1586615159188.png)]
INNODB和MYISAM的区别
区别 | MYISAM | INNODB |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间的大小 | 较小 | 较大,前者的两倍 |
常规使用操作:
MYISAM 节约空间,速度较快 聚集索引
**INNODB 安全性高,书屋处理快,多表多用户操作 ** 非聚集索引
物理空间的位置
MySql引擎在物理文件上的区别
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NhNLOIvF-1586686083481)(…/Typora%E5%9B%BE%E7%89%87%E7%BC%93%E5%AD%98/1586616183543.png)]
设置数据库表的字符集编码
修改和删除表和表中的字段
1. 修改表名
--ALTER TABLE 旧表名 RENAME AS 新表名
ALTER TABLE teacher RENAME AS teacher00
2. 增加表的字段
--ALTER TABLE 表名 ADD 字段名 列属性
ALTER TABLE teacher00 ADD age INT(11)
3. 修改表的字段(重命名 修改约束)
--ALTER TABLE 表名 MODIFY 字段名 列属性
--ALTER TABLE 表名 CHANGE 字段名 列属性
ALTER TABLE teacher00 MODIFY age VARCHAR(11) --修改约束
ALTER TABLE teacher00 CHANGE age age1 VARCHAR(11) --字段重命名
4. 删除字段
--ALTER TABLE 表名 DROP 字段名
ALTER TABLE teacher00 DROP age1
5. 删除表
--DROP TABLE [IF EXSITS] 表名
DROP TABLE IF EXSITS teacher00
所有的创建和删除操作尽量都加上判断,以免报错
外键
方式一:在创建时设置外键
--创建年纪表
CREATE TABLE IF NOT EXISTS `grade`(
`gid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
`gname` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '年纪名称',
PRIMARY KEY (`gid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
--包含外键的新student表
--定义外键
--给这个外键添加约束(执行引用)reference 引用
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`gender` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`gid` INT(10) NOT NULL COMMENT '学生年级',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address` VARCHAR(100) DEFAULT NULL COMMENT '地址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`),
KEY `FK_gid` (`gid`),
CONSTRAINT `FK_gid`FOREIGN KEY (`gid`) REFERENCES `grade`(`gid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
--注意在删除引用外键关系的表时,要先删除外键表 再删除引用外间的表
方法二:创建表的时候没有外键关系
/*
ALTER TABLE 表名
ADD CONSTRAINT 约束名 FOREIGN KEY (作为外键的列) REFERENCES 那个表(哪个字段)
*/
ALTER TABLE `student`
ADD CONSTRAINT `FK_gid` FOREIGN KEY (`gid`) REFERENCES `grade`(`gid`)
以上的操作都是物理外键(既数据库级别的外键),不建议使用!(避免数据库过多造成困扰)
最佳实践
**数据库意义:**数据存储,数据管理
**DML语言:**数据操作语言
--插入语句
--insert into 表名([字段1,字段2,字段3,])values('值1'),('值2'),('值3'),...,()
--插入的值和前面的字段要一一对应
--可以插入多条数据,VALUES后面的值要用括号和逗号隔开
INSERT INTO `grade`('gname')VALUES('大一'),('大二'),('大三')
INSERT INTO `student`('gender','name','pwd')VALUES('男','张三','888888'),('男','赵云','zy12345'),('女','胡八一','886688')
-- 修改语句
-- 修改学员名字,带条件
UPDATE `student` SET `name`='小迷弟' WHERE id = 1;
-- 在不指定条件的情况下,会改动所有表
UPDATE `student` SET `name`='小迷弟';
-- 语法:
-- UPDATE 表名 SET 列属性=新值 WHERE 条件;
-- 修改多个属性,逗号隔开
UPDATE `student` SET `name`='小迷弟',`email`='[email protected]' WHERE id = 1;
-- 语法:
-- UPDATE 表名 SET 列属性1=新值[,列属性2=新值] WHERE 条件;
条件:where 子句 运算符 id等于某个值
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 5=6 | false |
<>或!= | 不等于 | 5<>6 | ture |
>= | 大于等于 | 5>=6 | false |
<= | 小于等于 | 5<=6 | ture |
> | 大于 | 5>6 | false |
< | 小于 | 5<6 | ture |
BETWEEN… AND… | 在某个范围 | [5,6] | ture |
AND | && 与 | 5>6 and 1<2 | false |
OR | || 或 | 5>6 or 1<2 | ture |
注意总结:
-- 删除语句
--删除指定数据
DELETE FROM `student` WHERE id=1
--不加条,删除表的所有数据,避免这样
DELETE FROM `student`
--清空表,采用这个更好
TRUNCATE `student`
Delete 和Truncate的区别
(Data Query Language : 数据查询语言)
所有的查询操作都用它 关键词是 select
简单地查询和复杂的查询它都能做
它是数据库中最核心的语言,最重要的语句
使用频率最高的语句
--查询所有学生
SELECT * FROM student
--查询所有学生的成绩
SELECT * FROM result
--查询指定字段
--SELECT 字段名 FROM 表名
SELECT `StudentNo`,`StudentName` FROM student
--别名,给结果起一个名字 关键词 AS 字段和表都可以起别名
SELECT `StudentNo` AS 学号,`StudentName` AS 学生姓名 FROM student
--函数 Concat(a,b) 链接字符串
SELECT CONCAT('姓名:',StudentName) AS 新名字 FROM student
--去重 distinct
SELECT DISTINCT `StudentNo` FROM result
--查询版本
SELECT VERSION()
--计算
SELECT 100*3-1 AS 计算结果
--查询自增步长
SELECT @@auto_increment_increment
--查询所有学生的考试成绩并+1分查看
SELECT `StudentNo`,`StudentResult`+1 AS '提分后' FROM result
语法: SELECT 字段名1[,字段名2……,字段名n] FROM 表名
别名: AS 字段和表都可以起别名
去重: distinct 去除SELECT查询出来的结果中重复的值
数据库中的表达式: 文本值 ,列,NULL,函数,计算表达式,系统变量…
语法升级: SELECT 表达式 FROM 表
作用: 检索数据中符合条件的值
逻辑运算符
运算符 | 语法 | 描述 |
---|---|---|
and && | x and y | 与 |
or || | x or y | 或 |
not ! | not x | 非 |
--where子句
--查询成绩在95-100之间的学生
--方法1
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentResult>=95 AND StudentResult<=100
--方法2
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentResult>=95 && StudentResult<=100
--方法3 模糊查询(区间)
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentResult BETWEEN 95 AND 100
--查询除了学号为1000号学生以外的同学的成绩
--方法1
SELECT `StudentNo`,`StudentResult` FROM result
WHERE NOT StudentNo = 1000
--方法2
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentNo != 1000
模糊查询:比较运算符
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | x is null | 为null,结果为真 |
IS NOT NULL | x is not null | 不为nul,结果为真 |
BETWEEN … AND … | BETWEEN 95 AND 100 | x在95-100之间,则为真 |
LIKE | x like y | SQL匹配,若x匹配到y,则结果为真 |
IN | x in y1,y2,… | 假设x在y1,y2…之中的某个值,则结果为真 |
--模糊查询
--查询姓胡的同学
--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 '%姿%'
--in
--查询1001,1002,1003号同学
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentNo IN (1001,1002,1003)
--查询在浙江,重庆的同学
SELECT `StudentNo`,`StudentName`,`Address` FROM student
WHERE Address IN ('浙江','重庆')
--null / not null
--查询地址为空的学生null ''
SELECT `StudentNo`,`StudentName`,`Address` FROM student
WHERE Address='' OR Address IS NULL
注意:%和like联用,不要乱用。
(Data Query Language : 数据查询语言)
所有的查询操作都用它 关键词是 select
简单地查询和复杂的查询它都能做
它是数据库中最核心的语言,最重要的语句
使用频率最高的语句
--查询所有学生
SELECT * FROM student
--查询所有学生的成绩
SELECT * FROM result
--查询指定字段
--SELECT 字段名 FROM 表名
SELECT `StudentNo`,`StudentName` FROM student
--别名,给结果起一个名字 关键词 AS 字段和表都可以起别名
SELECT `StudentNo` AS 学号,`StudentName` AS 学生姓名 FROM student
--函数 Concat(a,b) 链接字符串
SELECT CONCAT('姓名:',StudentName) AS 新名字 FROM student
--去重 distinct
SELECT DISTINCT `StudentNo` FROM result
--查询版本
SELECT VERSION()
--计算
SELECT 100*3-1 AS 计算结果
--查询自增步长
SELECT @@auto_increment_increment
--查询所有学生的考试成绩并+1分查看
SELECT `StudentNo`,`StudentResult`+1 AS '提分后' FROM result
语法: SELECT 字段名1[,字段名2……,字段名n] FROM 表名
别名: AS 字段和表都可以起别名
去重: distinct 去除SELECT查询出来的结果中重复的值
数据库中的表达式: 文本值 ,列,NULL,函数,计算表达式,系统变量…
语法升级: SELECT 表达式 FROM 表
作用: 检索数据中符合条件的值
逻辑运算符
运算符 | 语法 | 描述 |
---|---|---|
and && | x and y | 与 |
or || | x or y | 或 |
not ! | not x | 非 |
--where子句
--查询成绩在95-100之间的学生
--方法1
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentResult>=95 AND StudentResult<=100
--方法2
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentResult>=95 && StudentResult<=100
--方法3 模糊查询(区间)
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentResult BETWEEN 95 AND 100
--查询除了学号为1000号学生以外的同学的成绩
--方法1
SELECT `StudentNo`,`StudentResult` FROM result
WHERE NOT StudentNo = 1000
--方法2
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentNo != 1000
模糊查询:比较运算符
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | x is null | 为null,结果为真 |
IS NOT NULL | x is not null | 不为nul,结果为真 |
BETWEEN … AND … | BETWEEN 95 AND 100 | x在95-100之间,则为真 |
LIKE | x like y | SQL匹配,若x匹配到y,则结果为真 |
IN | x in y1,y2,… | 假设x在y1,y2…之中的某个值,则结果为真 |
--模糊查询
--查询姓胡的同学
--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 '%姿%'
--in
--查询1001,1002,1003号同学
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentNo IN (1001,1002,1003)
--查询在浙江,重庆的同学
SELECT `StudentNo`,`StudentName`,`Address` FROM student
WHERE Address IN ('浙江','重庆')
--null / not null
--查询地址为空的学生null ''
SELECT `StudentNo`,`StudentName`,`Address` FROM student
WHERE Address='' OR Address IS NULL
注意:%和like联用,不要乱用。
SQL中的七种JOINS理论详解
LEFT JOIN , INNER JOIN , RIGHT JOIN
--查询参加了考试的同学(学号,姓名,科普编号,分数)
SELECT * FROM student
SELECT * FROM result
/*
思路
1. 分析需求,分析查询的字段来自那些表(连接查询)
2. 确定使用那种连接查询? 7种
确定交叉信息
--JOIN ON是固定语法 连接查询
--WHERE 等值查询
*/
--查看并集 INNER JOIN
SELECT s.StudentNo,StudentName,SubjectNo,StudentResult
FROM student AS s
INNER JOIN result AS r
WHERE r.StudentNo = s.StudentNo
--查看并集和右部分 RIGHT JOIN
SELECT s.StudentNo,StudentName,SubjectNo,StudentResult
FROM student AS s
RIGHT JOIN result r
ON r.StudentNo = s.StudentNo
--查询缺考同学
--查看并集和右部分 RIGHT JOIN
SELECT s.StudentNo,StudentName,SubjectNo,StudentResult
FROM student AS s
LEFT JOIN result r
ON r.StudentNo = s.StudentNo
WHERE StudentResult IS NULL
--查询参加考试同学的信息(学号,学生姓名,科目名称,成绩) 3张表
SELECT DISTINCT s.StudentNo,StudentName,SubjectNo,StudentResult
FROM student AS s
RIGHT JOIN result r
ON r.StudentNo = s.StudentNo
INNER JONIN subject sub
WHERE sub.SubjectNo = s.SubjectNo
--多表查询,先查询两张表再慢慢增加
操作 | 描述 |
---|---|
INNER JOIN | 如果表中至少有一个匹配,就返回行 |
LEFT JOIN | 即使由右表中没有匹配,也会从左表中返回所有的值,(例如新建的学生没有成绩) |
RIGHT JOIN | 即使由左表中没有匹配,也会从右表中返回所有的值 |
自连接
--自连接用例表
CREATE TABLE `category`(
`categoryid` INT(3) NOT NULL COMMENT 'id',
`pid` INT(3) NOT NULL COMMENT '父id 没有父则为1',
`categoryname` VARCHAR(10) NOT NULL COMMENT '种类名字',
PRIMARY KEY (`categoryid`)
) ENGINE=INNODB AUTO_INCREMENT=9 CHARSET=utf8;
INSERT INTO `category` (`categoryid`,`pid`,`categoryname`)
VALUES ('2','1','信息技术'),
('3', '1', '软件开发'),
('5', '1', '美术设计'),
('4', '3', '数据库'),
('8', '2', '办公信息'),
('6', '3', 'web开发'),
('7', '5', 'ps技术');
自己的表和自己的表连接,核心:一张表拆为两张一样的表即可
categoryid | categoryname |
---|---|
2 | 信息技术 |
3 | 软件开发 |
5 | 美术设计 |
pid(父类id) | categoryid | categoryname |
---|---|---|
3 | 4 | 数据库 |
2 | 8 | 办公信息 |
3 | 6 | web开发 |
5 | 7 | ps技术 |
操作:查询父类对应子类的关系
父类 | 子类 |
---|---|
软件开发 | 数据库 |
信息技术 | 办公信息 |
软件开发 | web开发 |
美术设计 | ps技术 |
--查询父子信息
SELECT a.`categoryName` AS '先修课程',b.`categoryName` AS '当前课程'
FROM `category` AS a,`category` AS b
WHERE a.`categoryid` = b.`pid`
--查询学生所属的年级(学号,学生的姓名,年纪名称)
SELECT studentNo,studentName,`GraderName`
FROM student s
INNER JOIN `grade` g
ON s.GradeID = g.GradeID
--查询科目所属的年级(科目名称,年纪名称)
SELECT subjectName,`GraderName`
FROM `subject` sub
INNER JOIN `grade` g
ON sub.GradeID = g.GradeID
-- 思考题 查询参加了数据库结构考试的同学的同学信息(学号,学生姓名,科目名,分数)
SELECT studentNo,studentName,subjectName,studentResult
FROM student s
INNER JOIN `subject` sub
ON sub.subjectNo = s.subjectNo
INNER JOIN `grade` g
ON sub.studentNo = s.studentNo
WHERE gradeName = '数据库结构'
分页 limit 和 排序 order by
--查询参加了数据库结构考试的同学的同学信息(学号,学生姓名,科目名,分数)
--对查询到的结果根据程序降序/升序排序
--降序 DESC / 升序 ASC
SELECT s.StudentNo,StudentName,SubjectName,StudentResult
FROM student s
INNER JOIN `subject` sub
ON sub.SubjectNo = s.SubjectNo
INNER JOIN `grade` g
ON g.StudentNo = s.StudentNo
WHERE GradeName = '数据库结构'
ORDER BY StudentResult DESC
--分页,每页只显示五条数据
--语法:limit 当前页,页面的大小
--LIMIT 0,5 0~5 这是第一页
--LIMIT 6,10 6~10 这是第二页
--扩展
--网页应用: 当前 总的页数 页面大小 n代表当前页,pagesize代表页面大小,总页数=总数/页面大小
--LIMIT : 5*(n-1)+1,5*(n-1)+pagesize
SELECT s.StudentNo,StudentName,SubjectName,StudentResult
FROM student s
INNER JOIN `subject` sub
ON sub.SubjectNo = s.SubjectNo
INNER JOIN `grade` g
ON g.StudentNo = s.StudentNo
WHERE GradeName = '数据库结构'
ORDER BY StudentResult DESC
LIMIT 0,5
--思考题 查询’JAVA第一学年'课程成绩排名前十的学生且分数不小于80的学生信息(学号,学生姓名,科目名,分数)
SELECT s.StudentNo,StudentName,SubjectName,StudentResult
FROM student s
INNER JOIN `subject` sub
ON sub.SubjectNo = s.SubjectNo
INNER JOIN `grade` g
ON g.StudentNo = s.StudentNo
WHERE GradeName = 'JAVA第一学年' AND StudentResult >= 80
ORDER BY StudentResult DESC
LIMIT 0,10
为什么要分页?
WHERE (这个值是计算出来的)
子查询的本质:在WHERE语句中嵌套一个子查询语句
--语法
WHERE 字段属性 =/IN (
SELECT...
)
--查询参加了数据库结构考试的同学的同学信息(学号,科目名,分数),降序排列
--方式一使用:连接查询
SELECT StudentNo,r.SubjectNo,StudentResult
FROM result r
INNER JOIN `subject` sub
ON sub.SubjectNo = r.SubjectNo
WHERE SubjectNo = '数据结构'
ORDER BY StudentResult DESC
--方式二:使用子查询
SELECT StudentNo,SubjectNo,StudentResult
FROM result r
WHERE SubjectNo = (
SELECT SubjectNo
FROM `subject` sub
WHERE SubjectNo = '数据结构'
)
ORDER BY StudentResult DESC
--查询分数不小于80分的学生学号和姓名
SELECT DISTINCT s.StudentNo,StudentName,StudentResult
FROM student s
INNER JOIN result r
ON s.StudentNo = r.StudentNo
WHERE StudentResult >= 80
--在这个基础上增加一个科目 是高等数学
--子查询方式:
AND SubjectNo = (
SELECT SubjectNo
FROM subject sub
WHERE SubjectName = '高等数学'
)
--连接查询方式:
--去掉上一行WHERE ,因为WHERE不可以写两个 HAVING可以
INNER JOIN subject sub
ON s.StudentNo = sub.StudentNo
WHERE SubjectName = '高等数学' AND StudentResult >= 80
HAVING 和 GROUP BY
--查询不同课程的平均分,最高分,最低分,且平均分要要大于80分
SELECT Subjectname,AVE(StudentResult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分
FROM result r
INNER JOIN `subject` sub
ON r.SubjectNo = sub.SubjectNo
GROUP BY r.SubjectNo --通过什么字段来分组
HAVING 平均分>80 --过滤过的分组要用HAVING不能用WHERE
数学运算
--数学运算
--绝对值
SELECT ABS(-8)
--向上取整
SELECT CELLING(9.4)
--向下取整
SELECT FLOOR(9.4)
--返回一个0~1之间的随机数
SELECT RAND()
--判断符号,负数返回-1,正数返回1
SELECT SIGN(10)
字符串
--字符串
--字符串长度
SELECT CHAR_LENGTH('不会真的有人会用这些函数吧')
--字符串拼接
SELECT CONCAT('我','正在学','MySql')
--转大写,转小写
SELECT LOWER('SeLEcT')
SELECT UPPER('SeLEcT')
--返回第一次出现的子串的位置
SELECT INSTR('SeLEcT','ect')
--替换字符串
SELECT REPLACE('不会真的有人会用这些函数吧','会用这些函数','只看视频不实操')
--....
时间和日期(比较重要,数据库内使用比较频繁)
--时间和日期
--获取当前日期
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(StudentNo) FROM `student` --会忽略null的值
SELECT COUNT(*) FROM `student` --不会忽略null的值
SELECT COUNT(1) FROM `student` --不会忽略null的值
--其余示例
SELECT SUM(`StudentResult`) AS 总和 FROM `result`
SELECT AVG(`StudentResult`) AS 平均分 FROM `result`
SELECT MAX(`StudentResult`) AS 最大值 FROM `result`
SELECT MIN(`StudentResult`) AS 最小值 FROM `result`
--查询不同课程的平均分,最高分,最低分,且平均分要要大于80分
SELECT Subjectname,AVE(StudentResult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分
FROM result r
INNER JOIN `subject` sub
ON r.SubjectNo = sub.SubjectNo
GROUP BY r.SubjectNo --通过什么字段来分组
HAVING 平均分>80 --过滤过的分组要用HAVING不能用WHERE
MD5
信息摘要算法,主要增强算法复杂度和不可逆性。
MD5 不可逆,具体的值的MD5是一样的
MD5破解网站原理,背后有一个字点,MD5加密后的值,加密的前值
--测试MD5 加密
CREATE TABLE 'testmd5'(
`id` INT(4) NOT NULL,
`name` VACHAR(20) NOT NULL,
`pwd` VACHAR(50) NOT NULL,
PRIMARY KEY(`id`)
)ENGINE = INNODB DEFAULT CHARSET = utf8
--明文密码
INSERT INTO testmd5 VALUES(1,'测试人员1','123456'),(2,'管理员','7894561')
--加密指定密码
UPDATE testmd5 SET pwd=MD5(pwd) WHERE id = 1
--加密全部密码
UPDATE testmd5 SET pwd=MD5(pwd)
--在插入的时候加密
INSERT INTO testmd5 VALUES(3,'测试人员2',MD5('123456'))
--如何校验:将用户传递进来的密码,进行MD5加密,然后比对加密值
SELECT * FROM testmd5 WHERE `name` = '测试人员2' AND `psd` = MD5('123456')