mysql学习笔记(更新中).md

2020-01-03  本文已影响0人  Minimal__

mysql初级学习笔记.md

标签(空格分隔): mysql mysql初级


mysql介绍

DB:database,存储数据的仓库,保存了一些列有组织比较规范的数据。
DBMS:数据库管理系统 Database management system,数据库是通过DBMD创建和操作的容器。(mysql、oracle(oracle公司)、DB2(IBM公司,处理海量数据有优势)、sqlserver)
SQL:结构化查询语言(structure query language)专门用来与数据库通信的语言。

SQL特点:
1.几乎所有的DBMS都支持SQL。
2.简单易学
3.虽然简单,但实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。

mysql的安装与使用

windows平台下载:http://dev.mysql.com/downloads/mysql

目前版本:
5.5、5.6、5.7、8.0(测试版)

mysql的启动与停止

mysql的登录与退出

mysql的常见命令

mysql的语法规范

mysql图形管理工具

DQL语言学习

#进阶1:基础查询
/*
语法:
select 查询列表 from 表名;

1.查询列表可以是:表中的字段、常量值、表达式、函数、等等
2.查询结果是一个虚拟的表格

*/

#1.查询表中的单个字段
SELECT last_name FROM employees;

#2.查询表中的多个字段
SELECT last_name,salary,email FROM employees;
SELECT USER,HOST,passowrd FROM mysql.user; #常用

#3.查询表中给的所有字段
#方式一:
SELECT * FROM employees;

#方式二:
SELECT `first_name`,
    `last_name`,
    `manage_id`
FROM
    employees;
    
#4.查询常量值
SELECT 100;
SELECT 'join';

#5.查询表达式
SELECT 100%98;

#6.查询函数
SELECT VERSION();

#7.为字段起别名
/*
①  便于理解
②  如果查询字段有重名的情况,可以使用别名来区分
*/
#方式一:
SELECT 100%98 AS 结果;
SELECT last_name AS 姓,first_name AS 名 FROM employees;
#方式二:
SELECT last_name 姓,first_name 名 FROM employees;
SELECT salary AS "out put" FROM employees;
 
#8.去重
#案例:查询员工表中涉及到的所有的部门编号(关键字中加入DISTINCT)
SELECT DISTINCT department_id FROM employees;

#9. + 号的作用
/*
mysql中的加号只有一个功能:运算符
SELECT 100+90 AS 和;
SELECT '123'+90; #有其中一方为字符型,试图将字符型数值转换成数值型,如果成功,继续做加法运算,如果转换失败,则将字符型的数值转换成0
SELECT null+123; #只要其中一方为null则结果为null。
*/
#案例:员工名和姓连接成一个字段,并显示为 姓名
SELECT last_name+first_name AS 姓名  FROM employees;  #结果为0
SELECT CONCAT(last_name,first_name)  AS 姓名  FROM employees;
SELECT IFNULL(commission_pct,0) AS 奖金率,commission_pct FROM employees; #判断奖金率是否为null,如果是null返回0,注意IFNULL函数的使用
SELECT CONCAT (`first_name`,',',`last_name`,',',`job_id`,',',IFNULL(commission_pct,0)) AS out_put FROM employees; 
#进阶2.条件查询
/*
语法
SELECT 
    查询列表 
FROM    
    表名 
WHERE   
    筛选条件;
    
执行顺序:先from 后where最后select
分类:
    一、按条件表达式筛选
        条件运算符:> < = != <> >= <=
    二、按逻辑表达式筛选
        作用:用于连接条件表达式
        逻辑运算符:& || ! and or not
    三、模糊查询
         like 、between and 、 in 、 is null     
*/
#一、按条件表达式筛选
#案例1:查询员工工资>12000的员工信息
SELECT * FROM employees WHERE salary>12000;
#案例2:查询部门编号不等于90的员工名和部门编号
SELECT last_name,department_id FROM employees WHERE department_id<>90;
#二、按逻辑表达式筛选
#案例1:查询工资在10000到20000之间的员工名,工资以及奖金
SELECT last_name,salary,commission_pct FROM employees WHERE salary>=10000 AND salary<=20000;
#案例2:部门编号不是在90到110之间,或者工资高于15000的员工。
SELECT * FROM employees WHERE NOT(department_id>=90 AND department_id<=110) OR salary>15000;
#三、模糊查询
/*
like
特点:一般和通配符搭配使用
    通配符:
        %:包含任意多个字符
        _:任意单个字符
between and
in
is null     
*/
#1.like
#案例1:查询员工名中包含字符a的员工信息
SELECT * FROM employees WHERE last_name LIKE '%a%';  #mysql中使用%代表通配符
#案例2:查询员工名中第三个字符为n,第五个字符为l的员工名和工资
SELECT last_name,salary FROM employees WHERE last_name LIKE '__n_l%';
#案例3:查询员工名中第二个字符为下划线的员工名
SELECT last_name FROM employees WHERE last_name LIKE '_\_%'; #转义字符还可以 LIKE '_$_%' ESCAPE '$';说明$是转义字符

