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的安装与使用
-
mysql数据库隶属于mysql AB公司,总部位于瑞典,后被(08年被sun收购,之后又被oracle收购)oracle收购。
-
优点:
- 开放源代码,一般可以免费使用
- 性能高
- 简单:容易安装和使用
-
DBMS分类:
- 基于公布各项文件系统的DBMS(ACCESS)
- 基于客户机--服务器的DBMS(mysql、oracle、sqlserver)
-
社区办
-
企业版(收费)
windows平台下载:http://dev.mysql.com/downloads/mysql
目前版本:
5.5、5.6、5.7、8.0(测试版)
mysql的启动与停止
- linux
- centos7:
systemctl start mysqld
systemctl enable mysqld
systemctl status mysqld
- centos6:
service mysqld start
service mysqld status/stop
- centos7:
- windows
- 命令行方式(管理员运行命令提示符):
net stop mysql57
net start mysql57
- 命令行方式(管理员运行命令提示符):
mysql的登录与退出
- 登录
-
mysql -uroot -h127.0.0.1 -P3306 -p
(需要将mysql加入全局环境变量) - -u 后接用户名
- -h 后接主机ip
- -P后接端口号
- -p后接密码,如果连写不能有空格。
-
- 退出
exit
mysql的常见命令
-
show databases;
查看存在的库 -
use msyql;
使用指定数据库 -
show tables;
查看存在的表 -
show tables from mysql;
查看指定库中的表 -
select database();
查看目前所在的库 -
create table stuinfo(id int,name varchar(20));
创建表,并指定内容 -
desc stuinfo;
查看表结构 -
select * from stuinfo;
查看表中数据 -
insert into stuinfo(id,name) values(1,'join');
插入数据 -
update stuinfo set name='lilei' where id=1
修改stuinfo表中id=1的name字段 delete stuinfo where id=1
-
select version();
查看当前数据库版本 -
mysql --version 或 mysql -V
查看当前数据库版本
mysql的语法规范
- 1.不区分大小写,建议关键字大写,表明,列明小写。
- 2.每条命令使用分号结尾。(\G结尾也行。)
- 3.每条命令根据需要可以进行缩进、换行,建议关键字在一行。
- 4.注释:
- 单行注释:
#注释文字
- 单行注释:
--空格
(sqlserver中--后没有空格) - 多行注释:
/*注释内容/*
- 单行注释:
mysql图形管理工具
- navicat
- 支持云同步
- SQLyog
- 轻巧不需要破解,仅本地
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;
- 子查询
- 分页查询
- union联合查询
DML语言学习
- 插入语句
- 修改语句
- 删除语句
DDL语言学习
- 库和表的管理
- 常见数据类型介绍
- 常见
TCL语言学习
- 事务和事务处理
网友评论