MySQL学习笔记第三天
自连接
自己的表和自己的表连接,核心:一张表拆为两张一样的表
--查询父子信息,把一张表看成两张一模一样的表 SELECt a.categoryName AS'父栏目',b.categoryName AS'子栏目' FROM category AS a,category AS b WHERe a.categoryid=b.pid
3.4分页和排序
排序
–分页(LIMIT)和排序(ORDER BY)=====
–排序 :升序ASC、降序DESC
–语法:ORDER BY 要排序的字段名 ASC|DESC
分页
–每页只显示五条数据
–语法:LIMIT起始值,页面的大小
SELECt s.id,name,subName,score
FROM student s
RIGHT JOIN score sc
ON s.id = sc.id
INNER JOIN subject AS su
ON su.id = sc.id
ORDER BY score ASC
LIMIT 0,5
–查询java第一学年成绩排名前十的学生,并且分数要大于八十,(学号,姓名,课程名称,分数)
SELECt sc.id,name,subName,score
FROM score sc
INNER JOIN student s
ON sc.id=s.id
INNER JOIN subject su
ON sc.subNo=su.subNo
WHERe socre>80 AND subName=‘java第一学年’
ORDER BY DESC
LIMIT 0,10
3.5子查询
where(这个值是计算出来的)
本质:在where语句中嵌套一个子查询语句
--============子查询================
--查询数据库结构-1 的所有考试结果(学号,科目编号,成绩),降序排列
--方式一:使用连接查询
SELECt id,sc.subNo,score
FROM score sc
INNER JOIN `subject` su
ON sc.subNo=su.subNo
WHERe subName='数据库结构-1'
ORDER BY score DESC
--方式二:使用子查询
SELECt id,subNo,score
FROM score
WHERe subNo=(
SELECt subNo
FROM `subject`
WHERe subName='数据库结构-1'
)
ORDER BY score DESC
--查询高等数学分数不小于八十分的学生的学号和姓名
SELECt DISTINCT id,stuName
FROM student
WHERe id IN(
SELECt id FROM score
WHERe score>=80 and subNo=(SELECt subNo from subject
WHERe subName='高等数学')
)
4.mysql函数
4.1常用函数
数学运算
abs() 绝对值
Ceiling() 向上取整
FLOOR 向下取整
RAND() 0-1之间的随机数
SIGN() 判断一个数的符号 0-0 负数-(-1) 正数-1
字符串函数
CHAR _LENGTH() 字符串长度
concat() 拼接字符串
INSERT() --查询,替换
LOWER() 转小写
UPPER() 转大写
now() 获取当前的时间
4.2聚合函数(常用)
函数名称 描述
COUNT() 计数
SUM() 求和
AVG() 平均值
MAX() 最大值
MIN() 最小值
--==============聚合函数========================= --都能够统计表中的数据 SELECt COUNT(studentnam) FROM student --会忽略所有的NULL值 SELECt COUNT(*) FROM student --不会忽略NULL值 SELECt COUNT(1) FROM student --不会忽略NULL值 本质:计算行数 -========================================= --查询不同课程的平均分,最高分,最低分 --核心 : 根据不同的课程分组 SELECt subName, AVG(score) AS 平均分,MAX(score) AS 最高分,MIN(score) AS 最低分,平均分大于八十 FROM score sc INNER JOIN `subject`su ON sc.subNo = su.subNo GROUP BY subNo --通过什么字段来分组 HAVINg 平均分>80
4.3数据库级别的MD5加密(扩展)
MD5不可逆 具体的值的MD5值是一样的
MD5破解网站的原理,背后有一个字典,MD5加密后的值,加密前的值
5.查询语言小结
select distinct 【要查询的字段】from [表名]
XXX join 【表名】
on 【字段交集】
where【过滤条件】
group by 【字段名】
having 【过滤条件】
order by【字段名】 asc(desc)
limit (a,b) a:起始位置 b:页面容量
6.事务
什么是事务
要么都成功,要么都失败
1.SQL执行 A给B转账
2.SQL执行 B收到A的钱
将一组SQl放在一个批次中执行
事务原则 ASID原则:原子性,一致性,隔离性,持久性 (脏读,幻读)
原子性
要么都成功要么都失败
一致性
事务前后的数据要保持一致,
隔离性
多个用户并发访问数据库时,数据库为每个用户开启的事务,不能被其他事务的操作数据所干扰
持久性
事务一旦提交就不可逆,持久化保存到数据库中
--=================事务======================== --mysql是默认开启事务自动提交的 SET autocommit = 0 --关闭 SET autocommit = 1 --开启(默认) --手动处理事务 SET autocommit=0 --关闭自动提交 --事务开启 START TRANSACTION --标记一个事务的开始从这个之后的SQL都在同一个事务内 --提交:持久化(成功!) COMMIT --回滚:回到原来的样子(失败) ROLLBACK --事务结束 SET autocommit = 1 --开启自动提交 --了解 SAVEPOINT 保存点名 --设置一个事务保存点 ROLLBACK TO SAVEPOINT 保存点名 --回滚到保存点 RELEASE SAVEPOINT 保存点名 --撤销保存点 --========================例子================================= SET autocommit=0; --关闭自动提交 START TRANSACTION --开启一个事务 UPDATE account SET money=money-500 WHERe `name`='A' --A减500块 UPDATE account SET money=money+500 WHERe `name`='B' --B+500块 COMMIT; --提交 事务一旦被提交就持久化了 ROLLBACK; --回滚 SET autocommit=1; --恢复自动提交
7.索引
索引是帮助mysql高效获取数据的数据结构;
7.1索引的分类
主键索引(primary key)
唯一标识 ,主键不可重复,只能有一个列作为主键
唯一索引(unique key)
避免重复的列出现,唯一索引可以重复,多个列都可标识为唯一索引
常规索引(key /index)
默认的 key index来设置
全文索引(fulltext)
在特定数据库引擎下才有快速定位数据