#2.between and
/*
①  使用between and可以提高语句简洁度
②  包含临界值
③  临界值不要调换顺讯
*/
#案例1:员工编号在100到120之间的所有员工信息
SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120;

#3. in关键字
/*
含义:判断某字段的值是否属于in列表中的某一项
特点:
    1.使用in提高语句建解读
    2.in列表中的值类型必须统一或兼容
    3.列表中不支持通配符
*/
#案例:查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
SELECT last_name,job_id FROM employees WHERE job_id IN ('IT_PROG','AD_VP','AD_PRES') 

#4. IS NULL的使用(判断NULL值)
*/
=或<>不能判断null值
IS NULL 可以判断NULL值
*/
#案例1:没有奖金的员工名和奖金率
SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NULL;

SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NOT NULL;

# 安全等于 <=>,判断是否等于
#案例1:没有奖金的员工名和奖金率
SELECT last_name,commission_pct FROM employees WHERE commission_pct <=> NULL;

#案例2:查询工资为12000的员工信息
SELECT last_name,salary FROM employees WHERE salary <=> 12000;

# IS NULL 和 <=>
/*
IS NULL:仅仅可以判断NULL值
<=>:既可以判断NULL值有可以判断普通的数值,但是可读性较低
*/

#案例3:查询员工号176的员工姓名和部门号和年薪
SELECT last_name,department_id,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪 FROM employees;


#测试题1讲解:https://www.youtube.com/watch?v=H_2TJ7tq_Lc&list=PLmOn9nNkQxJHvSwmwwnH3oInxIr7HIZ8U&index=37
 
#进阶3:排序查询
/*
引入
    SELECT * FROM employees;
语法:
    SELECT 查询条件 FROM 表 [WHERE 筛选条件] order by 排序条件 [asc|desc];
特点:
    1. asc 代表升序、DESC代表降序
    如果不写默认升序
    2.ORDER BY子句中可以支持单个字段、多个字段、表达式、函数、别名
    3.ORDER BY子句一般是放在查询语句的最后面,limit子句除外
*/
#案例1:查询员工信息,要求员工工资从高到底

SELECT * FROM employees ORDER BY salary DESC;

#案例2:查询部门编号大于等于90的员工信息,按入职时间的先后排序

SELECT * FROM employees WHERE department_id >=90 ORDER BY hiredate ASC;

#案例3:按年薪的高低显示员工信息和年薪 。按表达式排序

SELECT *,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪 FROM employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;

#案例4:按年薪的高低显示员工信息和年薪 。【按表达式排序】

SELECT *,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪 FROM employees ORDER BY 年薪DESC;

#案例5:按姓名的长度显示员工的姓名和公司【按函数排序】

SELECT LENGTH(last_name) 字节长度,last_name,salary FROM employees ORDER BY LENGTH(last_name) DESC;

#案例6:查询员工信息,先按员工工资排序再按员工编号排序。【按多个字段排序】

SELECT * FROM emploees ORDER BY salary ASC,employee_id DESC;

#习题1:查询员工姓名和部门号和年薪,按年薪降序,按姓名升序
SELECT last_name,demartment_id,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees ORDER BY 年薪 DESC,last_name ASC;

#习题2:选择工资不在8000到17000员工的姓名和工资,按工资降序
SELECT last_name,salary FROM employees NOT BETWEENT 8000 AND 17000 ORDER BY salary DESC;

