MySQL基础知识归纳
配置
mysql的配置文件在位于安装目录下,my.ini文件中可以对mysql基本信息进行设置,注意更改完成后需要重启服务
数据库SQL
/*显示所有数据库*/
SHOW DATABASES;
/*进入数据库*/
USE MYSQL1;
/*显示所有表*/
SHOW TABLES;
/*查看当前所在库*/
SELECT DATABASE();
/*创建表*/
CREATE TABLE student(
id int,
name varchar(20));
/*查看表结构*/
DESC student;
/*查看MySQL版本*/
SELECT VERSION();
常用SQL
/*SQL顺序*/
SELECT [ALL | DISTINCT]
{* | TABLE.* |[TABLE.field1[AS alias1][,TABLE.field2[AS alias2]][...]]}
FROM table_name[AS table_alias]
[left | right | inner join table table_name2] --联表查询
[where ...] --指定条件
[group by ...] --分组
[having] --过滤分组必须满足的次要条件
[order by ...] --排序
[limit {[Offeset,]row_cout | row_countOFFSET offset}] --分页
/*insert*/
INSERT INTO student(id,name) values(1, 'xiaohua');
/*update*/
UPDATE student SET name = 'xiaohua' WHERE id = 1;
/*delete
表结构与索引不变
不会重新设置自增列
*/
DELETE FROM student WHERE id = 1;
/*truncate 清空表数据
表结构与索引不变
重新设置自增列,但计数器不会归零
不会影响事务*/
TRUNCATE TABLE student
/*取别名*/
SELECT id AS 学生号,name 姓名 FROM student;
查询SQL
/*
select from
基础查询******************************************************
*/
SELECT * FROM student;
/*取别名*/
SELECT id AS 学生号,name 姓名 FROM student;
/*去重*/
SELECT DISTINCT id AS '学 号' FROM student;
/* + 的用法仅有运算符,一方为null,结果为null,下方’123‘转换整数失败即为整数0,结果为1*/
SELECT '123'+1;
/*字符串拼接*/
SELECT CONCAT(last_name,first_name) FROM student;
/*字符串拼接需要注意null问题,first_name为null时候显示''*/
SELECT CONCAT(last_name,IFNULL(first_name,'')) AS 姓名 FROM student;
/*
select from where
条件查询**********************************************************
条件运算:> < = != <>(!=) >= <=
逻辑运算:and or not
模糊查询:like between and in is null
*/
/*查询学生中第三个字符为e,第五个字符为a的学生信息*/
SELECT * FROM student WHERE name like '__e_a%';
/*查询年龄在[17,22]区间的学生,and的简约写法*/
SELECT * FROM student WHERE age BETWEEN 17 AND 22;
/*查询张三,李四,王五的信息,or的简约写法*/
SELECT * FROM student WHERE name IN('张三','李四','王五');
/* =, != 无法判断null,null需要使用is,is not判断,<=>是安全等于,不受null限制*/
单行函数
/*
排序查询***********************************************************
order by
asc 升序
desc 降序
*/
SELECT * FROM student ORDER BY age ASC;
/*按年薪高低显示员工信息和年薪*/
SELECT *, salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM employees
ORDER BY 年薪 DESC;
/*先按学生年龄降序,再按学生名字字节长度升序显示学生信息*/
SELECT *
FROM student
ORDER BY age DESC, LENGTH(name) ASC;
/*
字符函数**********************************************************
length() 返回字节数
concat() 拼接字符串
upper() 字符转大写
lower() 字符转小写
substr(str,n) 字符截取
instr(str,s) 返回子字符起始位置
trim() 去空格
lpad(str,n,s) 以s按n长度左填充str
replace() 替换
*/
/*
数学函数***************************************************************
round() 四舍五入
ceil() 向上取整
floor() 向下取整
truncate(1.22,1)截断,结果为1.2
Mod(m,n) 取余,m%n(取余结果符号与m一致)
*/
/*
日期函数****************************************************************
now() 当前日期+时间
curdate() 返回当前日期
curtime() 返回当前时间
year(now())
month(now())
monthname(now())
str_to_date('2020-12-2','%Y-%m-%d') 字符转日期
date_format('2020/12/2','%Y年%m月%d日') 日期转字符
*/
/*
流程控制函数**************************************************************
if(false,'yes','no') 按三元函数部署
case用法:
java中:
switch(变量){
case 常量1:语句1;break;
.....
default:语句;break;
}
sql中:(case 后写条件是java的switch,不写条件是多重else if)
case 变量/条件
when 常量1 then 语句1;/值1
.......
else 语句;/值
end;
*/
SELECT salary 原工资, department_id 部门,
CASE department_id
WHEN 1 THEN salary*1.1
WHEN 2 THEN salary*1.2
ELSE salary
END AS 新工资
FROM employees;
分组函数
常用函数
/*
分组函数**********************************************************************
sum()
avg()
count()
max()
min()
特点:
sum,avg一般用于处理数据类型
max,min,count处理类型不限
分组函数都忽略null值
count(*) 不会忽略null
count(1) 不会忽略null,相比count(1)通常效率更高
*/
group by 列名 having 条件
/*
HAVING分组条件**********************************************************************
过滤分组必须满足的次要条件,作用类似where,放置在GROUP BY 之后
*/
/*查询平均分大于80的课程的平均分以及最高分*/
SELECT subject_name, AVG(student_result) AS 平均分,MAX(student_result) AS 最高分
FROM result r
INNER JOIN subject sub
ON r.subject_id = sub.subject_id
GROUP BY r.subject_id
HAVING 平均分 > 80
实例:
SELECT SUM(salary),AVG(salary),COUNT(DISTINCT salary) FROM empleyees;
/*查询员工表中最早入职时间与最晚入职时间相差天数*/
SELECT DATEDIFF(MAX(hiredate),MIN(hiredate)) FROM empleyees;
/*查询各工种平均工资*/
SELECT AVG(salary) FROM empleyees GROUP BY job_id;
/*查询每个领导手下,有奖金的工资最高的工资*/
SELECT MAX(salary), mannager_id
FROM empleyees;
WHERE commission_pct IS NOT NULL;
GROUP BY manager_id
连接查询
采用sql99标准,按功能分三类
-
内连接
-
等值连接
/*查询每个工种的工种名和员工的个数,并且按员工个数降序*/ SELECT job_title, COUNT(*) FROM employees e, jobs j WHERE e.job_id = j.iob_id GROUP BY job_title ORDER BY COUNT(*) DESC;
-
非等值连接
/*查询员工工资与工资级别*/ SELECT salary, gred_level FROM employees e, job_grades g WHERE salary BETWEEN g.lowest_sal AND g.highest_sal
-
自连接
/*查询员工名与其上级名称*/ SELECT e.name employees_name, m.name manager_name FROM employees e,employees m WHERE e.manager_id = m.employees_id
-
-
外连接
外连接查询显示主表所有记录,如果从表有和它匹配的,则显示匹配的值,没有和它匹配的显示null
-
INNER连接
inner join == join,交集
/*查询 JAVA第一学年,成绩要大于80的学生信息,按成绩排名(学号,姓名,课程名称,分数)*/ SELECT s.student_id, student_name, subject_name, result FROM student s INNER JOIN subject sub ON s.student_id = sub.student_id INNER JOIN result r ON sub.subject_id = r.subject_id WHERE sub.subject_name = 'JAVA第一学年' AND r.result > 80 ORDER BY r.result DESC
-
左外连接
left join 左边的是主表
-
右外连接
right join 右边的是主表
-
全外连接
两表的合集
-
-
交叉连接
cross join,笛卡尔乘积
分页查询
limit 起始值,页面大小
规律:第n页 LIMIT (n-1)*pageSize, pageSize;
pageSize:页面大小
(n-1)*pageSize:起始值
n:当前页
总页数 = 数据总数 / 页面大小
SELECT * FROM student
FROM student
WHERE sex = '男'
ORDER BY age ASC
LIMIT 1, 10;
/*查询 JAVA第一学年,课程成绩排名前十,成绩要大于80的学生信息(学号,姓名,课程名称,分数)*/
SELECT s.student_id, student_name, subject_name, result
FROM student s
INNER JOIN subject sub
ON s.student_id = sub.student_id
INNER JOIN result r
ON sub.subject_id = r.subject_id
WHERE sub.subject_name = 'JAVA第一学年' AND r.result > 80
ORDER BY r.result DESC
LIMIT 1, 10;
事务
什么是事务?**
可以简单理解为一组sql的集合,具有原子性,要么都成功,要么都失败
ACID原则:原子性,一致性,隔离性,持久性 (脏读,幻读)
原子性:要么都成功,要么都失败
一致性:事务操作前后的状态保持一致,如转钱前后钱的总额不能改变
隔离性:事物执行过程中不受其他操作影响
持久性:若事务没有提交应当回滚为原始数据,若已经提交应当持久化到数据库(不可逆)
脏读:一个事务读取了另一个事务未提交的数据(如两地同时取钱,最终总额不一致)
幻读:一个事务读到了别的事务新插入的数据导致前后不一致(一般是行影响,多了一行)
不可重复读:一个事务对事务的多次读取结果不同
怎么用?
SET autocomit = 0 --关闭事务自动提交设置
START TRANSACTION --开启事务
...
SAVEPOINT 保存点名称 --创建保存点
--回滚到保存点
ROLLBAKE TO SAVEPOINT 保存点名称
--删除保存点
RELEASE SAVEPOINT 保存点名称
...
COMMIT --提交事务
ROLLBACK --回滚事务
SET autocommit = 1 --开启事务自动提交设置
索引
索引是帮助MySQL高效获取数据的数据结构
-
分类
-
主键索引(PRIMARY KEY)
- 主键不可重复,只能有一个列作为主键
-
唯一索引(UNIQUE KEY)
- 避免列名重复
-
常规索引(KEY/INDEX)
- 默认索引
-
全文索引(FULLTEXT)
- 特定引擎下才有,快速定位数据
-
-
使用
-
建表的时候给字段增加索引
SHOW INDEX FROM student --显示表所有索引信息 --增加一个全文索引 列名(索引名) ALTER TABLE school.student ADD FULLTEXT INDEX student_name(student_name); --EXPLAIN 分析SQL执行状况 EXPLAIN SELECT * FROM student --常规索引 EXPLAIN SELECT * FROM student WHERE MATCH(student_name) AGAINS('小华') --全文索引
-
给建好的表某字段添加索引
CREATE INDEX id_daName_tableName_name on tableName(name);
-
-
索引原则
- 索引不是越多越好
- 不要对常变动的数据加索引
- 小数据量的表不用加索引
- 索引一般加在常常被查询的字段上
-
索引的数据结构(了解)
- hash类型的索引
- Btree(innoDB引擎默认索引)
范式
范式:符合一定规范的形式
-
第一范式:(原子性)每一列不可再分割
-
第二范式:(主键)有唯一标识符
-
第三范式:(外键)一个表中的数据不能同时是其他表里的非主键数据
-
反三范式:有时候为了查询效率,可以违背第三范式
备份
-
直接拷贝物理文件
-
可视化工具中备份
-
命令行mysqldump备份(会导出SQL命令的合集文件)
#导出数据库[表] #mysqldump -h主机 -u用户名 -p密码 数据库 [表名1 ...] > 物理磁盘位置/文件名 mysqldump -hlocalhost -uroot -p123456 school student >D:/database/mysql.sql #导入数据库[表] #登录情况下: source D:/database/mysql.sql #未登录的情况下 mysql -u用户名 -p密码 数据库 < 物理磁盘位置/文件名
MD5加密
什么是MD5?
数据库级别MD5加密,主要增强算法复杂度和不可逆性
不可逆的特性让它安全性更高,我们无法通过数据库知道用户输入的密码是什么
如何用?
--明文密码
INSERT INTO user VALUES(1, 'howe', '123456'), (2, 'xiaohong', '123456');
--MD5加密,sql执行后数据库中将储存被加密后的密码
UPDATE user SET pwd = MD5(ped) WHERE id = 1;
--插入数据时就进行MD5加密
INSERT INTO user VALUES(3, 'xiaohua', MD5('123456'));
--校验
SELECT * FROM user WHERE name = 'xiaohua' AND pwd = MD5('123456');
本文地址:https://blog.csdn.net/weixin_42049458/article/details/110633228
下一篇: Python装饰器如何实现修复过程解析