mysql的快速入门
- 详细介绍关于mysql中的查询语法的使用
- 首先介绍使用到的几张表的字段和关系
- locations记录部门的位置、departments部门的信息、employees记录员工的信息、jobs记录工种的信息
job_grades更具薪资计算薪资等级。
查询的基础语法
- 语法:select 查询的列表 from 表名;
- 特点:
- 1、查询列表的可以是:表中中的字段,长量值,表达式,函数;
- 2、查询的结果是一个虚拟的表格
1、选择使用的数据库
user 表名
USE myemployees;
2、查询某个字段
SELECT 字段名 FROM 表名;
SELECT last_name FROM employees;`
3、查询多个字段
SELECT first_name,last_name,phone_number,job_id,commission_pct,manager_id,hiredate FROM employees;
SELECT * FROM employees;
4、查询常量
SELECT 100;
SELECT 'tom';
5、查询表达
SELECT 100%87;
6、查询函数
SELECT VERSION();#查看mysql的版本号
7、起别名(关键词AS)
方式一:(省略AS)
SELECT last_name “别名”,first_name “别名” FROM 表名;
SELECT last_name "姓",first_name "名" FROM employees;
方式二:(不省略AS))
SELECT last_name AS “别名”,first_name AS “别名” FROM employees;
SELECT last_name AS "姓",first_name AS "名" FROM employees;
8、去重(关键词DISTINCT)
查询employees表中所有的工资
SELECT salary "薪水" FROM employees;
SELECT DISTINCT salary "薪水" FROM employees;
查询employees表中所有的部门编号
SELECT DISTINCT department_id "部门编号" FROM employees;
9、字符串的拼接(关键词concat)
- java 中的+ 号的含义:
--- 运算符 简单的加法运算
--- 字符串的拼接
- mysql中的 + 号的含义
—就是运算符
‘123’+10== 将‘123’强转成数字进行运算
‘tom’+10== 将‘tom’转化为0进行运算
null+XXX;== 结果就是null
从employees表中将姓和名进行拼接
SELECT CONCAT(last_name,first_name) "姓名" FROM employees;
10、count函数的详细使用(统计数量)
效率:
MYISAM存储引擎下,COUNT(*)的效率高
INNODB存储引擎下,COUNT(*)和COUNT(1)的效率差不多,比COUNT(字段)要高一些
条件运算符
- 语法:
select 查询列表 from 表名 where 查询的条件 - 查询的条件分类:
一、简单的条件查询:> < = (!=) <> >= <=
二、按逻辑表达式进行筛选 && || ! and or not
三、模糊查询 like 、between and、in、is null
1、查询工资大于12000的员工的信息
SELECT * FROM employees WHERE salary>12000;
2、查询部门编号不等于90的员工名称和部门编号
SELECT
CONCAT(last_name,first_name) "员工姓名",department_id "部门编号"
FROM
employees
WHERE department_id <> 90;
3、查询工资在10000到18000之间的员工名、工资以及奖金。
SELECT
last_name ,
salary,
commission_pct
FROM
employees
WHERE
salary>10000 AND salary<180000;
4、查询部门编号不是在90到110之间,或者工资高于15000的员工信息
SELECT
*
FROM
employees
WHERE
#department_id<90 OR department_id>110 OR salary>15000;
NOT(department_id>=90 AND department_id<=110) OR salary>15000;
5、查询员工名字中包含s的员工信息(like)
% 多个字符 _单个字符 支持转义
SELECT
*
FROM
employees
WHERE last_name LIKE '%s%';
#============================================
SELECT
last_name
FROM
employees
WHERE last_name LIKE '_$%' ESCAPE '$'; #转义或者escape
6、查询员工编号在100到120之间的员工信息
SELECT
*
FROM
employees
WHERE
`employee_id` BETWEEN 100 AND 120;
7、查询员工的工种编号是IT_PROG IT_PROG FI_ACCOUNT中的一个的员工名和工种编号(in)
SELECT
last_name,job_id
FROM
employees
WHERE
job_id='IT_PROG' OR job_id='IT_PROG' OR job_id='FI_ACCOUNT' ;
#========================================================
SELECT
last_name,job_id
FROM
employees
WHERE
job_id IN('IT_PROG','IT_PROG','FI_ACCOUNT');
8、查询没有奖金的员工名和奖金率(判断null值 —>is null / is not null)
# = <>不能判断null值
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct IS NULL;
9、查询员工号为176的员工的姓名,部门号和年薪
SELECT
CONCAT(`first_name`,`last_name`) "姓名",
department_id "部门号",
salary*12*(1+IFNULL(commission_pct,0)) "年薪"
FROM
employees
WHERE
employee_id=176;
排序查询(order by)
- 语法:(desc降序 asc升序)
select 查询列表
from 表名
where 筛选条件
order by 排序列表 desc|asc; - 练习:
1、查询工种编号为IT_PROG或者AD_VP员工信息,,要去按照薪资从高到低
SELECT
*
FROM
employees
WHERE
job_id IN('IT_PROG','AD_VP')
ORDER BY
salary DESC;
2、查询部门编号>=90的员工信息,要求按照入职的时间进行排序
SELECT
*
FROM
employees
WHERE
department_id >= 90
ORDER BY
TO_DAYS(hiredate);
3、按年薪的高低显示员工的信息和年薪【按照表达式从高到低】
SELECT * , salary*12*(1+IFNULL(1+commission_pct,0)) "年薪"
FROM employees
ORDER BY salary*12*(1+IFNULL(1+commission_pct,0));
4、按年薪的高低显示员工的信息和年薪【按别名排序 order by支持别名排序】
SELECT * , salary*12*(1+IFNULL(1+commission_pct,0)) "年薪"
FROM employees
ORDER BY "年薪";
5、按姓名的长度显示员工的姓名和工资【按函数排序】
SELECT CONCAT(first_name,last_name) "姓名" ,salary
FROM employees
ORDER BY LENGTH(CONCAT(first_name,last_name));
6、查询员工信息,要求先按工资排序,再按员工编号排序【按多个字段排序】
SELECT *
FROM employees
ORDER BY salary DESC,employee_id ASC;
SQL函数
- 概念:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名好处:
1、隐藏了实现细节
2、提高代码的重用性调用:select 函数名(实参列表)【from表】;特点:
①叫什么(函数名)
②干什么(函数功能)
分类:
1、单行函数
如concat、length、ifnul1等
2、分组函数
功能:做统计使用,又称为统计函数、聚合函数、组函数 - 列举一些常见的函数使用
1、length获取参数值的字节个数
# 查询编码(根据编码查看中文占据几个字节)
SHOW VARIABLES LIKE "%char%";
SELECT LENGTH('12465ahs') ;
SELECT LENGTH('张三丰') ;
2、concat拼接字符串
SELECT CONCAT(first_name,'_',last_name) '姓名' FROM employees;
3、upper(大写转化)、lower(小写转化)
SELECT UPPER('asdhg');
SELECT LOWER('aASDH');
4、substr、substring(下标从1开始)
SELECT SUBSTR('张三丰武功天下第一',2);
案例:姓名中首字符大写,其他字符小写然后用_拼接,显示出来
SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),LOWER(SUBSTR(last_name,2))) FROM employees;
5、instr返回子串第一次出现的索引,如果找不到返回0
SELECT INSTR('augsd JHAJ','JH');
6、trim(取出前后空格)
SELECT TRIM(' ashdh asdh asjdhi oi ');
7、lpad用指定的字符实现左填充指定长度
SELECT LPAD('nauksghdf ',20,'*');
8、rpad用指定的字符实现右填充指定长度
SELECT RPAD('nauksghdf ',20,'*');
9、replace替换
SELECT REPLACE('张无忌爱上了周芷若','周芷若','赵敏')
10、ifnull函数(ifnull(exp1,0))
如果表达式1的结果为null值,就去第二个参数
- 数学函数
1、round 四舍五入
SELECT ROUND(1.56,1);
2、ceil (向上取整,取得值是大于等于该参数的)
SELECT CEIL(1.00);
SELECT CEIL(1.002);
SELECT CEIL(-1.002);
3、floor 向下取整,返回<=该参数的最大整数
SELECT FLOOR(1.00);
SELECT FLOOR(1.002);
SELECT FLOOR(-1.002);
4、mod取余(mod(a,b) 相等 a-a/b*b)
SELECT MOD(15,2);
SELECT MOD(-15,2);
- 日期函数
1、now返回当前系统日期+时间
SELECT NOW();
2、curdate返回当前系统日期,不包含时间
SELECT CURDATE();
3、curtime返回当前时间,不包含日期
SELECT CURTIME();
4、可以获取指定的部分,年、月、日、小时、分钟、秒
SELECT YEAR(NOW());
SELECT MONTH(NOW());
SELECT DAY(NOW());
SELECT MINUTE(NOW());
SELECT SECOND(NOW());
5、str_to_date将字符通过指定的格式转换成日期
SELECT STR_TO_DATE(NOW(),'%Y-%c-%D');
案例:查询入职日期为1992-4-3的员工信息
SELECT * FROM employees WHERE hiredate=STR_TO_DATE('4-3 1992' , '%c-%d %y');
6、date_format将日期转换成字符
SELECT DATE_FORMAT(NOW(),'%Y年-%c月-%d日');
案例:查询有奖金的员工名和入职日期(xx月/xx日xx年)
SELECT last_name,DATE_FORMAT(hiredate,'%Y年-%c月-%d日') FROM employees;
- 其他函数
SELECT USER(); #获取用户名
SELECT VERSION(); #获取数据库版本号
- 流程控制函数
1、if函数:if else的效果(有点和三目运算符类似)
SELECT *,IF(commission_pct IS NOT NULL,'有','无') FROM employees;
2、和java中的switch case类似
case 要判断的表达式或者字段
when 常量1 then 要显示的值1或者语句1
when 常量2 then 要显示的值2或者语句2
...
else 要显示的值n或者语句n
end
案例1:查询员工的工资,要求部门号=30,显示的工资为1.1倍
部门号=40,显示的工资为1.2倍
部门号=50,显示的工资为1.3倍
其他部门,显示的工资为原工资
SELECT salary '原始工资',department_id '部门id',
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END '新工资'
FROM
employees;
案例2:查询员工的工资的情况如果工资20000,显示A级别
如果工资>15000,显示B级别
如果工资>10000,显示c级别
否则,显示D级别
SELECT last_name,
CASE
WHEN salary>20000 THEN 'A级别'
WHEN salary>15000 THEN 'B级别'
WHEN salary>10000 THEN 'C级别'
ELSE 'D级别'
END '工资级别'
FROM employees;
分组函数
- 功能:做统计使用的函数,又称为聚合函数或者统计函数或者组函数
- 分类:
sum 和;
count 数量;
avg 平均值;
min 最小值;
max 最大值;。。。 - 特点:
1、sum和avg一般处理数值型参数
count,min和max处理任何参数类型的值
2、以上函数都会回忽略null值的
3、可以和distinct搭配实现去重的运算
4、count函数的单独介绍
一般使用count(*)用作统计行数
5、和分组函数一同查询的字段要求是group by后的字段(oracle) - sql执行的顺序:(仅仅总结的是自己用到的供参考)
SELECT
department_id,
job_id,
AVG(salary)
FROM
employees
WHERE department_id IS NOT NULL
GROUP BY department_id,
job_id
HAVING AVG(salary) >10000
ORDER BY AVG(salary) DESC ;
limit ...
- 关于分组的一点小总结:
1、分组查询中的筛选条件分为两类
数据源 位置 关键字
分组前筛选 原始表 group by子句的前面 where
分组后筛选 分组后的结果集 group by子句的后面 having
①分组函数做条件肯定是放在having子句中
②能用分组前筛选的,就优先考虑使用分组前筛选
2、group by子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求,表达式或函数(用得较少)
3、也可以添加排序(排序放在整个分组查询的最后)
4、关于where和having后面的条件的使用位置问题:
**where:**如果添加的条件在原始数据库表中可以找到的话
**having:**添加的条件在原始数据库表中【不】可以找到
即需要从原始表查询获取到的新表中再次进行判断的时候
0、引言:查询每个部门的平均工资
SELECT * FROM employees;
SELECT department_id,AVG(salary) FROM employees GROUP BY department_id;
1、查询每个工种的最高工资(根据工种进行分组)
SELECT job_id,MAX(salary) FROM employees GROUP BY job_id;
2、查询每个位置上的部门个数(根据位置id进行分组)
SELECT COUNT(*),location_id FROM departments GROUP BY location_id;
添加筛选条件
3、查询邮箱中包含a字符的,每个部门的平均工资(根据部门id进行分组)
SELECT AVG(salary),department_id FROM employees WHERE email LIKE '%a%' GROUP BY department_id;
4、查询有奖金的每个领导手下员工的最高工资(根据领导进行分组)
SELECT manager_id,last_name,MAX(salary) FROM employees WHERE commission_pct IS NOT NULL GROUP BY manager_id;
5、查询哪个部门的员工个数>2(根据部门id进行分组)
COUNT(*)的结果是分组之后才出现的结果(而且是聚合函数),所以查询条件放在group by 后面,做进一步的筛选
SELECT department_id , COUNT(*) FROM employees GROUP BY department_id HAVING COUNT(*)>2;
6、查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
最高工资在原始表中不存在(是分组查询后的结果)所以加在HAVING后面
SELECT job_id, MAX(salary)
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary) > 12000 ;
7、查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资
SELECT MIN(salary), manager_id
FROM employees
WHERE manager_id > 102
GROUP BY manager_id
HAVING MIN(salary) > 5000 ;
按表达式或函数分组
8、按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
SELECT LENGTH(last_name) "姓名长度" ,COUNT(*) FROM employees GROUP BY LENGTH(last_name) HAVING COUNT(*)>5;
9、查询每个部门每个工种的员工的平均工资(按照部门和工种进行分组)
SELECT department_id,job_id,AVG(salary) FROM employees GROUP BY department_id,job_id;
10、查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示
(按照部门和工种进行排序)(按照平均工资排序)
SELECT
department_id,
job_id,
AVG(salary)
FROM
employees
GROUP BY department_id,
job_id
ORDER BY AVG(salary) DESC ;
11、查询每个部门每个工种的员工的平均工资,部门编号不为null,工种编号,平均工资大于10000,并且按平均工资的高低显示
(考察了对条件的添加和位置)(where和having的使用)
SELECT
department_id,
job_id,
AVG(salary)
FROM
employees
WHERE department_id IS NOT NULL
GROUP BY department_id,
job_id
HAVING AVG(salary) >10000
ORDER BY AVG(salary) DESC ;
全部教程是本人自己在学习过程中的总结和练习,都很基础写下来的目的主要是方便自己和他人的复习理解,也消除了笔记写下找不到的缺点。如有需要什么笔记或者文档可以留言。