#习题3:查询邮箱中包含e的员工信息,并按照员工的字节数降序排序,再按部门号升序排序
SELECT * FROM employees WHERE email LIKE '%e%' ORDER BY LENGTH(email) DESC,departmant_id ASC;
#进阶4:常见函数
/*
概念:类似java中的方法,将一组逻辑语句封装在方法体重,对外暴露方法名
好处:1.实现了实现细节 2.提高了代码的重用性
调用:SELECT 函数名(实参列表) [FROM 表];
特点:  
    1.叫什么(函数名)
    2.干什么(函数功能)
分类:
    1.单行函数:例如 CONCAT、LENGTH、IFNULL等
    2.分组函数
        功能:做统计使用,又称为聚合函数、统计函数、组函数
*/

#一、字符函数
#length 获取参数值的字节个数
SHOW VARIABLES LIKE '%char%'; #先查看下目前的字符集
SELECT LENGTH('荆浩') AS 中文字节长度;

#2.concat 拼接字符串
SELECT CONCAT(last_name,'_',first_name) AS 姓名 FROM employees;

#3.upper、lower
SELECT UPPER('join');
SELECT LOWER('JOIN');

#实例:将名变大写,姓变小写。
SELECT CONCAT(UPPER(last_name),'_',LOWER(first_name)) AS 姓名 FROM employees;

#4.substr、substring
#注意:sql语言中索引都是从1开始
#截取从索引处后面所有的字符
SELECT SUBSTR('李莫愁爱上了陆展元',7) AS OUTPUT;
#截取从指定索引处指定字符长度的字符,下例中截取长度为3的字符长度
SELECT SUBSTR('李莫愁爱上了陆展元',1,3) AS output;

#案例:将姓名中首字符大写,其他字符小写,再拼接在一起
SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(first_name,2))) AS OUTPUT FROM employees;

#5.instr 返回子串第一次出现的索引,如果找不到返回0

SELECT INSTR('杨不悔爱上了殷六侠','殷六侠') AS OUTPUT;

6.trim 去除前后空格及其他指定字符串

SELECT LENGTH(TRIM('  张翠山  ')) AS OUTPUT;
SELECT TRIM('a' FROM 'aaaaaaa张aaaa翠山aaaaaaaa');

#7.lpad  用指定的字符实现左填充指定长度
SELECT LPAD('殷素素',10,'*') AS OUTPUT;

#8.rpad 实现右填充
SELECT RPAD('殷素素',12,'*') AS OUTPUT;

#9.replace替换
SELECT REPLACE('张无忌爱上了周芷若','周芷若','赵敏') AS OUTPUT;


#二、数学函数

#1.round  四舍五入

SELECT ROUND(-1.65) AS OUTPUT;
SELECT ROUND(1.456,2) AS OUTPUT;

#2.ceil 向上取整,返回大于等于该参数的最小整数。
SELECT CEIL(1.002);
SELECT CEIL(1.000);
SELECT CEIL(-1.002);

#3.floor 向下取整,返回小于等于改参数的最大整数
SELECT FLOOR(-9.99);

#4.truncate 截断,后面都不要了
SELECT TRUNCATE(1.65,1);

#5.mod  取模(取余)
/*
MOD(a,b):a-a/b*b
*/
SELECT MOD(10,-3);
SELECT 10%3;

#三、日期函数

#now 返回当前系统日期+时间
SELECT NOW();

#curdate 返回系统日期,不包含时间
SELECT CURDATE();

#curtime 返回当前时间,不包含时间
SELECT CURTIME();

#获取指定的部分,年、月、日、小时、分钟、秒
SELECT YEAR(NOW()) AS 年;
SELECT YEAR('1990-8-17') AS 年;
SELECT YEAR(hiredate) AS 年 FROM employees:
SELECT MONTH(NOW()) 月;
SELECT MONTHNAME(NOW()) 月;

#str_to_date   将日期格式的字符串转换成指定的日期格式
SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d') output;
#查询入职日志为1992-4-3员工信息
SELECT * FROM employees WHERE hiredate = '1992-4-3';
SELECT * FROM employees WHERE hiredate = STR_TO_DATE('4-3 1992','%c-%d %y');

#date_format   将日期转换成字符
SELECT DATE_FORMAT('2019/9/9','%Y年%m月%d日') OURPUT;
SELECT DATE_FORMAT(NOW(),'%y年%m月%d日');
#查询有奖金的员工名和入职日期(xx月/xx日 xx年)
SELECT last_name,DATE_FORMAT(hiredate,'%m月/%d日 %y年') FROM employees WHERE commission_pct IS NOT NULL;


