• MySQL常用查询


    一、单表查询

    1. 查询所有    *

    mysql> select * from student;

     2. 查询选中字段记录

    mysql> select s_name from student;

     

     3.  条件查询 where

    mysql> select s_name from student where s_id<5;

     4. 查询后为字段重命名   as

    mysql> select s_name as 名字 from student;

     5. 模糊查询     like

    %匹配多个字符

    mysql> select s_name as 姓名 from student where s_name like '李%';

     _匹配一个字符

    mysql> select s_name as 姓名 from student where s_name like '李_';

    6. 排序(默认升序)  order by  以某个字段为主进行排序

    升序  asc (asc可以不写)

    mysql> select * from student order by sc_id asc;

     降序  desc

    mysql> select * from student order by sc_id desc;

    7. 限制显示数据数量   limit 

    limit 只接一个数字n时表示显示前面n行

    mysql> select * from student limit 5;

     limit 接两个数字m,n时表示显示第m行(不包括第m行)之后的n行

    mysql> select * from student limit 2,4;

     8. 常用聚合函数

    mysql> select * from details;

     最大值 max

    mysql> select max(age) from details;

     

     最小值 min

    mysql> select min(age) from details;

     求和 sum

    mysql> select sum(age) from details;

     平均值 avg

    mysql> select avg(age) from details;

     四舍五入 round

    mysql> select round(avg(age)) from details;

     统计  count

    mysql> select count(address) from details;

     注1:

    1、count(1):可以统计表中所有数据,不统计所有的列,用1代表代码行,在统计结果中包含列字段为null的数据;

    2、count(字段):只包含列名的列,统计表中出现该字段的次数,并且不统计字段为null的情况;

    3、count(*):统计所有的列,相当于行数,统计结果中会包含字段值为null的列;

    注2:count执行效率

    列名为主键,count(列名)比count(1)快;列名不为主键,count(1)会比count(列名)快;

    如果表中多个列并且没有主键,则count(1)的执行效率优于count(*);

    如果有主键,则select count(主键)的执行效率是最优的;如果表中只有一个字段,则select  count(*)最优。

    例:

    CREATE TABLE `user` (
      `id` int(5) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(10) DEFAULT NULL,
      `password` varchar(10) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

    测试数据为:

    1 name1 123456
    2 name2 123456
    3 name3 123456
    4 name4  NULL

    进行查询:

    mysql>select count(*) from `user`
    mysql>select count(name) from `user`
    mysql>select count(password) from `user`

    得到的结果:4,4,3

    原因:

    1,count(*)是对行数目进行计数,所以结果为4。
    2,count(column_name)是对列中不为空的行进行计数,所以count(name)=4,而count(password)=3。

    9. 分组查询 group by

    筛选条件使用havinghaving后接条件必须是select后存在的字段

    mysql> select age,count(age) from details group by age having age>30;

    以age为组统计每个age的人数最后筛选出age大于30的

     二、子查询(嵌套查询)

    mysql> select * from details where age>(select avg(age) from details);

    查询所有age大于平均年龄的信息

     三、关联查询

    内连接    inner join

    无条件内连接  又称笛卡尔连接

    mysql> select * from student inner join college;

    有条件内连接  在无条件基础上,on接条件

    mysql> select * from student inner join college on sc_id=c_id;

     外连接

    • 左外连接    left join

    以左表为基准,右表没有对应数据以null填充,多余数据去除

    mysql> select * from tb1 left join tb2 on id=t_id;

     mysql> select * from tb2 left join tb1 on id=t_id;

    • 右外连接   right join

     以右表为基准,左表没有对应数据以null填充,多余数据去除

    mysql> select * from tb1 right join tb2 on id=t_id;

    mysql> select * from tb2 right join tb1 on id=t_id;

     派生表必须命名 as

    mysql> select * from (select * from details where age>30) as a left join student on d_id=s_id;

    四、去重 distinct 的用法

    在使用MySQL时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而无法返回其他字段,

    在使用distinct的过程中主要注意一下几点:

    • 在对字段进行去重的时候,要保证distinct在所有字段的最前面
    • 如果distinct关键字后面有多个字段时,则会对多个字段进行组合去重,只有多个字段组合起来的值是相等的才会被去重

    下面我们通过在开发过程中经常遇到的一些关于distinct的实例来加深大家对该关键字用法的理解:

    数据库表结构和数据如下图所示:

    •  对单个字段进行去重sql
    select distinct  age from user;
    
    查询结果
    age
    10
    20
    30
    • 对多个字段进行去重sql:
    select distinct name,age from user;
    
    查询结果
    name    age
    One    10
    Zero    20
    Two    20
    Four    30
    One    30
    • 对多个字段进行去重并求count的sql(实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而无法返回其他字段):
    select count(distinct name,age) as total from user;
    
    查询结果
    total
    5
    • 对select * 进行去重
    select distinct * from user;
    
    由于 * 代表所有字段,所以该sql和 select distinct id,name,age,sign from user 语义相同
    
    查询结果:
    id        name    age        sign
    1        One        10        梦想要有的,万一实现了呢
    2        Zero    20        http://www.chaoshizhushou.com
    3        Two        20        OneZeroTwoFour
    4        Four    30        加油
    5        One        30        学习才是硬道理
    6        Four    30        一日三省吾身

    如果sql这样写:select id,distinct name from user,这样mysql会报错,因为distinct必须放在要查询字段的开头。

    所以一般distinct用来查询不重复记录的条数。

    如果要查询不重复的记录,有时候可以用group by :

    select id,name from user group by name;

    五、group by 的用法

    1. group by的常规用法

    group by的常规用法是配合聚合函数,利用分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析,以及配合having进行筛选后过滤。

    • 聚合函数max
    • select max(user_id),grade from user_info group by grade ;

    这条sql的含义很明确,将数据按照grade字段分组,查询每组最大的user_id以及当前组内容。注意,这里分组条件是grade,查询的非聚合条件也是grade。这里不产生冲突。

    having

    select max(user_id),grade from user_info group by grade having grade>'A'

     这条sql与上面例子中的基本相同,不过后面跟了having过滤条件。将grade不满足’>A’的过滤掉了。注意,这里分组条件是grade,查询的非聚合条件也是grade。这里不产生冲突。

    2. group by的非常规用法

    select max(user_id),id,grade from user_info group by grade

     这条sql的结果就值得讨论了,与上述例子不同的是,查询条件多了id一列。数据按照grade分组后,grade一列是相同的,max(user_id)按照数据进行计算也是唯一的,id一列是如何取值的?看上述的数据结果,
    推论:id是物理内存的第一个匹配项。
    究竟是与不是需要继续探讨。

    3. 结论

    • 当group by 与聚合函数配合使用时,功能为分组后计算
    • 当group by 与having配合使用时,功能为分组后过滤
    • 当group by 与聚合函数,同时非聚合字段同时使用时,非聚合字段的取值是第一个匹配到的字段内容,即id小的条目对应的字段内容。
  • 相关阅读:
    CentOS 8下安装hadoop-3.3.0
    c# log4net安装时在AssemblyInfo中提示找不到log4net解决办法
    C#自定义类型数组排序
    C#中的隐藏方法
    VBA 按列查找小工具类似lookUp函数
    欢迎来到网络对抗路 实验八 Web综合
    利用GMSSL中ZUC算法实现对序列密码的结构性检测(代码)
    第二十一章学习笔记
    欢迎来到网络对抗路 实验七 网络欺诈防范
    数据转换考试qwq
  • 原文地址:https://www.cnblogs.com/sunny0824/p/13626017.html
Copyright © 2020-2023  润新知