mysql学习(二)

1|0一、常用函数

-- =============常用函数================== -- 数学运算 SELECT ABS(-8) -- 绝对值 SELECT CEILING(9.4) -- 向上取整 SELECT FLOOR(9.4) -- 向下取整 SELECT RAND() -- 0到1之间随机数 SELECT SIGN(-10) -- 返回符号,0返回0,负数返回-1,正数返回1 -- 字符串 SELECT CHAR_LENGTH('我是说') -- 字符串长度 SELECT CONCAT('','认识','') -- 拼接字符串 SELECT INSERT('我认识你',2,2,'见过') -- 替换x位置长度为y的字符串‘我见过你’ SELECT INSERT('我认识你',2,0,'') -- 插入x位置的字符串‘我不认识你’ SELECT LOWER(Ssr) -- 小写 SELECT UPPER(Ssr) -- 大写 SELECT INSTR('shanghai','h') -- 返回第一次出现子串的位置 SELECT REPLACE('那年十八','','') -- 替换出现的指定字符串 SELECT SUBSTR('12345678',3,3) -- 截取字符串,起始位置,截取数量 SELECT REVERSE('123') -- 反转 -- 查询姓周的同学,改成邹 SELECT REPLACE(studentname,'','') FROM student WHERE student LIKE '周%' -- 时间和日期函数(记住) SELECT CURRENT_DATE() -- 获取当前日期 SELECT NOW() -- 时间 -- 系统 SELECT USER() -- 当前用户 SELECT VERSION() -- 当前版本

2|0分页和排序

2|1排序:

-- =============================分页limit 和排序order by=========================================== -- 排序:升序asc 降序 desc -- ORDER BY 通过哪个字段排序,怎么排 -- 查询结果根据成绩升序,降序 SELECT s.studentno AS '学号',studentname AS '姓名',subjectname AS '科目名称',studentresult AS '分数' FROM student AS s RIGHT JOIN result AS r ON s.studentno=r.studentno INNER JOIN `subject` AS sub ON r.subjectno=sub.subjectno WHERE subjectname='高等数学-1' ORDER BY studentresult DESC

2|2分页

-- 分页,每页只显示两条数据 -- 语法:limit 起始值,页面大小 -- 网页应用 :当前页,总的页数,页面的大小 -- LIMIT 0,2 第一条数据后的两条数据 -- LIMIT 2,2 第三条数据后的两条数据 SELECT s.studentno AS '学号',studentname AS '姓名',subjectname AS '科目名称',studentresult AS '分数' FROM student AS s RIGHT JOIN result AS r ON s.studentno=r.studentno INNER JOIN `subject` AS sub ON r.subjectno=sub.subjectno WHERE subjectname='高等数学-1' ORDER BY studentresult DESC LIMIT 4,2 -- 网页应用 :当前页,总的页数(数据总是除以页面大小向上取整),页面的大小 -- 第一页 LIMIT 0,2 (1-1)*2 -- 第二页 LIMIT 2,2 (2-1)*2 -- 第三页 LIMIT 4,2 (3-1)*2 -- 第N 页 LIMIT (n-1)*pagesize,pagesize

3|0子查询

-- ========================where============================ -- 1.查询高等数学1所有考试结果(学号,科目编号,成绩),降序 -- 方式1:使用连接查询 SELECT `studentno`,r.`subjectno`,`studentresult` FROM `result` AS r INNER JOIN `subject` AS sub ON r.subjectno = sub.subjectno WHERE subjectname = '高等数学-1' ORDER BY studentresult DESC -- 方式2:使用子查询(由内到外) SELECT `studentno`,`subjectno`,`studentresult` FROM result WHERE subjectno=( SELECT subjectno FROM `subject` WHERE subjectname = '高等数学-1' ) ORDER BY studentresult DESC -- 查询科目为高等数学1,且成绩大于80分的学生(学号,姓名) SELECT studentno,studentname FROM student WHERE studentno IN( SELECT studentno FROM result WHERE studentresult>=80 AND subjectno=( SELECT subjectno FROM `subject` WHERE subjectname = '高等数学-1' ) )

4|0二、事务

事务原则:ACID原则  原子性,一致性,隔离性,持久性

原子性(要么都成功,要么都失败)

一致性(事务前后的数据完整性保持一致)

隔离性(多个并发事务之间要隔离)

持久性(事务一旦提交就不可逆,被持久化到数据库中)

隔离所导致的一些问题

4|1脏读:指一个事务读取了另外一个事务未提交的数据

4|2不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)

4|3虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致。

 