#四、其他函数

SELECT VERSION();   查询版本号
SELECT DATABASE();  查看当前库
SELECT USER();      查看当前用户

#五、流程控制函数

#1. if函数:if else
SELECT IF('10>5','大','小');
SELECT last_name,commission_pct,IF(commission_pct IS NULL,'没奖金,哈哈','有奖金,嘻嘻') AS 备注;

#2.case函数的使用一:类似于java的switch case效果

/*
    switch(变量或表达式){
        case 常量1:语句1; break;
        ...
        default:语句;break;
    }
    mysql中
    
    case 要判断的字段或表达式
    when 常量1 then要显示的值1或语句1;
    when 常量2 then要显示的值2或语句2;
    ...
    else 要显示值n或语句n;
    end
*/

#案例:查询员工的工资,要求
/*
部门号=30 显示的工资为1.1倍
部门号=40 显示的工资为1.2
部门号=50 显示的工资为1.3
其他部门显示为原工资
*/

SELECT salary 原始工资,department_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 AS 新工资
FROM employees; 

#3.case函数的使用2:类似于java的多重if
/*
java中
if(条件){
    语句1;
}else if(条件2){
    语句2;
}else {
    语句n;
}

mysql中:
case 
when 条件1 then 要显示的值1 或语句1
when 条件2 then 要显示的值2 或语句2
...
else  要显示的值n或语句n
end
*/
#案例:查询员工的工资情况
/*
如果工资>20000,显示A级别
如果工资>15000,显示B级别
如果工资>10000,显示C级别
否则显示D级别
*/
SELECT salary,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END AS 工资级别
FROM employees ORDER BY 工资级别;
#二、分组函数
/*
功能:用作统计,又称为聚合函数或统计函数或组函数

分类:
sum 求和、avg 平局值、max 最大值、min 最小值、count 计算个数

特点:
1.SUM、AVG一般用于处理数值型
  MAX、MIN、COUNT可以处理任何值
2.以上分组函数都忽略null值
3.可以和distinct搭配实现去重的运算
4.count函数详细介绍
一般使用count(*)用作统计行数
MYISAM 存储引擎下,count(*)效率高
INNODB 存储引擎下,count(*)和count(1)的效率差不多,但是比count(字段)效率高一些
5.和分组函数一通查询的字段要求是group by后的字段
*/

#1.简单的使用
SELECT SUM(salary) FROM employees;
SELECT AVG(salary) FROM employees;
SELECT MAX(salary) FROM employees;
SELECT MIN(salary) FROM employees;
SELECT COUNT(salary) FROM employees;

SELECT SUM(salary) AS 和,ROUND(AVG(salary),2) AS 平均,MAX(salary) AS 最高;

#2.参数支持哪些类型
 
 SELECT SUM(last_name),AVG(last_name) FROM employees;  # 字符型不支持求和,输出结果为0
 SELECT MAX(last_name),MIN(last_nmae) FROM employees;  
 
#3.是否忽略null
SELECT SUM(commission_pct),AVG(commission_pct) FROM employees;
SELECT MAX(commission_pct),MIN(commission_pct) FROM employees;
SELECT COUNT(commission_pct) FROM employees;

#4.和distinct搭配
SELECT SUM(DISTINCT salary),SUM(salary) FROM employees;
SELECT COUNT(DISTINCT salary) FROM employees;


#5.count函数的详细介绍
SELECT COUNT(salary) FROM employees;

SELECT COUNT(*) FROM employees;  #用来统计行数

SELECT COUNT(1) FROM employees;  #用来统计1的个数,进而达到统计总行数的目的,1可以替换成任意值

#效率:
MYISAM 存储引擎下,count(*)效率高
INNODB 存储引擎下,count(*)和count(1)的效率差不多,但是比count(字段)效率高一些

#6.和分组函数一同查询的字段有限制
SELECT AVG(salary),employee_id FROM employees;  #虽然不报错,但是一般不这么写


