Mysql数据库基础知识(一)之 基础查询----分组查询

说明: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;

 

你可能感兴趣的:(mysql,mysql)