0
点赞
收藏
分享

微信扫一扫

mysql 多表联合查询

code_balance 2022-04-26 阅读 109
mysql

理论依据:笛卡尔积 

       通过笛卡尔乘积,把两个或多个表变成一个大表,里面包含了有效的、无效的记录(需要添加条件进行过滤数据)。

语法:

   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='金小子');

  1. 子查询一定要放在小括号中,优先查询;
  2. 子查询放在查询条件的右边,充当搜索值;
  3. 子查询分为单行子查询、多行子查询

          单行子查询:子查询返回的结果只有一行,一个值(一个列)

          多行子查询:子查询返回的结果是多个行,多个值(一个列)

单行子查询的运算符:=,!=,<,<=,>,>=,<>

多行子查询的运算符: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;

举报

相关推荐

0 条评论