美文网首页js css html
mysql 数据查询语言(查) (DQL --- Data Qu

mysql 数据查询语言(查) (DQL --- Data Qu

作者: 暴躁程序员 | 来源:发表于2023-02-26 09:37 被阅读0次

    一、基础查询

    1. 常见查询
    -- 查询表中字段
    SELECT username,`password` FROM user; 
    
    -- 查询常量
    SELECT 'alias';
    
    -- 查询表达式
    SELECT 1+1;
    
    -- 查询函数
    SELECT NOW();
    
    2. 条件查询 where 子句
    1. 常见运算符、函数、where值
    > < >= <= != <> 
    <=> -- 安全等于,可判断值是否为null
    
    in  
    like 
    between...and...
    is null 
    
    and 
    or 
    not
    
    any
    some
    all
    
    -- 查询无数据的几种情况
    0 
    null 
    '' 
    fasle  
    
    1. 示例
    -- is null 
    SELECT * FROM user_info WHERE phone IS NULL; -- 查询没记录手机号的用户
    -- <=> 
    SELECT * FROM user_info WHERE phone <=> NULL; -- 查询没记录手机号的用户
    
    -- in 
    SELECT * FROM `user_info` WHERE height IN (175,180); -- 查询身高为175或者180的用户
    -- = or 
    SELECT * FROM `user_info` WHERE height = 175 IN height = 180; -- 查询身高为175或者180的用户
    
    -- like
    SELECT * FROM user_info where `name` LIKE '%al%'; -- 查询名字中含有 al 字符的用户
    SELECT * FROM user_info where `name` LIKE '_l_a%'; -- 查询第二个字符为l,第四个字符为a开头的名字
    
    -- between and 包括边界
    SELECT * FROM `user_info` WHERE height BETWEEN 175 AND 180;-- 查询身高在175和180之间的用户
    -- >= <=
    SELECT * FROM `user_info` WHERE height >= 175 AND height <= 180;-- 查询身高在175和180之间的用户
    
    -- not
    SELECT * FROM `user_info` WHERE NOT height >= 175 AND height <= 180; -- 查询身高不在175和180之间的用户
    SELECT * FROM `user_info` WHERE height NOT BETWEEN 175 AND 180; -- 查询身高不在175和180之间的用户
    
    -- any 和 some 用于列子查询,作用相同、只是写法不同,作用是查询符合任意一个匹配的数据
    -- 查询身高小于 175,176,177 中任意一个身高的用户,即:身高小于 177 的用户
    SELECT * FROM `user_info` WHERE height < ANY(
        SELECT height FROM user_info WHERE height in(175,176,177)
    );
    -- 查询身高小于 175,176,177 中任意一个的用户,另一种写法
    SELECT * FROM `user_info` WHERE height < (
        SELECT MAX(height) FROM user_info WHERE height in(175,176,177)
    );
    
    -- all 用于列子查询,作用是查询符合所有匹配的数据
    -- 查询身高小于 175,176,177 中所有身高的用户,即:身高小于 175 的用户
    SELECT * FROM `user_info` WHERE height < ALL(
        SELECT height FROM user_info WHERE height in(175,176,177)
    );
    -- 查询身高小于 175,176,177 中所有身高的用户,另一种写法
    SELECT * FROM `user_info` WHERE height < (
        SELECT MIN(height) FROM user_info WHERE height in(175,176,177)
    );
    
    -- 查询结果为空的几种情况 where 0、where null、where ''、where false
    SELECT * FROM `user_info` WHERE 0 OR null OR '' OR false;
    
    3. 排序查询 order by
    -- 降序
    SELECT * FROM user where 1=1 ORDER BY age DESC; 
    
    -- 升序(默认)
    SELECT * FROM user where 1=1 ORDER BY age ASC; 
    
    4. 分页查询 limit

    语法:limit pageIndex,pageSize
    位置:放在查询语句的最后

    -- 查询前三条用户信息
    SELECT * FROM `user_info` WHERE 1 ORDER BY height LIMIT 0,3;
    
    5. 设置别名 as
    -- 字段别名
    SELECT username uname,`password` pwd FROM `user_info`;
    
    -- 表别名
    SELECT u.username,u.`password` FROM `user_info` u;
    
    -- 常量别名
    SELECT 'alias' `name`;
    
    -- 表达式别名
    SELECT 1+1 sum;
    
    -- 函数别名
    SELECT NOW() `current_time`;
    SELECT NOW() AS `current_time`;
    
    6. 查询去重 distinct
    SELECT DISTINCT username,`password` FROM 'user_info';
    
    7. 字段值为null处理 ifnull(expr1,expr2)
    SELECT dog_name,IFNULL(dog_age,0) dog_age from dog; -- dog_age 为null,返回 0
    

    二、 聚合查询

    聚合函数(统计函数)
    注意:所有聚合函数都不处理null值

    -- sum(expr)  求和
    SELECT SUM(age) age_total FROM `user_info`; 
    
    -- avg(expr)  平均值
    SELECT AVG(age) age_avg FROM `user_info`;
    
    -- max(expr) 最大值
    SELECT MAX(age) age_max FROM `user_info`;
    
    -- min(expr) 最小值
    SELECT MIN(age) age_min FROM `user_info`;
    
    -- count(expr) 计数,查询到的数据条数,不计算null值,一般用COUNT(*)统计条数效率最高
    SELECT COUNT(age),COUNT(*) total FROM `user_info`;
    

    三、分组查询 group by

    group by 后可以是单个字段名、多个字段名、表达式

    1. 分组查询一般和聚合查询一起使用,通过GROUP BY后面的列将表分组,再按照聚合函数修饰的列查询出对应的结果
    -- 查询每个性别(GROUP BY sex)的平均年龄(SELECT AVG(age))
    SELECT AVG(age),sex FROM `user_info` GROUP BY sex;
    /* 结果
    AVG(age)       sex
    32              0
    26              1 
    */
    
    2. GROUP BY一般在from 和 where 之后,order by 之前使用
    -- 查询存款大于10000(WHERE deposit>10000)的每个性别(GROUP BY sex)的最大年龄(SELECT MAX(age))的人的信息,并按平均年龄降序排列
    SELECT MAX(age),sex,username,height FROM `user_info` WHERE deposit > 10000 GROUP BY sex ORDER BY MAX(age) DESC;
    /* 结果
    MAX(age)       sex    username    height
    55              0       张大昭      162
    81              1       刘海      177
    */
    
    3. 如果需要再次对统计数据进行筛选则需要使用 having 子句

    注意:分组前使用where条件子句,分组后使用having条件子句

    -- 查询年龄小于50(WHERE age<60)的每个性别(GROUP BY sex)的人数(SELECT COUNT(*)),且人数小于30(HAVING COUNT(*)<30)
    SELECT COUNT(*),sex FROM `user_info` WHERE age<60 GROUP BY sex HAVING COUNT(*)<30;
    /* 结果
    COUNT(*)       sex
    22              0
    */
    

    四、多表查询

    1. 笛卡尔积(交叉查询)

    对两个表进行联合查询时,返回两个表数据的乘积,多表查询是在笛卡尔积的基础上进行筛选

    -- 如果user有8条数据,user_info有8条数据,那么结果是8x8=64条数据
    SELECT * FROM user,user_info; 
    
    2.内连接

    查询左右两个表的交集部分数据

    1. 显式内连接查询(inner join...on)
    SELECT u.username, ui.age, ui.height FROM user_info ui INNER JOIN `user` u 
    ON u.id = 1 AND u.id = ui.uid;
    
    1. 隐式内连接查询(where子句)
    SELECT u.username,ui.age,ui.height FROM `user` u , user_info ui
    WHERE u.id = 1 AND u.id = ui.uid;
    
    3.外连接

    JOIN 左侧为左表,右侧为右表

    1. 左外连接
      查询左表数据和交集数据,右表匹配不到的数据为null
      LEFT JOIN 和 LEFT OUTER JOIN 作用相同,写法不同
    SELECT u.username, ui.age, ui.height FROM user_info ui LEFT JOIN `user` u 
    ON u.id = 1 AND u.id = ui.uid;
    
    1. 右外连接
      查询右表数据和交集数据,左表匹配不到的数据为null
      RIGHT JOIN 和 RIGHT OUTER JOIN 作用相同,写法不同
    SELECT u.username, ui.age, ui.height FROM user_info ui RIGHT JOIN `user` u 
    ON u.id = 1 AND u.id = ui.uid;
    

    五、子查询

    在select、from、where、having 子句中使用子查询

    1. 在where子句中使用(最常用),把子查询的结果作为主查询的条件
    -- 标量子查询(一行一列),子查询语句返回一个值
    SELECT * FROM user_info WHERE uid = (
        SELECT id FROM `user` WHERE username = 'zhangsan' AND `password` = '123456'
    );
    
    -- 列子查询(一列多行),子查询语句返回一列值
    SELECT * FROM user_info WHERE `uid` IN (
        SELECT id FROM `user` WHERE `password` = '123456'
    );
    
    -- 行子查询(多列多行),子查询语句返回一行或多行值
    SELECT * FROM user_info WHERE (age,height) in (
        SELECT age,height FROM user_info WHERE height < 175
    );
    
    2. 在select语句中使用,把子查询的结果做为主查询的列
    -- 查询用户信息和用户拥有的狗的个数(结果:在用户信息表旁加dog_num列显示用户拥有的狗的个数)
    SELECT u.*,(SELECT COUNT(*) FROM dog d WHERE u.id = d.uid) dog_num FROM `user` u;
    
    3. 在from子句中使用,把子查询的结果作为虚拟表(需要给虚拟表起别名)
    -- 查询身高小于175的用户的所有信息,from子查询
    SELECT * FROM `user` u,( SELECT * FROM user_info WHERE height<175) ui WHERE u.id = ui.uid;  
    
    -- 查询身高小于175的用户的所有信息。其他写法
    SELECT * FROM `user` u,user_info ui WHERE u.id = ui.uid AND ui.height<175;  
    
    4. exists 判断子查询的结果存在,结果为 1 存在,0 不存在

    exists 用于判断子查询的结果是否存在

    -- 查询身高等于190的用户是否存在
    SELECT EXISTS(SELECT * FROM user_info WHERE height = 190 height190); 
    

    六、联合查询

    把多次查询的结果合并起来,形成一个新的查询结果集

    -- union连接的查询语句的列数必须相同
    SELECT username,`password` FROM user UNION SELECT age,height FROM  user_info;
    
    -- union会去重,如果不去重 则使用 union all
    SELECT 11 'result' UNION SELECT 22 UNION ALL SELECT 22 UNION ALL SELECT 11; 
    

    相关文章

      网友评论

        本文标题:mysql 数据查询语言(查) (DQL --- Data Qu

        本文链接:https://www.haomeiwen.com/subject/qcgqldtx.html