说明:Mysql很久就学过,但学了忘忘了学,很难受。因此这篇文章纯粹是为了记录一些学习笔记,以便后面复习,如有记录有误的地方,忘指出!
第二部分:Mysql数据库基础知识(二)之 连接查询----子查询-----分页查询------union联合查询
第三部分:Mysql数据库基础知识(三)之:数据的增删改
第四部分:Mysql数据库基础知识(四)之:库表的管理、数据类型、约束
第五部分:Mysql数据库基础知识(五)之:视图、变量、存储过程、函数、流程控制结构
一、Mysql常用DOC命令行
1、进入数据库(本地)
mysql -u"用户名" -p"密码"
mysql -uroot -p123456
2、使用数据库
use 数据库名;
3、显示所有的数据库
show databases;
4、显示表的结构
desc 表名;
5、CRUD(增删改查就跟正常的sql语句一样)
6、退出
exit;
------------------------------------------------------------------------------------------------------------------------------------
二、DQL(数据查询语言) select操作
1、基础查询
语法:
select 查询列表 from 表名;
特点:
1)、查询的结果集 是一个虚拟表
2)、select 查询列表 类似于System.out.println(打印内容);
select后面跟的查询列表,可以有多个部分组成,中间用逗号隔开
例如:select 字段1,字段2,表达式 from 表;
3)、执行顺序
① from子句
② select子句
4)、查询列表可以是:字段、表达式、常量、函数等
以查询所有的信息为例:select * from employees;
5)、起别名
方式一:使用as关键字
SELECT last_name AS 姓名 FROM employees;
方式二:使用空格
SELECT last_name 姓名 FROM employees;
6)、DISTINCT的使用
作用:去掉查询里面重复的数据
SELECT DISTINCT department_id FROM employees;
2、条件查询
1)、语法:
select 查询列表 from 表名 where 筛选条件;
2)、特点
执行顺序:
①from子句
②where子句
③select子句
例:select last_name,first_name from employees where salary>20000;
特点:
1、按关系表达式筛选
关系运算符:> < >= <= = <> (不等于),
补充:也可以使用!=,但不建议
2、按逻辑表达式筛选
逻辑运算符:and or not
补充:也可以使用&& || ! ,但不建议
3、模糊查询
like
in
between and
is null
3、案例
一、按关系表达式筛选
案例:查询部门编号不是100的员工信息
SELECT *
FROM employees
WHERE department_id <> 100;
二、按逻辑表达式筛选
案例:查询部门编号不是 50-100之间员工姓名、部门编号、邮箱
方式1:
SELECT last_name,department_id,email
FROM employees
WHERE department_id <50 OR department_id>100;
方式2:
SELECT last_name,department_id,email
FROM employees
WHERE NOT(department_id>=50 AND department_id<=100);
3、模糊查询
1)、like
功能:一般和通配符搭配使用,对字符型数据进行部分匹配查询
常见的通配符:
_ 任意单个字符
% 任意多个字符,支持0-多个
like/not like
案例:查询姓名中包含字符a的员工信息
SELECT *
FROM employees
WHERE last_name LIKE '%a%';
案例:查询姓名中包含第三个字符为x的员工信息
SELECT *
FROM employees
WHERE last_name LIKE '__x%';
案例:查询姓名中包含第二个字符为_的员工信息
SELECT *
FROM employees
WHERE last_name LIKE '_\_%'; (\为转义字符)
2)、in
功能:查询某字段的值是否属于指定的列表之内
a in(常量值1,常量值2,常量值3,...)
a not in(常量值1,常量值2,常量值3,...)
in/not in
案例1:查询部门编号是30/50/90的员工名、部门编号
方式1:
SELECT last_name,department_id
FROM employees
WHERE department_id IN(30,50,90);
方式2:
SELECT last_name,department_id
FROM employees
WHERE department_id = 30
OR department_id = 50
OR department_id = 90;
案例2:查询工种编号不是SH_CLERK或IT_PROG的员工信息
方式1:
SELECT *
FROM employees
WHERE job_id NOT IN('SH_CLERK','IT_PROG');
方式2:
SELECT *
FROM employees
WHERE NOT(job_id ='SH_CLERK'
OR job_id = 'IT_PROG');
3)、between and
功能:判断某个字段的值是否介于xx之间(包括边界)
between and/not between and
案例1:查询部门编号是30-90之间的部门编号、员工姓名
方式1:
SELECT department_id,last_name
FROM employees
WHERE department_id BETWEEN 30 AND 90;
方式2:
SELECT department_id,last_name
FROM employees
WHERE department_id>=30 AND department_id<=90;
4)、is null/is not null
案例1:查询没有奖金的员工信息
SELECT *
FROM employees
WHERE commission_pct IS NULL;
案例2:查询有奖金的员工信息
SELECT *
FROM employees
WHERE commission_pct IS NOT NULL;
4、排序查询
1)、创建语法:
select 查询列表
from 表名
【where 筛选条件】
order by 排序列表
2)、特点
执行顺序:
①from子句
②where子句
③select子句
④order by 子句
特点:
1、排序列表可以是单个字段、多个字段、表达式、函数、列数、以及以上的组合
2、升序 ,通过 asc ,默认行为
降序 ,通过 desc
3)、案例
一、按单个字段排序
案例1:将员工编号>120的员工信息进行工资的升序
SELECT *
FROM employees
WHERE employee_id>120
ORDER BY salary ;
案例1:将员工编号>120的员工信息进行工资的降序
SELECT *
FROM employees
WHERE employee_id>120
ORDER BY salary DESC;
二、按别名排序
案例1:对有奖金的员工,按年薪降序
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY 年薪 DESC;
三、按函数的结果排序
案例1:按姓名的字数长度进行升序
SELECT last_name
FROM employees
ORDER BY LENGTH(last_name);
四、按多个字段排序
案例1:查询员工的姓名、工资、部门编号,先按工资升序,再按部门编号降序(工资重复的)
SELECT last_name,salary,department_id
FROM employees
ORDER BY salary ASC,department_id DESC;
5、常见函数
1)、含义:类似于java中学过的“方法”,为了解决某个问题,将编写的一系列的命令集合封装在一起,对外仅仅暴露方法名,供外部调用
2)、分类:
单行函数:字符函数 && 数学函数 && 流程控制函数
字符函数:CONCAT 拼接字符、LENGTH 获取字节长度、CHAR_LENGTH 获取字符个数、SUBSTRING 截取子串、
INSTR 获取字符第一次出现的索引、LPAD/RPAD 左填充/右填充、STRCMP 比较两个字符大小、
UPPER/LOWER 变大写/变小写、LEFT/RIGHT 截取子串
数学函数:ABS 绝对值、CELL 向上取整、FLOOR 向下取整、ROUND 四舍五入、TRUNCATE 截断、MOD 取余
日期函数:NOW 当前时间(年月日时分秒)、CURDATE 当前日期(年月日)、CURTIME 当前时间(时分秒)、DATEDIFF 返回两个日期之间的时间(天数)、DATE_FORMAT、STR_TO_DATE 按指定格式解析字符串为日期类型、
①字符函数
1、CONCAT 拼接字符
SELECT CONCAT('hello,',first_name,last_name) 备注 FROM employees;
2、LENGTH 获取字节长度(UTF-8下一个汉字三个字节,gbk下一个汉字两个字节)
SELECT LENGTH('hello,郭襄');
3、CHAR_LENGTH 获取字符个数
SELECT CHAR_LENGTH('hello,郭襄');
4、SUBSTRING 截取子串
注意:起始索引从1开始!!!
substr(str,起始索引,截取的字符长度)
substr(str,起始索引)
SELECT SUBSTR('张三丰爱上了郭襄',1,3);
SELECT SUBSTR('张三丰爱上了郭襄',7);
5、INSTR获取字符第一次出现的索引
SELECT INSTR('三打白骨精aaa白骨精bb白骨精','白骨精');
6、TRIM去前后指定的字符,默认是去空格
SELECT TRIM(' 虚 竹 ') AS a;
SELECT TRIM('x' FROM 'xxxxxx虚xxx竹xxxxxxxxxxxxxxxxxx') AS a;
7、LPAD/RPAD 左填充/右填充
SELECT LPAD('木婉清',10,'a');
SELECT RPAD('木婉清',10,'a');
8、UPPER/LOWER 变大写/变小写
案例:查询员工表的姓名,要求格式:姓首字符大写,其他字符小写,名所有字符大写,且姓和名之间用_分割,最后起别名“OUTPUT”
SELECT UPPER(SUBSTR(first_name,1,1)),first_name FROM employees;
SELECT LOWER(SUBSTR(first_name,2)),first_name FROM employees;
SELECT UPPER(last_name) FROM employees;
SELECT CONCAT(UPPER(SUBSTR(first_name,1,1)),LOWER(SUBSTR(first_name,2)),'_',UPPER(last_name)) "OUTPUT"
FROM employees;
9、STRCMP 比较两个字符大小
SELECT STRCMP('aec','aec');
10、LEFT/RIGHT 截取子串
SELECT LEFT('鸠摩智',1);
SELECT RIGHT('鸠摩智',1);
②数学函数
1、ABS 绝对值
SELECT ABS(-2.4);
2、CEIL 向上取整 返回>=该参数的最小整数
SELECT CEIL(-1.09);
SELECT CEIL(0.09);
SELECT CEIL(1.00);
3、FLOOR 向下取整,返回<=该参数的最大整数
SELECT FLOOR(-1.09);
SELECT FLOOR(0.09);
SELECT FLOOR(1.00);
4、ROUND 四舍五入
SELECT ROUND(1.8712345);
SELECT ROUND(1.8712345,2);
5、TRUNCATE 截断
SELECT TRUNCATE(1.8712345,1);
6、MOD 取余
SELECT MOD(-10,3);
a%b = a-(INT)a/b*b
-10%3 = -10 - (-10)/3*3 = -1
③日期函数
1、NOW
SELECT NOW();
2、CURDATE
SELECT CURDATE();
3、CURTIME
SELECT CURTIME();
4、DATEDIFF
SELECT DATEDIFF('1998-7-16','2019-7-13');
5、DATE_FORMAT
SELECT DATE_FORMAT('1998-7-16','%Y年%M月%d日 %H小时%i分钟%s秒') 出生日期;
SELECT DATE_FORMAT(hiredate,'%Y年%M月%d日 %H小时%i分钟%s秒')入职日期
FROM employees;
6、STR_TO_DATE 按指定格式解析字符串为日期类型
SELECT * FROM employees
WHERE hiredate
6、分组函数
1)、说明:分组函数往往用于实现将一组数据进行统计计算,最终得到一个值,又称为聚合函数或统计函数
分组函数清单:
sum(字段名):求和
avg(字段名):求平均数
max(字段名):求最大值
min(字段名):求最小值
count(字段名):计算非空字段值的个数
2)、案例
案例1 :查询员工信息表中,所有员工的工资和、工资平均值、最低工资、最高工资、有工资的个数
SELECT SUM(salary),AVG(salary),MIN(salary),MAX(salary),COUNT(salary) FROM employees;
3)、count的补充介绍
count的补充介绍
1、统计结果集的行数,推荐使用count(*)
SELECT COUNT(*) FROM employees WHERE department_id = 30;
SELECT COUNT(1) FROM employees WHERE department_id = 30;
2、搭配distinct实现去重的统计
需求:查询有员工的部门个数
SELECT COUNT(DISTINCT department_id) FROM employees;
7、分组查询
1)、语法
select 查询列表
from 表名
where 筛选条件
group by 分组列表 (后面放的是除查询函数外的所有字段)
having 分组后筛选
order by 排序列表;
2)、特点
执行顺序:
①from子句
②where子句
③group by 子句
④having子句
⑤select子句
⑥order by子句
特点:
①查询列表往往是 分组函数和被分组的字段
②分组查询中的筛选分为两类
筛选的基表 使用的关键词 位置
分组前筛选 原始表 where group by 的前面
分组后筛选 分组后的结果集 having group by的后面
where——group by ——having
问题:分组函数做条件只可能放在having后面!!!
3)、案例
1)简单的分组
案例1:查询每个工种的员工平均工资
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id;
2)可以实现分组前的筛选
案例:查询邮箱中包含a字符的 每个部门的最高工资
SELECT MAX(salary) 最高工资,department_id
FROM employees
WHERE email LIKE '%a%'
GROUP BY department_id;
3)可以实现分组后的筛选
案例1:查询哪个部门的员工个数>5
分析1:查询每个部门的员工个数
SELECT COUNT(*) 员工个数,department_id
FROM employees
GROUP BY department_id
分析2:在刚才的结果基础上,筛选哪个部门的员工个数>5
SELECT COUNT(*) 员工个数,department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>5;
4)可以实现排序
案例:查询没有奖金的员工的最高工资>6000的工种编号和最高工资,按最高工资升序
分析1:按工种分组,查询每个工种有奖金的员工的最高工资
SELECT MAX(salary) 最高工资,job_id
FROM employees
WHERE commission_pct IS NULL
GROUP BY job_id
分析2:筛选刚才的结果,看哪个最高工资>6000
SELECT MAX(salary) 最高工资,job_id
FROM employees
WHERE commission_pct IS NULL
GROUP BY job_id
HAVING MAX(salary)>6000
分析3:按最高工资升序
SELECT MAX(salary) 最高工资,job_id
FROM employees
WHERE commission_pct IS NULL
GROUP BY job_id
HAVING MAX(salary)>6000
ORDER BY MAX(salary) ASC;
5)按多个字段分组
案例:查询每个工种每个部门的最低工资,并按最低工资降序
提示:工种和部门都一样,才是一组
工种 部门 工资
1 10 10000
1 20 2000
2 20
3 20
1 10
2 30
2 20
SELECT MIN(salary) 最低工资,job_id,department_id
FROM employees
GROUP BY job_id,department_id;