理论依据:笛卡尔积
通过笛卡尔乘积,把两个或多个表变成一个大表,里面包含了有效的、无效的记录(需要添加条件进行过滤数据)。
语法:
Select 列名1,列名2,列名3,… from 表名1,表名2,… where 1个或多个连接条件 and 查询条件;
- 表起别名/简称:别名与表名空格隔开,
- 查询全部信息、部分列(,间隔),某一个表的全部列 表名.*
- 一个连接条件只能连接两个表,如果需要连接n个表,则需要n-1个连接条件
- 多表联合查询,必须要添加条件过滤,如果不加条件就会出现大量错误数据
- 多表联合查询,多数情况下表和表之间存在主外键关系,但是也有例外
Select 列表1,列表2,… from 表名1,表名2,… where 查询条件;
Select ename,job,sal,grade from emp,salgrade where sal between losal and hisal;
内链接inner join;左链接left join;右连接right join
常规写法:select * from emp,dept where emp.deptno=dept.deptno;
内链接:select * from emp inner join dept on emp.deptno=dept.dept.deptno;
左链接:左表内容全部显示,不管右表是否有对应记录
Select * from emp left join dept on emp.deptno=dept.deptno;
右链接:右表内容全部显示,不管左表是否有对应记录
Select * from emp right join dept mon emp.deptno=dept.deptno;
———————————————分组查询
分组查询主要用来做统计,一般都是按照某一列进行统计
Count(参数):统计查询语句返回的行数
Max(参数):最大的 min(参数):最小的 sum(参数):求和 avg(参数):求平均
参数:一般都是列名,但是count()的参数也可以是*或者1
参数是具体的列名时,函数会自动过滤掉列中是空值的情况。特别是count(),参数是列名时,就只统计列中非空的值;如果count(*)、count(1)即使是空值也会被统计。
查询职工信息的数据,然后统计公司的员工人数,平均薪水,最高薪水,最低薪水。
Select count(ename),count(*),avg(sal),sum(sal)/count(ename),max(sal) from emp where sal is not null;
分组:group by 列名
select count(*),avg(列名),min(列名),列名,… from 表名 group by 列名;
分组后进行数据过滤:having
Select 分组函数,被分组的列 from 表名(1个或多个) [where连接条件] group by 列名(一个或多个) [having 过滤条件];
按照部门编号和岗位进行分组,统计每个部门每个岗位的人数及平均薪水,只保留人数超过3个人的记录
Select count(*),avg(sal),deptno,job from emp group by deptno,job having count(*)>=3;
子查询:嵌套查询:一个语句中包含了查询语句
子查询一般用在条件查询中,(查询条件:列名 运算符 搜索值),用来代替搜索值
Select * from 表名 where 列名 运算符 (子查询语句);
Delate from 表名 where 列名 运算符 (子查询语句);
SELECT * FROM STUDENT WHERE sage>(SELECT sage FROM STUDENT WHERE sname='金小子');
- 子查询一定要放在小括号中,优先查询;
- 子查询放在查询条件的右边,充当搜索值;
- 子查询分为单行子查询、多行子查询
单行子查询:子查询返回的结果只有一行,一个值(一个列)
多行子查询:子查询返回的结果是多个行,多个值(一个列)
单行子查询的运算符:=,!=,<,<=,>,>=,<>
多行子查询的运算符:in all any
All和any必须要结合=,<,<=,>,>=一起使用
All:跟子查询返回的所有值进行比较,比赢所有的值
Any:跟子查询返回的所有值进行比较,比赢其中一个即可
>all(子查询):大于最大的 <all(子查询):小于最小的
>any(子查询):大于最小的 <any(子查询):小于最大的
查询年龄比金小子,叶玉娟,王五都要大的学生信息:
Select * from student where sage >(select max(sage) from student where sname in(‘金小子’,’叶玉娟’,’王五’)); -----单行子查询
Select * from student where sage >all(select sage from student where sanme in(‘金小子’,’叶玉娟’,’王五’)); ------多行子查询
子查询语句当做一个表:
- 子查询当做一个表,一定要给这个表起别名;(mysql中必须)
- (子查询语句)是放在from之后的
查询部门编号为20的员工信息,统计最高工资,用子查询实现
分组查询:
Select max(sal),deptno from emp group by deptno having deptno=20;
Select max(sal) from emp where deptno=20;
子查询:
SELECT * FROM emp WHERE deptno=20 ; -- 当作一个表 aa
SELECT MAX(sal) FROM aa ; -- 实际上是没有 aa 表,但是可以用语句代替
SELECT MAX(sal),deptno FROM (SELECT * FROM emp WHERE deptno=20) aa;
字符处理函数
Lower(参数):将所有字母变小写
Upper(参数):将所有字母变大写
Length(参数):求字符串长度
参数:字符类型的列,也可以是普通字符串
Replacem(X,char1,char2):将字符串X中的char1替换为char2
Substr(参数1,参数2,参数3):取子串
参数1:被处理的字符串
参数2:从第几个字符开始取
参数3:取子串的长度
'HELlo wOrLd!'
SELECT LOWER('HELlo wOrLd!'),UPPER('HELlo wOrLd!'),LENGTH('HELlo wOrLd!'),
SUBSTR('HELlo wOrLd!','2','6'),REPLACE('HELlo wOrLd!','o','G') FROM DUAL;