-- mysql是默认开启事务自动提交的 SET autocommit = 0 /*关闭*/ SET autocommit = 1 /*开启*/ -- 手动处理事务 SET autocommit = 0 -- 关闭自动提交 -- 事务开启 START TRANSACTION -- 标记一个事务的开始,从这个之后的sql都在同一个事务内 INSERT XX INSERT XX -- 提交:持久化(成功) COMMIT -- 回滚:回到原来的样子(失败) ROLLBACK -- 事务结束 SET autocoment = 1 -- 开启自动提交 -- 了解 SAVEPOINT 保存点名 -- 开启一个事务的保存点 ROLLBACK TO SAVEPOINT 保存点名 -- 回滚到保存点 RELEASE SAVEPOINT 保存点名 -- 撤销保存点

5|0 三、索引

索引的分类:

  • 主键索引(PRIMARY KEY):唯一的标识,主键不可重复,只能有一个列作为主键
  • 唯一索引(UNIQUE KEY):避免重复的行出现,多个列都可以标识为唯一索引
  • 常规索引(KEY/INDEX):默认的:
  • 全文索引(FullText):在特定数据库引擎下才有,MyISAM,快速定位数据
-- 显示所有的索引信息 SHOW INDEX FROM student -- 增加一个全文索引(索引名,列名) ALTER TABLE SCHOOL.student ADD FULLTEXT INDEX `studentname`(`studentname`); -- EXPLAIN 分析sql执行的状况 EXPLAIN SELECT * FROM student; -- 非全文索引 EXPLAIN SELECT * FROM student WHERE MATCH(studentname) against('');

 为了更加直观的看到索引的用处

先创建一个表

CREATE TABLE `app_user` ( `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) DEFAULT'' COMMENT'用户昵称', `email` VARCHAR(50) NOT NULL COMMENT'用户邮箱', `phone` VARCHAR(20) DEFAULT'' COMMENT'手机号', `gender` TINYINT(4) UNSIGNED DEFAULT '0'COMMENT '性别(0:男;1:女)', `password` VARCHAR(100) NOT NULL COMMENT '密码', `age` TINYINT(4) DEFAULT'0' COMMENT '年龄', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP, `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT = 'app用户表'

在表中插入一百万个数据

DROP FUNCTION IF EXISTS mock_data; -- 写函数之前必须要写,标志:$$ DELIMITER $$ CREATE FUNCTION mock_data() RETURNS INT -- 注意returns,否则报错。 BEGIN DECLARE num INT DEFAULT 1000000; -- num 作为截止数字,定义为百万, DECLARE i INT DEFAULT 0; WHILE i < num DO INSERT INTO app_user(`name`, `email`, `phone`, `gender`, `password`, `age`) VALUES(CONCAT('用户', i), CONCAT('100',i,'@qq.com'), CONCAT('13', FLOOR(RAND()*(999999999-100000000)+100000000)),FLOOR(RAND()*2),UUID(), FLOOR(RAND()*100)); SET i = i + 1; END WHILE; RETURN i; END;

查询结果如下

SELECT mock_data(); SELECT *FROM app_user WHERE `name` = '用户9999'; -- 0.779 sec SELECT *FROM app_user WHERE `name` = '用户9999'; -- 0.001 sec 创建索引后 SELECT *FROM student -- id_表名_字段名 -- create index 索引名 on 表(字段) CREATE INDEX id_app_user_name ON app_user(`name`);

从查询时间来看,索引在数据量小的时候,用处不大,但在大数据的时候区别十分明显

索引原则

  • 索引不是越多越好
  • 不要对进程变动的数据加索引
  • 小数据量的表不需要加索引
  • 索引一般加载常用查询的字段上

http://blog.codinglabs.org/articles/theory-of-mysql-index.html   这篇文章是对索引以及计算机底层原理的解释

6|0数据用户管理

-- 创建用户 create user 用户名 identified by '密码' CREATE USER kkk IDENTIFIED BY '123456' -- 修改密码(修改当前用户密码) SET PASSWORD = PASSWORD('123177') -- 修改指定用户的密码 SET PASSWORD FOR kkk = PASSWORD('121345') -- 重命名 RENAME USER 原来的名字 To 新的名字 RENAME USER kkk TO kkk2 -- 用户授权 ALL PRIVILEGES 全部的权限 -- ALL PRIVILEGES除了不能给别人授权外,其他的都可以 GRANT ALL PRIVILEGES ON *.* TO kkk2 -- 查询权限 SHOW GRANTS FOR kkk2 -- 查看指定用户的权限 SHOW GRANTS FOR root@localhost -- 撤销权限 .代表全局的权限 REVOKE ALL PRIVILEGES ON *.* FROM kkk2 -- 删除用户 DROP USER kkk2

 


__EOF__

本文作者userName
本文链接https://www.cnblogs.com/20kkk/p/16583511.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   鹅城小铁匠  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
Fork me on GitHub
点击右上角即可分享
微信分享提示