精华内容
下载资源
问答
  • mysql高级查询

    2021-05-27 10:06:46
    Mysql高级查询 count()函数 用于计数 语法: COUNT( [DISTINCT | ALL] column | expression):返回满足条件的非空(NULL)行的数量 例– 查询部门30有多少个员工领取奖金 SELECT COUNT(comm) FROM emp WHERE deptno ...

    Mysql高级查询

    count()函数
    用于计数
    语法:
    COUNT( [DISTINCT | ALL] column | expression):返回满足条件的非空(NULL)行的数量

    例–
    查询部门30有多少个员工领取奖金

    SELECT    COUNT(comm)
    FROM    emp
    WHERE    deptno = 30;
    

    分组函数中DISTINCT
    DISTINCT会消除重复记录后再使用组函数
    查询有员工的部门数量。

    SELECT    COUNT(DISTINCT deptno)
    FROM    emp;
    

    分组函数中空值处理
    除了COUNT(*)之外,其它所有分组函数都会忽略列中的空值,然后再进行计算。

    SELECT AVG(comm)
    FROM   emp;
    

    在分组函数中使用IFNULL函数
    IFNULL 函数可以使分组函数强制包含含有空值的记录

    SELECT AVG(IFNULL(comm,0))   //如果comm为null 则替换为0在进行计算
    FROM   emp;
    

    分组函数是对表中一组记录进行操作,每组只返回一个结果,即首先要对表记录进行分组,然后再进行操作汇总,每组返回一个结果,分组时可能是整个表分为一组,也可能根据条件分成多组

    分组函数语法:
    SELECT [column,] group_function(column)
    FROM table
    [WHERE condition]
    [GROUP BY column]
    [HAVING group_function(column)expression
    [ORDER BY column | group_function(column)expression];

    **GROUP BY 子句的使用
    查询每个部门的编号,平均工资

    SELECT   deptno, AVG(sal)
    FROM     emp
    GROUP BY deptno;
    

    有关分组使用的一些函数
    MIN([DISTINCT | ALL] column | expression) 最小值函数
    MAX([DISTINCT | ALL] column | expression) 最大值函数
    SUM([DISTINCT | ALL] column | expression) 求和函数
    AVG([DISTINCT | ALL] column | expression) 求平均值函数

    理解:
    用GROUP BY子句创建数据组
    通过 GROUP BY 子句可将表中满足WHERE条件的记录按照指定的列划分成若干个小组
    其中GROUP BY子句指定要分组的列

    GROUP BY 子句的使用规则
    在SELECT列表中除了分组函数那些项,所有列都必须包含在GROUP BY 子句中。

    SELECT   deptno, AVG(sal)
    FROM     emp
    GROUP BY deptno;
    

    GROUP BY 所指定的列并不是必须出现在SELECT 列表中。

    SELECT   AVG(sal)
    FROM     emp
    GROUP BY deptno;
    
    SELECT   deptno, sum(sal)
    FROM     emp
    GROUP BY deptno, job;
    

    按照多个列分组
    查询每个部门每个岗位的工资总和

    SELECT   deptno, job, sum(sal)
    FROM     emp
    GROUP BY deptno, job;
    

    使用组函数的非法的查询
    不能在 WHERE子句中限制组
    可以通过 HAVING 子句限制组

    SELECT     deptno, max(sal)
    FROM     emp
    WHERE     max(sal) > 2900  // where后不能跟组函数语句
    GROUP BY     deptno;    
    //会报错
    要使用having对分组后的信息进行筛选
    

    SELECT语句执行过程:
    通过FROM子句中找到需要查询的表;
    通过WHERE子句进行非分组函数筛选判断;
    通过GROUP BY子句完成分组操作;
    通过HAVING子句完成组函数筛选判断;
    通过SELECT子句选择显示的列或表达式及组函数;
    通过ORDER BY子句进行排序操作。

    子查询

    语法:
    SELECT select_list
    FROM table
    WHERE expr operator
    (SELECT select_list
    FROM table);

    • 括号内的查询叫做子查询,也叫内部查询,先于主查询执行。
    • 子查询的结果被主查询(外部查询)使用
    • expr operator包括比较运算符
    • 单行运算符:>、=、>=、<、<>、<=
    • 多行运算符: IN、ANY、ALL
    • 子查询可以嵌于以下SQL子句中:
    • WHERE子句
    • HAVING子句
    • FROM子句

    •查询出比JONES为雇员工资高的其他雇员

    SELECT ename
    FROM   emp
    WHERE  sal > 
            (SELECT sal
             FROM   emp   
             WHERE  ename='JONES');
    

    单行子查询语句
    显示和雇员7369从事相同工作并且工资大于雇员7876的雇员的姓名和工作。

    SELECT   ename, job  
    FROM     emp
    WHERE    job = 
        (SELECT job    FROM  emp WHERE empno = 7369)  
        AND  sal > 
        (SELECT sal FROM  emp WHERE    empno = 7876);
    

    子查询中使用组函数
    查询工资最低的员工姓名,岗位及工资

    SELECT    ename, job, sal
    FROM    emp
    WHERE    sal = 
            (SELECT    MIN(sal) FROM emp);
    
    

    HAVING子句中使用子查询
    • 查询部门最低工资比20部门最低工资高的部门编号及最低工资

    SELECT    deptno, MIN(sal)
    FROM    emp
    GROUP BY    deptno
    HAVING    MIN(sal) >
            (SELECT    MIN(sal)
            FROM    emp
            WHERE    deptno = 20);
    

    多行查询
    和多行子查询进行比较时,需要使用多行操作符,多行操作符包括:
    IN() 满足IN中的几个条件就输出几个结果
    ANY()满足任何一个条件即可
    ALL()必须满足所有条件

    • ANY:表示和子查询的任意一行结果进行比较,有一个满足条件即可。
    • < ANY:表示小于子查询结果集中的任意一个,即小于最大值就可以。
    • > ANY:表示大于子查询结果集中的任意一个,即大于最小值就可以。
    • = ANY:表示等于子查询结果中的任意一个,即等于谁都可以,相当于IN。

    • ALL:表示和子查询的所有行结果进行比较,每一行必须都满足条件。
    • < ALL:表示小于子查询结果集中的所有行,即小于最小值。
    • >ALL:表示大于子查询结果集中的所有行,即大于最大值。
    • = ALL :表示等于子查询结果集中的所有行,即等于所有值,通常无意义。

    展开全文
  • MySQL高级查询

    2020-05-19 20:58:36
    MySQL高级查询 嵌套查询(子查询) 定义:把内层的查询结果作为外层的查询条件 语法格式:  select … from 表名 where 条件(select …);   子查询有返回结果:exists 子查询结果为True 子查询无返回结果:exists...

    MySQL高级查询

    嵌套查询(子查询)

    1. 定义:把内层的查询结果作为外层的查询条件
    2. 语法格式:
          select … from 表名 where 条件(select …);
          
      子查询有返回结果:exists 子查询结果为True
      子查询无返回结果:exists 子查询结果为FALSE,外层查询不执行

    删除表

    1. DROP TABLE IF EXISTS temp;

    多表查询

    1. 笛卡儿积
          select 字段名 列表 from 表名列表;
    2. 多表查询
          select 字段名 列表 from 表名列表 where 条件;

    连接查询

    1. 内连接(结果同多表查询,显示匹配到的记录)

      语法格式:
            select 字段名 from 表1 inner join 表2 on 条件 inner join 表3 on 条件;

    2. 左外连接:以 左表 为主显示查询结果

      语法格式:
            select 字段名 from 表1 left join 表2 on 条件 left join 表3 on 条件;

    3. 右外连接:用法同左连接,以右表为主显示查询结果

      语法格式:
            select 字段名 from 表1 right join 表2 on 条件 right join 表3 on 条件

    分组查询

    1. 语法:SELECT …… FROM <表名> WHERE …… GROUP BY ……

    In和Exists的区别

    1. In:
      主查询的条件字段和子查询返回字段必须一致
      先执行子查询,将返回子查询的结果给主查询,再执行主查询

    2. exists:
      主查询不需要出现条件字段
      先执行主查询,将主查询的表的字段传给子查询,如果在子查询找到相应结果,
      返回true,将该结果显示在结果集中。否则返回false

    联合查询

    1. UNION
      并集,所有的内容都查询,重复的显示一次
    select * from emp where deptno = 20
    union 
    select * from emp where sal > 2000
    1. UNION ALL
      并集,所有的内容都显示,包括重复的

    自然连接

    寻找俩表中字段名称相等,数据类型相同的字段进行连 接,会自动去重重复列(如果有多个字段符合要求,那么他们会被作为自然连接的条件)

    --自然连接(等值连接,表的字段名称必须相同,去除重复行)
    select * from emp NATURAL JOIN dept;
    展开全文
  • MySql高级查询

    2018-04-27 09:15:20
    SqlYog高级查询 In子查询 ..................................
  • Mysql高级查询

    2020-02-18 15:08:42
    高级查询 高级查询的格式: select ... 聚合函数 from 表名 where ... group by ... having ... order by ... limit ... order by 给查询结果排序 ...
    高级查询

    高级查询的格式:

    select ... 聚合函数 from 表名

    where ...

    group by ...

    having ...

    order by ...

    limit ...

    order by 给查询结果排序

    语法格式:

    ... order by 字段名 ASC/DESC;

    ASC:默认,升序,DESC:降序

    举个栗子:select name from stuinfo order by id desc;

    limit 显示查询记录的条数

    limit放在查询语句的最后,后边不再放其他的语句。
    用法:

    limit n; —–> 显示 n 条记录limit m, n; —–> 从第(m+1)条记录开始,显示 n 条记录

    limit 分页

    要求每页显示 5 条记录,显示第 4 页的内容

    第1页:limit (1-1)*5,5;    # 1,2,3,4,5

    第2页:limit (2-1)*5,5;    # 6,7,8,9,10

    第3页:limit (3-1)*5,5;    # 11,12,13,14,15

    ...

    第m页:limit (m-1)*n,n;

    由上可知:第 4 页是:limit 15,5;

    聚合函数
    • avg(字段名):求该字段的平均值
    • sum(字段名):求和
    • max(字段名):求最大值
    • min(字段名):求最小值
    • count(字段名):统计该字段的记录的条数
      举个栗子:统计id、name两个字段分别有多少条记录

    select count(id),count(name) from stuinfo;

    group by 给查询的结果分组

    注意:select之后的字段名如果没有在group by之后出现,则必须要对该字段进行聚合和处理(即聚合函数)
    举个栗子:查询表中有哪些国家

    select country from people

    group by country;

    having语句

    作用:对查询的结果进一步筛选

    使用注意:

    having语句通常和group by语句联合使用,过滤由group by语句返回的记录集决定

    where只能操作表中实际存在的字段,having语句可操作由聚合函数的显示列

    举个栗子:找出平均攻击力 大于105的国家的前两名,显示国家名和平均攻击力。

    select country,avg(gongjili) as average from sanguo

    group by country

    having average>105

    order by average desc

    limit 2;

    查询表记录时可以做数学运算

    运算符:+、-、*、/、%
    举个栗子:查询时显示所有英雄攻击力翻倍

    select id, name, gongjili*2 as newgjl from sanguo;

    嵌套查询

    嵌套查询也叫子查询,是把内层的查询结果作为外层的查询条件
    语法格式

    select 字段名列表 from 表名 where 字段名 运算符

    (select 字段名 from 表名 where 条件)

    注意:外层的where的条件必须和内层的select查询的字段名一样,个数也一样
    如:把攻击值小于平均攻击值的名字和攻击值显示出来(sanguo表)

    我们可以分开来查,然后合并成一条语句
    分析:查名字和攻击值,条件是攻击值小于平均攻击值;
    第一步:先求平均值

    select avg(gongjizhi) from sanguo;

    假设我们用avg记录查询出来的平均值

    第二步:查找攻击值小于平均值的名字和攻击值

    select name, gongjizhi from sanguo where gongjizhi<avg;

    第三步:将上边两条合并

    select name, gongjizhi from sanguo where gongjizhi<

     

    (select avg(gongjizhi) from sanguo);

    多表查询

    语法格式:

    select 字段名列表 from 表1,表2 where 条件;

    笛卡尔积的匹配规则(面试中常问)

    • 记录多的表的每一条记录,去匹配另一张表的所有记录;
    • 两张表的记录条数相同时,则后表的每一条记录去匹配前表。
    连接查询
    • 内连接 inner join
    • 外连接
      • 左连接 left join
      • 右连接 right join

    内连接
    语法格式:

    select 字段名列表 from 表1 inner join 表2 on 表1.字段=表2.字段;

    注意:inner 可以省略,on后边的条件在两个表中必须都存在,是连接两个表的标志。

    外连接之左连接
    left join
    以左表为基准,匹配右表的所有内容,不够的用显示NULL

    外连接之右连接
    right join
    以右表为基准,去匹配左表的内容,不够的也是显示NULL

    ---------------------
    展开全文
  • MySQL 高级查询

    2017-06-29 23:08:06
    高级查询虽说也是基础,但相较于单表,高级查询的逻辑性更高,语句也更为复杂,更容易出错,在实际的开发中大量用到,由此掌握高级查询尤为重要。 如果想从多个表查询比较复杂的信息,就会使用高级查询实现。常见的...

    昨天写了一篇关于MySQL的简单单表查询的文章,但对于一个程序员来说,那些都是很基础的,单一的一个表在实际项目开发中基本上不会遇到。高级查询虽说也是基础,但相较于单表,高级查询的逻辑性更高,语句也更为复杂,更容易出错,在实际的开发中大量用到,由此掌握高级查询尤为重要。

    如果想从多个表查询比较复杂的信息,就会使用高级查询实现。常见的高级查询包括多表连接查询、内连接查询、外连接查询与组合查询等。这里接上昨天的,使用2个表进行高级查询。2个以上的表格只是比2个表格多点内容,连接的方法是一样的,查询的时候多加要查询的字段和连接表自己也可以摸索出来。

    本篇文章所用到的2个表详细:

    1.内连接(INNER JOIN):

    分为等值连接和非等值连接,使用等号"="、大于号">"或小于号"<"比较两个表的连接列的值,相当于两表执行笛卡尔后,取两表连结列值相等或一个表大于或小于另一个表的连结列值的记录。

    eg.SELECT e.deptno,SUM(e.sal),d.dname FROM emp e INNER JOIN dept d ON e.deptno = d.deptno GROUP BY e.deptno;

    SELECT e.*, d.*  FROM emp e inner join dept d  ON e.deptno < d.deptno; 

    2.外联结:

    分为左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)

    左外连接:将左表的所有记录与右表符合条件的记录,返回的结果除内连接的结果,还有左表不符合条件的记录,并在右表相应列中填NULL。

    右外连接:左外连接相反,指将右表的所有记录与左表符合条件的记录,返回的结果除内连接的结果,还有右表不符合条件的记录,并在左表相应列中填NULL。

    eg,SELECT e.deptno,SUM(e.sal),d.dname FROM emp e LEFT JOIN dept d ON e.deptno = d.deptno GROUP BY e.deptno;

    SELECT e.deptno,SUM(e.sal),d.dname FROM emp e RIGHT JOIN dept d ON e.deptno = d.deptno GROUP BY e.deptno;

    这里要说明一下,INNER JOIN ... ON ...是99年的语法,还有一个也可以连接查询,直接用WHERE,这是92年的 语法,这两种在实际开发中都被大量使用 。查询结果也一样,相互转改也很简单,可根据自己的习惯来选择使用。上面的语句也可以改为用WHERE,如下:

    eg.SELECT e.deptno,d.dname,SUM(e.sal) FROM emp e,dept d WHERE e.deptno = d.deptno GROUP BY e.deptno;

    3.组合查询、子查询:

    简单来说就是查询里面包含查询,而被包含的查询为子查询,可作为外层查询的条件或是 一个需要用到的连接表。不过一个查询语句查出来的结果有多少(大于0才有意义),即便是一个,也可以看作是一个虚拟的表。可重命名使用使之达到与本身存在的表相同的效果。

    eg.SELECT ename,sal FROM emp WHERE deptno=(SELECT deptno FROM dept WHERE dname="SALES");

    SELECT xin.*,d.dname,d.loc FROM (SELECT deptno,SUM(sal),COUNT(*) FROM emp GROUP BY deptno) xin INNER JOIN

    dept d ON xin.deptno = d.deptno;

    顺便提一下关于重命名,这是在实际开发中经常会使用的,目的是为了让查询出的结果更容易被他人理解(因为建表的时候命名一般为英文,为了让更多人理解查询结果,一般重命名为中文),下面是一个比较好的例子,附带结果图;

    eg.SELECT xin.deptno 部门编号,xin.sal_S 工资总计,xin.sal_A 平均工资,xin.emp_co 人数,
    d.dname 部门名称,d.loc 部门所在 FROM (SELECT deptno,SUM(sal) sal_S,AVG(sal) sal_A ,COUNT(*) emp_co 
    FROM emp GROUP BY deptno)xin,dept d WHERE xin.deptno = d.deptno;

    效果图:

    关于having,简单来说可对查询结果进行过滤然后在显示,下面的例子对deptno进行分组,再过滤掉平均工资(avg_sa)在2000~2500区间外的数据在显示所要的结果。

    eg.SELECT deptno,COUNT(*),SUM(sal),AVG(sal) avg_sal FROM emp GROUP BY deptno HAVING avg_sal 
    BETWEEN 2000 AND 2500;

    4.分页查询:

    可自定义每页显示多少条数据。LIMIT x,y。x为起始条目下标,从0开始,y为所要显示的条目数。

    eg.SELECT * FROM emp ORDER BY deptno LIMIT 10,3;

    从第11条数据开始,显示3条。


       

    展开全文
  • MYSQL高级查询

    2020-08-08 18:11:59
    高级查询 1.清空表 ps: delete:自增长列已经使用的数据会永久丢失,但自增长数据不变,依次向后加1 truncate:自增长的列会重新从1开始排序 DELETE FROM student; TRUNCATE TABLE student; 2.快速复制表 a.复制表...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,371
精华内容 2,148
关键字:

mysql高级查询

mysql 订阅