MySql - 基础学习5 - select
一.分页和排序
-- 分页 limit 和排序 order by -- 排序 ;升序 ASC ,降序 -- 升序 SELECT s.`id`,`name`,`paw`,`gradename` FROM student AS s INNER JOIN grade AS g ON s.id=g.`gradeid` ORDER BY `name` ASC -- 降序 SELECT s.`id`,`name`,`paw`,`gradename` FROM student AS s INNER JOIN grade AS g ON s.id=g.`gradeid` ORDER BY `name` DESC -- 为什么要分页 -- 缓解数据库压力,给人的体验更好 -- 瀑布流,没有分页,无限往下刷 -- 分页 每页只显示五条数据 -- 语法:limit 当前页,页面大小 -- limit 0,5 1~5 页 SELECT s.`id`,`name`,`paw`,`gradename` FROM student AS s RIGHT JOIN grade AS g ON s.id=g.`gradeid` LIMIT 2,5 -- 网页应用 当前页,总的页数,页面大小 -- 第一页 limit 0,5 (1-1)*5 -- 第二页 limit 5,5 (2-1)*5 -- 第三页 limit 10,5 (3-1)*5 -- 第n页 limit (n-1),5 (n-1)*5 -- pageSize:页面大小 -- (n-1)*pagesize :起始值 -- n:当前页 -- 数据总数 / 页面大小 = 总页数
语法:
排序 order by 用什么字段排 升序还是降序(ASC)(DESC)
分页 limit 起始数据位置 页面大小
二.子查询
where (值是固定的,有一个范围的)
子查询:在where语句中嵌套一个查询语句
where(这个值是计算出来的)
SELECT s.`id`,`name`,`paw`,`gradename` FROM student AS s RIGHT JOIN grade AS g ON s.id=g.`gradeid` WHERE paw =( SELECT paw FROM student WHERE id=3 )
子查询:由里及外的查询数据,先执行括号里面的,后执行外面部分
三.MySql函数
1.常用函数
-- 常用函数 -- 数学运算 SELECT ABS(-8) -- 绝对值 SELECT CEILING(9.3) -- 向上取整 SELECT FLOOR(6.7) -- 向下取整 SELECT RAND() -- 返回一个0 ~ 1 之间的随机数 SELECT SIGN(0) -- 判断一个数的符号 0=0 10=1 -10=-1 -- 字符串函数 SELECT CHAR_LENGTH('一个右边腿') -- 字符串的长度 SELECT CONCAT('我','爱好:','女') -- 字符串连接 SELECT INSERT('我爱好女',1,1,'我超级') -- 字符串替换~插入字符串,字符串,从那个位置替换,要替换的长度,替换的字符串 SELECT LOWER('NsSb') -- 字符串转换为小写(字母类的) SELECT UPPER('NsSb') -- 字符串转换为大写 SELECT INSTR('nserbi','r') -- 返回字符第一次出现的位置 SELECT REPLACE('abcdef','bc','cb') -- 替换字符串 SELECT SUBSTR('nishisb',3,3) -- 截取字符串 SELECT REVERSE('bbihsow') -- 反转字符串 -- 把名字叫马的同学改为叫刘 SELECT REPLACE(`name`,'马','刘') FROM student WHERE `name` LIKE '马%' -- 时间和日期函数 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()
2.聚合函数
函数名称 | 描述 |
COUNT() | 计数 |
SUM() | 求和 |
AVG() | 平均值 |
MAX() | 最大值 |
MIN() | 最小值 |
...... | ... |
-- 统计表中的记录 SELECT COUNT(`name`) FROM student -- count(字段),会忽略所有的null值 SELECT COUNT(1) FROM student -- count(1),不会忽略null值,有记录就一直查 SELECT COUNT(*) FROM student SELECT MAX(id) AS 最高分 FROM student SELECT g.gradeid,`name`,gradename FROM stdent1 s INNER JOIN `grade` g ON s.id=g.gradeid GROUP BY gradeid
三.MD5加密
什么是MD5?
主要是增强算法复杂度和不可逆特性
-- 测试MD5加密 CREATE TABLE `testmd5`( `id` INT(4) NOT NULL, `name` VARCHAR(20) NOT NULL, `ped` VARCHAR(15) NOT NULL, PRIMARY KEY (`id`) )ENGINE=INNODB DEFAULT CHARSET=utf8 INSERT INTO `testmd5` VALUES(1,'zhangsan','123456'),(2,'lisi','654321'),(3,'wangwu','987654') -- 数据加密 UPDATE `testmd5` SET pwd=MD5(pwd) ALTER TABLE `testmd5` CHANGE ped pwd VARCHAR(60) -- 一般在插入的时候加密 INSERT INTO `testmd5` VALUES(4,'zhangsan',MD5('123456')) -- 通过用户传进来的密码,加密后比对 SELECT * FROM `testmd5` WHERE `name`='zhangsan' AND pwd=MD5('123456')
四.slect:完结
left inner right ---- on :联合查询
where :指定结果需要满足的条件
group by :指定结果需要用那几个字段来分组
having :过滤分组的记录需要满足的次要条件
order by :指定查询出来记录进行排序,升序ASC,降序DESC
limit :分页,查询的记录,从那条到那条
五.事务
ACID
原子性 (atomicity):要么都成功,要么都失败
一致性(consistency):事务发生前后要保证数据的一致性:例如两个人转账,总值1000,不管怎么转账,最终都是1000
持久性(durability): 事务不提交就不会发生变化,但是一旦提交就不可逆,会持久化到数据库中
隔离性(isolation) :事务的隔离性是指,多个用户对同一个用户发起事务时,数据库会给每一个用户开启事务,事务之间不能相互干预,要互相隔离
隔离所产生的问题:
- 脏读:指一个事务读取了另一个事务未提交的数据。
- 不可重复读:在一个事务内读取某一行数据,多次读取的结果不同(这个不一定是错误,可能是某些时候场合不对)
- 虚读(幻读):是指在一个事务内读取到了别的事务新插入的数据,导致读取前后不一致。
事务的实现流程(一般过程)
-- ======事务======= -- mysql是默认开启事务自动提交的 SET autocommit = 0;/*关闭*/ SET autocommit = 1;/*开启*/ -- 手动处理事务 -- 事务开启 START TRANSACTION -- 标记一个事务的开始,从这个语句以后,所有的sql都在一个事务内 INSERT xx INSERT xx -- 提交:持久化(成功!) -- 回滚:回到原来的样子(失败!) ROLLBACK -- 事务结束 SET autocommit = 1; -- 开启自动提交 -- 拓展 SAVEPOINT -- 保存点,设置一个事务的保存点 ROLLBACK SAVEPOINT -- 回滚到保存点 RELEASE SAVEPOINT -- 删除保存点
实例:模拟转账场景
-- 转账所需库 CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci USE shop CREATE TABLE `account`( `id` INT(3) NOT NULL AUTO_INCREMENT, `name` VARCHAR(30) NOT NULL, `money` DECIMAL(9,2) NOT NULL, PRIMARY KEY (`id`) )ENGINE = INNODB DEFAULT CHARSET=utf8 INSERT INTO `account`(`name`,`money`) VALUES('A',2000.00),('B',10000.00) -- 模拟转账 SET autocommit = 0; -- 关闭自动提交 START TRANSACTION -- 开启一个事务 UPDATE `account` SET money = money +1000 WHERE id=1 UPDATE `account` SET money = money -1000 WHERE id=2 COMMIT; -- 提交事务 ROLLBACK; -- 回滚 SET autocommit = 1; -- 开启自动提交
六.索引的分类
1.主键索引(PRIMARY KEY):唯一的标识,不可以重复,只能有一个列作为主键
2.唯一索引(UNIQUE KEY):避免重复列出现,唯一索引可以重复,多个列可以标识唯一索引
3.常规索引(KEY/INDEX):默认的,index。key来设置
4.全文索引(FullText):特定的数据库引擎才有,myisam,快速定位数据