zoukankan      html  css  js  c++  java
  • MySQL查询方式

    MySQL查询方式

     

    一. 分组查询

    语法:【】表示可选,可有可无
    select 查询列表
    from 表
    【where 筛选条件】
    group by 分组的字段
    【having 筛选条件】
    【order by 排序的字段】;
     
    特点:
    1、和分组函数一同查询的字段必须是group by后出现的字段
    2、筛选分为两类:分组前筛选和分组后筛选
    分组前筛选   原始表    group by前   where
    分组后筛选   group by后的结果集   group by后   having
    一般来讲,能用分组前筛选的,尽量使用分组前筛选,提高效率
    3、分组可以按单个字段也可以按多个字段,多字段就是两个字段的并集
    4、可以搭配着排序使用,asc升序可以省略,desc降序,
    order by子句可以支持 单个字段、别名、表达式、函数、多个字段
     
     

    二. 连接查询

    按年代分类:
        sql92标准:仅仅支持内连接
        sql99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接
     
    按功能分类:
            内连接:
                等值连接
                非等值连接
                自连接
            外连接:
                左外连接
                右外连接
                全外连接
            交叉连接
        

    1.  SQL92标准

    1. 等值连接

    /*
    ① 多表等值连接的结果为多表的交集部分
    ②n表连接,至少需要n-1个连接条件
    ③ 多表的顺序没有要求
    ④可以搭配前面介绍的所有子句使用,比如排序、分组、筛选
    ⑤可以给表起别名
        ①提高语句的简洁度
        ②区分多个重名的字段
        注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定
    */
    
    例:查询员工名、部门名和所在的城市(三表连接)
    
    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`
    ORDER BY department_name DESC;

    2. 非等值连接

    例:查询员工的工资和工资级别(工资范围判断级别)
    
    SELECT salary,grade_level
    FROM employees e,job_grades g
    WHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal`;

    3. 自连接

    例:查询员工名和上级的名称(一张表)
    
    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`;

    2.  SQL99标准

    /*
    分类:
    内连接(★):inner
    外连接
        左外(★):left 【outer】
        右外(★):right 【outer】
        全外:full【outer】
    交叉连接:cross 
    */

    1. 内连接

    /*
    语法:
    
    select 查询列表
    from 表1 别名
    inner join 表2 别名
    on 连接条件;
    【where 筛选条件】
    【group by 分组】
    【having 筛选条件】
    【order by 排序列表】
    
    分类:
    等值
    非等值
    自连接
    
    特点:
    ①添加排序、分组、筛选
    ②inner可以省略
    ③ 筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
    ④inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集
    */
    
    1. 等值连接
    例:查询员工名、部门名、工种名,并按部门名降序(添加三表连接)
    
    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;
    
    2. 非等值连接
    例:查询工资级别的个数>20的个数,并且按工资级别降序
    
    SELECT COUNT(*),grade_level
    FROM employees e
    JOIN job_grades g
    ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`
    GROUP BY grade_level
    HAVING COUNT(*)>20
    ORDER BY grade_level DESC;
    
    3. 自连接
    例:查询姓名中包含字符k的员工的名字、上级的名字
    
    SELECT e.last_name,m.last_name
    FROM employees e
    JOIN employees m
    ON e.`manager_id`= m.`employee_id`
    WHERE e.`last_name` LIKE '%k%';

    2. 外连接

     /*
     应用场景:用于查询一个表中有,另一个表没有的记录
     
     特点:
     1、外连接的查询结果为主表中的所有记录
        如果从表中有和它匹配的,则显示匹配的值
        如果从表中没有和它匹配的,则显示null
        外连接查询结果=内连接结果+主表中有而从表没有的记录
     2、左外连接,left join左边的是主表
        右外连接,right join右边的是主表
     3、左外和右外交换两个表的顺序,可以实现同样的效果 
     4、全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的
     */
    
    1. 左外连接
    例:查询哪个部门没有员工
     
     SELECT d.*,e.employee_id
     FROM departments d
     LEFT OUTER JOIN employees e
     ON d.`department_id` = e.`department_id`
     WHERE e.`employee_id` IS NULL;
    
    2. 右外连接
    例:查询哪个部门没有员工
    
     SELECT d.*,e.employee_id
     FROM employees e
     RIGHT OUTER JOIN departments d
     ON d.`department_id` = e.`department_id`
     WHERE e.`employee_id` IS NULL;
    
    3. 全外
    
     SELECT b.*,bo.*
     FROM beauty b
     FULL OUTER JOIN boys bo
     ON b.`boyfriend_id` = bo.id;
    
    4. 交叉连接(两表乘机的个数)
    
     SELECT b.*,bo.*
     FROM beauty b
     CROSS JOIN boys bo;

    三. 子查询

    /*
    含义:
    出现在其他语句中的select语句,称为子查询或内查询
    外部的查询语句,称为主查询或外查询
    
    分类:
    按子查询出现的位置:
        select后面:
            仅仅支持标量子查询
        
        from后面:要求必须起别名
            支持表子查询
        where或having后面:★
            标量子查询(单行) √
            列子查询  (多行) √
            
            行子查询
            
        exists后面(相关子查询)
            表子查询
    按结果集的行列数不同:
        标量子查询(结果集只有一行一列)
        列子查询(结果集只有一列多行)
        行子查询(结果集有一行多列)
        表子查询(结果集一般为多行多列)
    
    */

    1. 标量子查询

    例:返回job_id与141号员工相同,salary比143号员工多的员工 姓名,job_id 和工资
    
    #①查询141号员工的job_id
    SELECT job_id
    FROM employees
    WHERE employee_id = 141
    
    #②查询143号员工的salary
    SELECT salary
    FROM employees
    WHERE employee_id = 143
    
    #③查询员工的姓名,job_id 和工资,要求job_id=①并且salary>②
    
    SELECT last_name,job_id,salary
    FROM employees
    WHERE job_id = (
    	SELECT job_id
    	FROM employees
    	WHERE employee_id = 141
    ) AND salary>(
    	SELECT salary
    	FROM employees
    	WHERE employee_id = 143
    
    );
    

      

    2. 列子查询(多行子查询)★

    一般搭配着多行操作符使用:in、any/some、all
    例:返回其它部门中比job_id为‘IT_PROG’部门所有工资都低的员工   的员工号、姓名、job_id 以及salary
    
    SELECT last_name,employee_id,job_id,salary
    FROM employees
    WHERE salary<ALL(
        SELECT DISTINCT salary
        FROM employees
        WHERE job_id = 'IT_PROG'
    
    ) AND job_id<>'IT_PROG';
    
    #或
    
    SELECT last_name,employee_id,job_id,salary
    FROM employees
    WHERE salary<(
        SELECT MIN( salary)
        FROM employees
        WHERE job_id = 'IT_PROG'
    
    ) AND job_id<>'IT_PROG';

    3. 行子查询

    例:查询员工编号最小并且工资最高的员工信息
    
    SELECT * 
    FROM employees
    WHERE (employee_id,salary)=(
        SELECT MIN(employee_id),MAX(salary)
        FROM employees
    );

    四. 分页查询

    /*
    
    应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求
    语法:
        select 查询列表
        from 表
        【join type join 表2
        on 连接条件
        where 筛选条件
        group by 分组字段
        having 分组后的筛选
        order by 排序的字段】
        limit 【offset,】size;
        
        offset要显示条目的起始索引(起始索引从0开始)
        size 要显示的条目个数
    特点:
        ①limit语句放在查询语句的最后
        ②公式
        要显示的页数 page,每页的条目数size
        
        select 查询列表
        from 表
        limit (page-1)*size,size;
    
        
    */
    例:查询前五条员工信息
    
    SELECT * FROM  employees LIMIT 0,5;
    SELECT * FROM  employees LIMIT 5;

     五. 联合查询

    /*
    union 联合 合并:将多条查询语句的结果合并成一个结果
    
    语法:
    查询语句1
    union
    查询语句2
    union
    ...
    
    
    应用场景:
    要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时
    
    特点:★
    1、要求多条查询语句的查询列数是一致的!
    2、要求多条查询语句的查询的每一列的类型和顺序最好一致
    3、union关键字默认去重,如果使用union all 可以包含重复项
    
    */
    
    
    例:查询部门编号>90或邮箱包含a的员工信息
    
    SELECT * FROM employees  WHERE email LIKE '%a%'
    UNION
    SELECT * FROM employees  WHERE department_id>90;
     
    作者:dlm17
    本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    调用WinRar进行解压缩操作
    SQL中数据分组重新编号
    VS2005 常用快捷键
    启用IIS6的Gzip压缩功能
    TSQL字段说明信息
    SQL Server 连接不上内网解决方案
    错误信息:A potentially dangerous Request.Form value was detected from the client
    repeater 总结
    GridView实现先执行 后绑定问题
    搜索功能 where部分
  • 原文地址:https://www.cnblogs.com/dlm17/p/12375763.html
Copyright © 2011-2022 走看看