@
MySQL学习笔记
Linux下安装MySQL:Linux安装mysql,阿里云下安装MySQL
配套数据库创建语句见:数据库创建sql语句
安装步骤
-
确保服务器系统处于最新状态:yum -y update
-
重启服务器:或者yum makecache
-
首先检查是否已经安装,如果已经安装先删除以前版本,以免安装不成功
yum list installed | grep mysql
-
下载MySql安装包:
第一种;rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rp 直接下载安装
第二种:找到mysql yum包下载地址:https://dev.mysql.com/downloads/repo/yum/
选择对应版本得Linux ---> download 右键复制下图得连接地址
weget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm,下载rmp包后经行rmp -ivh 包名 安装
-
安装完后运行:yum makecache
-
yun -y install mysql-community-server
-
安装完成后使用:systemctl start mysqld 启动mysql。然后使用grep “password” | grep /var/log/mysql.log来获取初始密码。
-
mysql -u root -p 密码
-
SET PASSWORD = PASSWORD(‘Abc123!_‘);修改当前用户密码,出于保护密码太简单会有如下错误
set global validate_password_policy=LOW;设置安全等级set global validate_password_length=6;设置密码长度
-
添加一个root用户,允许任意Ip访问‘%‘
GRANT ALL PRIVILEGES ON . TO ‘root‘@‘%‘ IDENTIFIED BY ‘你的密码不能太简单‘ WITH GRANT OPTION;
最后刷新权限flush privileges;
OK完成!
-
最后要去服务器控制台安全组开启mysql端口,不然远程连不到。
***可能会用到得指令***
检查并且显示Apache相关安装包
[root@localhost ~]# rpm -qa | grep mysql# 删除MySql
[root@localhost ~]# yum remove -y mysql mysql mysql-server mysql-libs compat-mysql51
或
[root@localhost ~]# rpm -e mysql-community-libs-5.7.20-1.el7.x86_64 --nodeps
或
[root@localhost ~]# yum -y remove mysql-community-libs-5.7.20-1.el7.x86_64# 查看MySql相关文件
[root@localhost ~]# find / -name mysql# 重启MySql服务
[root@localhost ~]# service mysqld restart# 查看MySql版本
[root@localhost ~]# yum repolist all | grep mysql# 查看当前的启动的 MySQL 版本
[root@localhost ~]# yum repolist enabled | grep mysql# 通过Yum来安装MySQL,会自动处理MySQL与其他组件的依赖关系
[root@localhost ~]# yum install mysql-community-server# 查看MySQL安装目录
[root@localhost ~]# whereis mysql# 启动MySQL服务
[root@localhost ~]# systemctl start mysqld# 查看MySQL服务状态
[root@localhost ~]# systemctl status mysqld# 关闭MySQL服务
[root@localhost ~]# systemctl stop mysqld# 测试MySQL是否安装成功
[root@localhost ~]# mysql# 查看MySql默认密码
[root@localhost ~]# grep ‘temporary password‘ /var/log/mysqld.log# 查看所有数据库
mysql>show databases;# 退出登录数据库
mysql>exit;# 查看所有数据库用户
mysql>SELECT DISTINCT CONCAT(‘User: ‘‘‘,user,‘‘‘@‘‘‘,host,‘‘‘;‘) AS query FROM mysql.user
数据库卸载
- 通过软件管家或者自带得卸载
- 删除安装目录下得文件
- C盘删除Appdata下得mysql文件夹
数据库的概念
- DB:数据库(database)存储一系列有组织的数据
- DBMS:数据库管理系统(database management system),数据库通过DBMS创建操作的容器。
- SQL:结构化查询语言(Structure Query Language):专门用来与数据库通信的语言。
数据库特点
- 将数据放在表里,数据表在放入数据库
- 一个数据库有多个表,每个表都有一个名字标识,同一数据库中表名唯一
- 表由列组成,每个列名也就是字段。
- 表中的数据是按行存储
MySQL配置文件
my.ini
- port=3306:端口
- datadir=“c:/”:数据库文件保存位置
- charater-ser-server=utf8:数据库字符编码
- default-storage-engine=INNODB:默认数据引擎
- sql-mode=“”:语法模式
- max_connections=100:数据库最大链接数
改完配置文件后数据库服务需要重启!!!
MySQL服务启动与停止
- 打开服务:找到MySQLXXX启动和关闭。
- 命令行方式:以管理员身份打开命令行:net start/stop mysqlXXX(windows下)
MySQL登录与退出
命令行完整命令
mysql [-h locahost(地址) -P 3306(端口号)] -u root -p
MySQL常见命令
基础库介绍:
information_schema:保存源数据信息
performance_schema:保存性能信息
test:空的
- show database :查看数据库
- use 库名 :使用数据库
- show table:查看数据库里面的数据表
- desc tablename:查看数据表结构
- select database():查看所在数据库
- select version():查看数据库版本 命令行mysql --version
- 查看数据库使用的字符集:show variables like ‘%char%‘
MySQL语法规范
-
不区分大小写,但建议关键字大写,表名、列名小写
-
每条命令最好用分号结尾“;”(\g)
-
每条命令根据需要、可以进行缩进或换行,建议关键字一行
-
注释
单行注释:#注释文字 或者 -- (空格)注释文字
多行注释:/*注释文字*/
SQL语言
-
DQL(Data Query Languge):数据查询语言
select、
-
DML(Data Manipulation Languge):数据操作语言
增删改
-
DDL(Data Define Languge):数据定义语言
创建修改库表
-
TCL(Transaction Control Language):事务控制语言
-
DCL(Data Control Language):数据控制语言
DQL(数据查询语言)
练习对应练习数据库
基础查询语言
语法:select 查询列表 from 表名;
特点:
- 查询列表可以是表中字段、常量值、表达式、函数
- 查询结果是一个虚拟得表格(临时表格)
注意:
- 查询操作之前,需要使用对应的库:use 库名
- 查询的字段如果与关键字重名,需要用 ` 标明:select `name` from employees
-
查询表中的单个字段
SELECT last_name FROM employees
-
查询多个字段
SELECT last_name,salary FROM employees
-
查询全部
SELECT * FROM employees
-
查询常量值
SELECT 100; SELECT ‘john‘;
-
查询表达式、函数
SELECT 100+20;-- 表达式 -- SELECT count();-- 函数 --
-
去重
select department_id from employees -- 增加 distinct关键字可以去除重复的值 -- select distinct department_id from employees
-
+号作用
#查询员工的姓和名组成一个字段,并显示为姓名 select last_name+first_name 姓名 from employees#失败的操作 /*mysql中 + 号作用只有一个功能:运算符 1、若加号两边都为数值,做加法运算 2、若有字符值,则试图将字符值转换为数值,若成功做加法运算,若失败字符值设为0做加法运算。 3、只要其中一方为null结果肯定为null */
-
concat连接
-- concat()可以连接多个值。 select concat(last_name,‘~‘,first_name) 姓名 from employees -- concat()中如果有的字段值为null,则最终显示为null,需要用到下面的ifnull()来判断 -- select concat(last_name,first_name,commission_pct) OUT_POT from employees select concat(last_name,first_name,ifnull(commission_pct,‘0‘)) OUT_POT from employees
-
ifnull判断字段是否为空
select ifnull(commission_pct,‘0‘) as 绩点 from employees
为字段起别名
好处:便于理解,方便展示;在字段有重名的情况下可以区分
如果别名有关键字可以打双引号
-
在字段名后加 as 别名
SELECT last_name as 姓,salary as 薪水 FROM employees
-
直接使用空格
SELECT last_name 姓,salary 薪水 FROM employees
条件查询
语法:
select 查询列表 from 表名 where 筛选条件
分类:
按条件表达式筛选
条件运算符:> < = !=(<>) >= <=
按逻辑表达式筛选
逻辑运算符(用于连接表达式):&& || ! AND OR NOT
模糊查询
like
between 值 and 值
in(记录集)“in 后面是记录集”
is null
-
条件表达式查询
-- 查询工资大于12000的员工信息 select * from employees where salary > 12000
-
按逻辑表达式筛选
-- 查询工资在10000到20000之间的员工名、工资以及奖金 -- select first_name 员工名, salary 工资, commission_pct 奖金 from employees where salary > 10000 and salary <20000; -- 查询工资不在10000到20000之间的员工名、工资以及奖金 -- select first_name 员工名, salary 工资, commission_pct 奖金 from employees where salary <10000 OR salary>20000; select first_name 员工名, salary 工资, commission_pct 奖金 from employees where salary not between 10000 and 20000;
-
like 模糊查询
%:任意多个字符
_:任意单个字符
\ :转义字符
自定义转义字符:定义$ 为转义字符——escape ‘$‘;
无法匹配null值
-- 查询员工姓名包含a的员工信息 --
select * from employees where last_name like ‘%a%‘;
-- 查询员工姓名第二个字符为_的信息,
select * from employees where last_name like ‘_\_%‘;
select * from employees where last_name like ‘_$_%‘ escape ‘$‘;#自定义转义字符
-
in 关键字
字符类型要加单引号
-- 查询员工工种编号是IT_PROG、AD_VP、AD_PRES -- select * from employees where job_id in (‘IT_PROG‘,‘AD_VP‘,‘AD_PRES‘);
-
is null和is not null
=或<> 不能判断null值
is 不能用于判断具体值,只能和null搭配。
-- 查询有奖金的员工和奖金率 -- select last_name, commission_pct from employees where commission_pct is not null; -- 查询没有奖金的员工和奖金率 -- select last_name, commission_pct from employees where commission_pct is null;
-
安全等于 <=>(可以判断null和具体值)
-- 查询没有奖金的员工和奖金率 -- select last_name, commission_pct from employees where commission_pct <=> null; -- 查询工资等于12000的员工信息 -- select * from employees where salary <=> 12000;
-
排序查询
order by 排序列 asc|desc:asc 从低到高;desc从高到低
多级排序:order by 优先排序列 asc|desc,次要排序列 asc|desc;
order by 子句一般是放在查询语句的最后面,limit子句除外
-- 按年薪从高到低显示员工的信息和年薪 【按表达式排序】-- select * ,salary*12*(1+ifnull(commission_pct,0)) 年薪 from employees order by salary*12*(1+ifnull(commission_pct,0)) desc; -- 按年薪从高到低显示员工的信息和年薪 【按别名排序】-- select * ,salary*12*(1+ifnull(commission_pct,0)) 年薪 from employees order by 年薪 desc; -- 先按员工工资升序排列和再按员工编号降序排序 -- select * from employees order by salary asc,employee_id desc;
-
分组查询 常和分组函数搭配使用详情见分组函数
group by 要分组的列: 分组函数,根据分组列的不同值进行分组
group by 要在where之后,order by之前
#将员工按照部门进行分组 SELECT department_id FROM employees GROUP BY department_id;
常见函数
将一组逻辑语句封装在方法体中,对外暴露方法名
格式:select 函数(实参列表 ) from 表
分类:
单行函数;
concat、length、ifnull等
分组函数 做统计使用、又称统计函数、聚合函数、组函数
单行函数
-
字符函数
-
length获取参数值的字节个数,utf8中文占两个英文占一个字节
select length(‘十分士hhhh‘)#10
-
CHAR_LENGTH获取参数值的字符个数
select CHAR_LENGTH(‘十分士hhhh‘);#7
-
concat()拼接字符串
-
upper()转大写、lower()转小写
-
substr、substring切割函数
#SQL中字符索引从1开始 #截取从指定索引处开始后面所有字符 SELECT SUBSTR(‘123456789‘,6);#6789 #截取从指定索引处指定字符长度的字符 SELECT SUBSTR(‘123456789‘,1,3);#123
-
instr查找子串索引
#返回第一个字串的索引,没有就返回0 SELECT INSTR(‘123456789‘,‘6789‘)#6
-
trim 去掉字符串XXX
#去掉字符串前后空格 SELECT TRIM(‘ jdf ‘);#jdf #去掉字符串前后的指定值 SELECT TRIM(‘a‘ FROM ‘aaaaajdkaaaajffaaaaa‘);#jdkaaaajff
-
lpad、rpad
#返回指定长度的字符串,长度不够用指定值左填充,长度超出则剪取指定长度。 #这里的长度指的是字符索引长度,不是lenght的子节长度。 SELECT LPAD(‘博傲天‘,8,‘*‘);#*****博傲天 SELECT length(LPAD(‘博傲天‘,8,‘*‘));#14 #RPAD就是右填充
-
replace替换
#替换,讲源字符串的所有要替换的值替换为新值 SELECT REPLACE(‘aaabcd‘,‘a‘,‘A‘);#AAAbcd
-
-
数学函数
-
round 四舍五入
select round(1.16)#2 select round(1.567,2)#1.57小数点后保留2位
-
ceil 向上取整返回大于等于该参数的最小整数
select ceil(1.02);#2 select ceil(-9.99)#-9
-
floor 向下取整,返回小于等于该参数的最大整数
select floor(1.02);#1 select floor(-9.99)#-10
-
truncate截断
select truncate(1.69999,2);#1.69,保留小数点后2位
-
mod取余 与%差不多
mode(a,b): a-a/b*b select mod(10,3);#1 select mod(2,3);#2
-
-
日期函数
#1、now()返回当前系统日期和时间 select now();#2020-04-08 15:16:18 #2、curdate 返回当前系统日期,不包含时间 select curdate();#2020-04-08 #3、curtime 返回当前时间,不包含日期 select curtime();#15:18:48 #4、获取指定的时间部分 select year(now()) 年;#2020 select month(now()) 月;#4 select monthname(now()) 月英文名;#April select day(now()) 日;#8 select MINUTE(now()) 分钟;#26 select SECOND(now()) 秒; #5、datediff(日期,日期)前面日期减去后面日期返回天数 select datediff(now(),‘2020-1-24‘)#77 (2020/4/10)
-
日期转换
-
str_to_date:字符串通过指定格式转换成日期格式
select str_to_date(‘1999-8-23‘,‘%Y-%m-%d‘);#1999-08-23 select str_to_date(‘8-23 1999‘,‘%m-%d %Y‘);#1999-08-23
-
data_format:将日期转换为字符串
select date_format(now(),‘%y年%m月%d日‘);#20年04月08日 #查询有奖金的员工名和入职日期(格式月/日 年) select last_name , DATE_FORMAT(hiredate,‘%m月%d日 %Y年‘) 入职时间 from employees where commission_pct is not null;
-
-
-
其他函数
SELECT VERSION();#查看 版本 select database();#查看数据库 select user();#查看用户
-
流程控制函数
#if函数:if else的效果 select if(条件,是返回值,否返回值); select if(10<5,‘是‘,‘否‘)#是 #case函数: #####################使用一:类似于switch case,方便使用等值判断####### #case要判断的字段或表达式 #when 常量1 then 要显示的值1或语句; #when 常量2 then 要显示的值2或语句; #else 要显示的值n或语句; #end ###################################如果when返回的是值的话就不需要用; /*案例: 查询员工的工资,要求 部门号=30,显示的工资为1.1倍 部门号=40,显示的工资为1.2倍 部门号=50,显示的工资为1.3倍 其他部门,显示的工资为原工资*/ SELECT department_id 部门编号,salary 原始工资, CASE IFNULL(department_id,0) WHEN 30 THEN salary*1.1 WHEN 40 THEN salary*1.2 WHEN 50 THEN salary*1.3 ELSE salary END as 实际工资 FROM employees order by 实际工资 asc; #####################使用二:类似于多重if,方便区间判################# #case #when 常量1 then 要显示的值1或语句; #when 常量2 then 要显示的值2或语句; #else 要显示的值n或语句; #end /*案例:查询员工的工资的情况 如果工资>20000,显示A级别 如果工资>15000,显示B级别 如果工资>10000,显示c级别 否则,显示D级别*/ SELECT department_id 部门编号,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 薪水等级 asc;
感悟通过case方法二的使用,abc可以分开显示,推测,selec也是一行一行输出的
分组函数
功能:用作统计使用、又称为聚合函数或者统计函数或组函数
分类:sum()求和、avg()平均值、max()最大值、min()最小值、count()计算个数
与单行函数区别是:只得到一个值,而单行函数是每一行都会有值
参数支持类型
sum、avg:只支持值类型
max、min:支持可比较的所有类型
count:计算不为null的个数,支持所有类型
以上分组函数都忽略null值
可以和distinct搭配使用
-
count函数详细介绍
#统计单个列非null个数 select count(salary) FROM employees; #统计表的行数 select count(*) FROM employees;#一行中只要有非null的就计数 select count(1) FROM employees;#1是新加了一列全是1,统计1的个数。等于还是统计行数。
-
使用分组函数查询要讲究一一对应,不能一对多
和分组函数一起查询的字段要求是group by 后的字段
-
分组查询
语法:
select 分组函数,列(必须是出现在group by后面)
from 表
[where 筛选条件]
group by 分组的列表或函数
[order by 子句]
特点 :分组查询中筛选分为两类
1、分组前筛选 原始表中的条件 where 放在group by前
2、分组后筛选 分组后的结果集 having 放在group by后
3、分组函数做条件的肯定放在having子句中
4、能进行分组前筛选的就尽量使用分组前筛选。
#查询每个部门的平均工资 SELECT AVG(salary),department_id FROM employees GROUP BY department_id; #查询每个工种的最高工资,然后按工资从大到小排序 SELECT MAX(salary) 最高工资, job_id 工种 FROM employees GROUP BY job_id ORDER BY 最高工资 DESC; -- 按多个字段分组,将要分组的多个字段都放在group by子句即可,他就会把多个字段当成一个组来分,类似于两个字段组成一个唯一主键 -- #查询每个部门每个工种的员工的平均工资 select avg(salary),department_id,job_id from employees group by department_id,job_id;
-
having 进行复杂分组查询,位置放在group by 后面
oracle可能不支持having后面放别名
-- 复杂分组查询 -- /* 查询那个部门的员工个数大于2 分开查询,根据分组查询过后的结果集筛选 1、将员工按部门分组,使用count进行计算 2、在1的基础上进行筛选 */ select count(*),department_id from employees group by department_id having count(*)>2; #查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资。 SELECT MAX(salary) 最高工资,job_id 工种编号 FROM employees WHERE commission_pct is not NULL GROUP BY job_id HAVING 最高工资>12000; -- 练习-- #查询员工最高工资和最低工资的差距 select MAX(salary)-MIN(salary) 差距 from employees; #查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内 SELECT min(salary) 最低工资,manager_id FROM employees WHERE manager_id is not NULL GROUP BY manager_id HAVING 最低工资>=6000; #查询所有部门的编号,员工数量和工资平均值(保留2位小数),并按平均工资降序 SELECT ROUND(AVG(salary),2) 平均工资,COUNT(*) 人数,department_id 部门编号 FROM employees GROUP BY department_id ORDER BY 平均工资 desc; #选择具有各个job_ id的员工人数 SELECT count(*) 人数,job_id 工种 FROM employees WHERE job_id is not NULL GROUP BY job_id;
连接查询
笛卡尔乘积(没有添加任何字段就完全连接)
表1m行,表2n行,结果m*n行。
如何避免:要添加连接条件进行匹配。
分类:
- 按年代分类:sql92标准——仅仅支持内连接;sql99标准——支持内连接+外连接(左外、右外)+交叉连接。仅讨论在mysql中
- 按功能分:
- 内连接:
- 等值连接
- 非等值连接
- 自连接
- 外连接
- 左外连接
- 右外连接
- 全连接
- 交叉连接
-- 一、sql92标准 --
#【1】等职连接
/*
1、多表连接结果为所有表的交集
2、n表连接,至少需要n-1个连接条件
3、from子句的多表的顺序没有要求
4、一般需要起别名
5、可以搭配前面介绍的所有子句使用,比如排序、分组、筛选
*/
#查询每个女生的男朋友名(通过id关联)
SELECT name 女生姓名,boyName 男生姓名 FROM boys,beauty WHERE beauty.id = boys.id;
#查询员工姓名、工种号、工种名
#错误示范、报错:Column ‘job_id‘ in field list is ambiguous,job_id有歧义需要指定是哪个表中的job_id
SELECT last_name 姓名,job_id 工种号,job_title 工种名 FROM employees,jobs WHERE employees.job_id = jobs.job_id;
#正确示范
SELECT last_name 姓名,employees.job_id 工种号,job_title 工种名 FROM employees,jobs WHERE employees.job_id = jobs.job_id;
#也可以为表起别名,方便使用提高简洁度,跟字段别名类似
#如果起了别名就无法使用原来名字
SELECT last_name 姓名,e.job_id 工种号,job_title 工种名 FROM employees e,jobs j WHERE e.job_id = j.job_id;
#-----------------------可以添加筛选条件
#查询有奖金的员工名、部门名
SELECT last_name 员工名,department_name 部门名 FROM employees e, departments d WHERE e.department_id = d.department_id AND e.commission_pct IS NOT NULL;
#查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资
SELECT d.department_name 部门名, d.manager_id 领导编号, MIN(salary) 最低工资 FROM employees e,departments d
WHERE e.department_id = d.department_id AND commission_pct IS NOT NULL
GROUP BY 领导编号,部门名;#group by子句必须包含select子句的字段除非你非常确认group by 子句与select结果一一对应。
#-----------------------可以添加排序,和having
#查询每个工种的工种名和员工的个数并且员工数大于3,按员工个数降序
SELECT job_title 工种名, COUNT(*) 个数
FROM employees e , jobs j
WHERE e.job_id = j.job_id
GROUP BY 工种名 HAVING 个数>3
ORDER BY 个数 DESC;
#-----------------------三表连接
#查询员工名、部门名和所在的城市
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;#其余添加筛选、分组、排序与两表连接一样。
#【2】非等值连接 (不是等于号连接的查询条件)
#查询员工的工资和工资级别
SELECT salary 员工工资, grade_level 工资级别
FROM employees e,job_grades j
WHERE salary>=j.lowest_sal AND salary<j.highest_sal;
#【3】自连接 (类似于等值连接,不过是自己连接自己)
/*
1、满足条件,一个表里有可以连接的字段
2、连接条件,连接字段的顺序不同结果也不同,连接前要弄明白连接逻辑
*/
#查看员工的姓名和他的领导名
SELECT e1.employee_id 员工编号, e1.last_name 员工名, e2.employee_id 领导编号, e2.last_name 领导名
FROM employees e1,employees e2
WHERE e1.manager_id = e2.employee_id;#注意:要搞清楚连接条件的意义,是从e1的“员工表”里面的manager_id去对于“领导表”的employee_id,若写反结果也是反的。
总结
使用等值查询,要先连接所需要信息的表,然后再使用筛选条件或分组
练习&测试
/*1*/
select concat(last_name,first_name) 姓名, department_id 部门编号, salary*12*(1+IFNULL(commission_pct,0)) 年薪 from employees order by 年薪 desc, 姓名 asc;
/*2*/
SELECT concat(last_name,first_name) 姓名, salary 工资 FROM employees WHERE salary not BETWEEN 8000 and 17000 ORDER BY salary DESC;
/*3*/
SELECT concat(last_name,first_name) 姓名, email 邮箱 FROM employees WHERE email LIKE ‘%e%‘ ORDER BY LENGTH(邮箱) desc,department_id asc;
-- day1 --
#1
select concat(CURDATE(),‘+‘,CURTIME());
#2
SELECT employee_id 员工号,CONCAT(last_name,‘ ‘,first_name) 姓名,salary 工资,salary*1.2 newsalary FROM employees;
#3
SELECT last_name 姓名,LOWER(SUBSTR(last_name,1,1)) 姓名首字母,LENGTH(last_name) 姓名长度 FROM employees ORDER BY 姓名首字母 asc;
#4
select CONCAT(last_name,‘ earns ‘,salary,‘ monthly but wants ‘,salary*3,‘ Dream Salary‘) FROM employees;
#5
SELECT job_id 工作编号,
CASE job_id
WHEN ‘AD_PRES‘ THEN ‘A‘
WHEN ‘ST_MAN‘ THEN ‘B‘
WHEN ‘IT_PROG‘ THEN ‘C‘
ELSE
‘D‘
END 工作等级
FROM employees ORDER BY 工作等级 asc;
-- day2 --
#6.查询每个国家下的部门个数大于2的国家编号
SELECT country_id 国家编号, count(*) 部门数
FROM departments d,locations l
WHERE d.location_id=l.location_id
GROUP BY 国家编号 HAVING 部门数>2;
#5.查询每个工种、每个部门的部门名、工种名和最低工资
SELECT j.job_id 工种,department_name 部门名,j.job_title 工种名, MIN(salary) 最低工资
FROM employees e,departments d, jobs j
WHERE e.department_id = d.department_id AND e.job_id = j.job_id
GROUP BY 工种,部门名;
#7、选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号,结果类似于下面的格式
#employees Emp #manager Mgr#
#kochhar 101 king 100
SELECT CONCAT(e1.last_name,‘ ‘,e1.employee_id) employees,e2.last_name Mname,e2.employee_id "#manager Mgr#"
FROM employees e1,employees e2
WHERE e1.manager_id = e2.employee_id;
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200413171309752.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc1MjA3MA==,size_16,color_FFFFFF,t_70#pic_center =1000x)
-------------------------------------------------------------每天进步一点点
最后更新于 2020.4.13
更新中~~