#习题
1.#查询员工工资的最大值最小值平均值和总和
SELECT MAX(salary) AS max_sal,MIN(salary) mi_sal,AVG(ROUND(salary,2)) AS avg_sal, SUM(salary) AS sum_sal FROM employees;
#2.查询员工表中最大入职时间和最小入职时间的相差天数
SELECT DATEDIFF('2017-10-01','2017-9-29') AS 相差天数;  #datediff函数的使用介绍
SELECT DATEDIFF(MAX(hiredate),MIN(hiredate)) AS diffience  FROM employees;

#3.查询部门编号为90的员工个数
SELECT COUNT(*) FROM employees WHERE department_id = 90;
#进阶5:分组查询
/*

语法:
    select 分组函数,列 
    from   表明
    [where 筛选条件]
    group by 分组的列表
    [order by 子句]
要求:
    查询列表比较特殊,要求分组函数和group by后出现的字段
*/
#引入:查询每个部门的平均工资
SELECT AVG(salary),department_id FROM employees GROUP BY department_id;

#案例1:查询每个工种的最高工资
SELECT MAX(salary),job_id FROM employees GROUP BY job_id;

#案例2:查询每个位置上的部门个数
SELECT COUNT(*),localtion_id FROM department GROUP BY location_id;

#添加筛选条件
#案例3:查询邮箱中包含a字符的每个部门的平均工资
SELECT AVG(salary),department_id FROM employees WHERE email LIKE '%a%' GROUP BY department_id ;

#案例4:查询有奖金的每个领导手下员工的最高工资
SELECT MAX(salary),manager_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY manager_id;
#添加分组后的筛选
#案例1:查询哪个部门的员工个数大于2
SELECT COUNT(*),department_id FROM employees GROUP BY department_id HAVING COUNT(*)>2;

#案例2:查询每个工种有奖金的员工的最高工资>12000的工种编号和其最高工资
SELECT MAX(salary),job_id FROM employees WHERE commission_pct IS NOT NULL  GROUP BY job_id HAVING MAX(salary)>12000;
#进阶6:连接查询
/*
含义:多表连接。当查询的字段设计到多个表时,就会用到连接查询
笛卡尔乘积现象:表1有m行,表2有n行,结果=m*n行

发生原因:没有有效的连接条件
如何避免:添加有效的连接条件

分类:
    按年代分类:
        sql93标准:仅仅支持内连接
        sql99标准【推荐使用此标准】:支持所有内连接+外链接(左外、右外)+交叉连接
    按功能分类:
        内连接:
            等值连接
            非等值连接
            自连接
        外连接:
            左外连接
            右外连接
            全连接
        交叉连接
*/
    
 SELECT NAME,boyName
 FROM boys,beauty
 WHERE beauty.boyfriend_id=boys.id;
 
 
 
 #一、sql92标准
 #1.等值连接
 
 /*
① 多表等值连接的结果为多表的交集 部分
② n表连接至少需要n-1个连接条件
③ 多表的顺序没有要求
④ 一般需要为表起别名
⑤ 可以搭配前面介绍的所有子句使用,比如排序、分组、筛选 
 */
 #案例1:查询女神名和对应的男神名
 SELECT NAME,boyName
 FROM boys,beauty
 WHERE beauty.boyfriend_id=boys.id;
 
 #案例2:查询员工名和对应的部门名
 SELECT last_name,department_name
 FROM employees,departments
 WHERE employees.`department_id`=departments.`department_id`;
 
 #2.为表起别名
 /*
 提高语句简洁度
 区分读个重名字段
 注意:如果为表起了别名,则查询的字段就不能使用原来的表明去限定
 */
 
 #查询员工名、工种号、工种名(工种名来自jobs表) 
 SELECT last_name,e.job_id,job_title
 FROM employees AS e,jobs AS j
 WHERE e.job_id=j.job_id;
 
 
#3.两个表的顺序可否调换,可以的
 
 SELECT last_name,e.job_id,job_title
 FROM jobs AS j,employees AS e
 WHERE e.job_id=j.job_id;
 
#4.加条件筛选
 
#案例1:有奖金的员工名和部门名
SELECT last_name,department_name,commission_pct
FROM employees AS e,departments AS d
WHERE e.`department_id`=d.`department_id`
AND e.`commission_pct` IS NOT NULL;

#案例2:查询城市名中第二个字符为字母o对应的部门名和城市名
SELECT department_name,city
FROM departments AS d,locations AS l
WHERE d.`location_id`=l.`location_id`
AND l.`city` LIKE '_o%';
 
#5.加分组
 
#案例1:查询每个城市的部门个数
SELECT COUNT(*) AS 个数,city AS 城市名
FROM departments d,locations l
WHERE d.`location_id`=l.`location_id`
GROUP BY city;

#案例2:查询有奖金的每个部门名和部门领导编号和该部门最低工资
SELECT department_name,d.manager_id,MIN(salary)
FROM departments d,employees e
WHERE d.`department_id`=e.`department_id`
AND commission_pct IS NOT NULL
GROUP BY department_name,d.manager_id;
 
 
 #6.加排序
 #案例1:查询每个工种的工种名和员工的个数并且按员工个数降序
 SELECT job_title,COUNT(*)
 FROM employees e,jobs j
 WHERE e.`job_id`=j.`job_id`
 GROUP BY job_title
 ORDER BY COUNT(*) DESC;
 
#7.三表连接
#案例1:查询员工名、部门名、所在城市(s开头城市),按照部门名升序排序输出
SELECT last_name,department_name,city
FROM employees e,departments d,locations l
WHERE e.`department_id`=d.`department_id`
AND d.`location_id`=l.`location_id`
AND city LIKE 's%'
ORDER BY department_name ASC;

#2.非等值连接
 
 #案例1:查询员工的工资和工资级别
 
SELECT salary,grade_level
FROM employees e,job_grades j
WHERE e.`salary`BETWEEN  j.`lowest_sal` AND j.`highest_sal`
AND j.`grade_level`='A';
 
#3.自连接
/*

*/
# 案例1:查询员工名以及上级的名称
SELECT e.`employee_id`,e.`last_name`,m.`employee_id`,m.`last_name`
FROM employees e,employees m
WHERE e.`manager_id`=m.`employee_id`;

 #一、sql99语法
 /*
 语法:
    SELECT 查询列表
    FROM 表  别名 [连接类型]
    JOIN 表2 别名 
    ON 连接条件
    [WHERE 筛选条件]
    [GROUP BY 分组]
    [HAVING 筛选条件]
    [ORDER BY 排序列表]
内连接☆:INNER
外连接(左外☆LEFT [OUTER]、右外☆ RIGHT [OUTER]、全外 FULL [OUTER])
交叉连接 CROSS
 
 */
 
 #一) 内连接
 /*
语法:
 SELECT 查询列表
 FROM 表1 别名
 INNER JOIN 表2 别名
 ON 连接条件;
 分类:
 等值连接
 非等值连接
 自连接 
 特点:
 ① 添加排序、分组、筛选
 ② inner可以省略
 ③ 筛选条件放在where后面,连接条件放在on后,提高了分离性,便于阅读
 ④ inner join 和sql92中的等值连接最后效果一样的,都会查询多表的交集部分  
 
 
 */

#1.等值连接
#案例1.查询员工名、部门名
SELECT last_name,department_name
FROM employees e
INNER JOIN departments d
ON e.`department_id`=d.`department_id`;

#2.查询名字汇总包含e的员工名和工种名(添加筛选)
SELECT last_name,job_title 
FROM employees e
INNER JOIN jobs j
ON e.`job_id`=j.`job_id`
WHERE e.`last_name` LIKE '%e%';


#3.查询部门个数>3的城市名和部门个数(分组+筛选)


SELECT city,COUNT(*) 部门个数
FROM departments d
INNER JOIN locations l
ON d.`location_id` = l.`location_id`
GROUP BY city
HAVING COUNT(*)>3;

#4.查询哪个部门的部门个数>3的部门名和员工个数,并案个数进行降序(添加排序)


SELECT COUNT(*) 个数,department_name
FROM employees e
INNER JOIN departments d
ON e.`department_id`=d.`department_id`
GROUP BY department_name
HAVING COUNT(*)>3
ORDER BY COUNT(*) DESC;


#5.查询员工名、部门名、工种名,并按照部门名降序(三表连接)
SELECT last_name,department_name,job_title 
FROM employees e
INNER JOIN departments d ON e.`department_id`=d.`department_id`
INNER JOIN jobs j ON e.`job_id`=j.`job_id`
ORDER BY department_name DESC;

DML语言学习

DDL语言学习

TCL语言学习

上一篇下一篇

猜你喜欢

热点阅读