MySQL查询语句大全(基础查询、函数使用、高级查询)

目录

    • 一、基础查询
      • 1.1、直接查询
      • 1.2、为字段取别名
      • 1.3、去重查询
      • 1.4、条件查询
      • 1.5、模糊查询
      • 1.6、逻辑运算符
      • 1.7、in与not in运算符
      • 1.8、算术运算符
      • 1.9、between and的范围查询
      • 1.10、排序查询
      • 1.11、分组查询
      • 1.12、分页查询
      • 二、函数使用
        • 2.1、统计函数
        • 2.2、字符串函数
          • 2.2.1、CONCAT(拼接内容)
          • 2.2.2、REPLACE / INSERT(字符串替换)
          • 2.2.3、LOWER(指定内容转换为小写)
          • 2.2.4、UPPER(指定内容转换为大写)
          • 2.2.5、SUBSTRING(指定内容截取)
          • 2.2.6、CAST / CONVERT (将字符串数字转换成数字类型)
          • 2.3、时间函数
            • 2.3.1、获取时间相关函数
            • 2.3.2、将数字类型时间戳转换成时间格式
            • 2.3.3、将字符串时间转换成数字时间戳
            • 2.4、取整、取小数、取模函数
              • 2.4.1、向上取整
              • 2.4.2、向下取整
              • 2.4.3、不四舍五入取整、取小数
              • 2.4.4、四舍五入取整、取小数
              • 2.4.5、取模
              • 2.5、特殊函数(例如获取随机数)
                • 2.5.1、获取随机数
                • 2.5.2、判断正负
                • 三、高级查询
                  • 3.1 内连接
                  • 3.2 左连接
                  • 3.3 右连接
                  • 3.4 union 拼接结果集(不包含重复行)
                  • 3.5 union all 拼接结果集(包含重复行)

                    一、基础查询

                    1.1、直接查询

                    # 语法:select 字段 from 表名;
                    # 举例: 从 student 表中查询 name 与 age
                    select name, age from student;
                    

                    1.2、为字段取别名

                    # 语法:select 字段 as 别名 from 表名;
                    # 举例: 从 student 表中查询 name 与 age
                    select name as 'myName', age as 'myAge' from student;
                    

                    1.3、去重查询

                    # 语法:select distinct 字段 from 表名;
                    # 举例: 从 student 表中查询 name 并且将结果去重
                    select distinct name from student;
                    

                    1.4、条件查询

                    # 语法:select 字段 from 表名 where 条件;
                    # 举例:从 student 表中查询 age = 15 的 name
                    select name from student where age = 15;
                    

                    1.5、模糊查询

                    # 语法:select 字段 from 表名 where 字段 like '%数据%';
                    # 举例:从 student 表中查询 name 中含有 '张' 的所有记录
                    select * from student where name like '%张%';
                    

                    1.6、逻辑运算符

                    # 语法:and(且), or(或), not(非)
                    # 举例:从 student 表中查询 age = 15 或 sex = 'man' 的所有记录
                    select * from student where age = 15 or sex = 'man';
                    

                    1.7、in与not in运算符

                    # 语法:select 字段 from 表名 where 字段 in(列表)//或 not in(列表);
                    # 举例:从 student 表中查询 age 为 (13, 14, 15) 之间的所有记录
                    举例:select * from student where age in(13, 14, 15);
                    

                    1.8、算术运算符

                    # 语法:>(大于), <(小于), =(等于), !=(不等于), <>(不等于), >=(大于等于), <=(小于等于)
                    # 举例:解析:从 student 表中查询 age < 15 的所有记录
                    select * from student where age < 15;
                    

                    1.9、between and的范围查询

                    # 语法:select 字段 from 表名 where 字段 between 起始值 and 结束值;
                    # 举例:从 student 表中查询 age>=10 且 age<=20 之间的数据
                    select * from student where age between 10 and 20;
                    

                    1.10、排序查询

                    # 语法:select 字段 from 表名 order by 字段 排序方式(升序 asc, 降序 desc);
                    # 举例:从 student 表中查询所有记录并按照 age 升序排序
                    select * from student order by age asc
                    

                    1.11、分组查询

                    • 简单分组查询
                      # 语法:select 分组字段,count(1) from 表名 group by 分组字段;
                      # 举例:从 student 表中查询name,并且对name进行分组统计
                      select name,count(1) from student group by name;
                      
                      • 分组查询将每组中的id都显示出来
                        # 语法:select 分组字段,group_concat(字段) from 表名 group by 分组字段;
                        # 举例:从 student 表中查询name,并且对name进行分组统计,将分组后的id都显示出来
                        select name,group_concat(id) from student group by name;
                        
                        • 配合having一起使用
                          # 语法:select 分组字段,count(1) from 表名 group by 分组字段 having count(1)>=2 order by count(1) desc;
                          # 举例:从 student 表中分组查询name总数大于等于2个的数据,并且对name分组后统计数量进行倒序
                          select name,count(1) from student group by name having count(1)>=2 order by count(1) desc;
                          

                          1.12、分页查询

                          # 语法:select 字段 from 表名 limit 页码,每页显示条数;
                          # 举例:查询 student 表从第一行开始,往后查询5条数据包含第一条, 0 表示第一行记录,也是从 0 开始,和数值类似
                          select * from student where limit 0,5;
                          # or
                          select * from student where limit 5;
                          

                          二、函数使用

                          2.1、统计函数

                          • count() :统计记录的条数;
                          • sum():计算字段的值的总和;
                          • avg():可以求出表中某个字段取值的平均值;
                          • max():可以求出表中某个字段取值的最大值;
                          • min():可以求出表中某个字段取值的最小值。
                            # 语法:select 函数(字段) from 表名;
                            # 举例:统计 student 表中有多少条数据
                            select count(1) from student;
                            

                            PS: 聚合函数会自动忽略null值那一行

                            如: select name,count(name) from student group by name; 就算有多个name值为空,最后统计出来name=null的值也是0,可以使用 ifnull(字段名,默认值) ,不去忽略null值的哪一行,而是赋值一个默认值

                            select name,count(ifnull(name,'张三')) from student group by name;

                            2.2、字符串函数

                            2.2.1、CONCAT(拼接内容)
                            SELECT CONCAT('My','S','QL');
                            # 结果:MySQL
                            
                            2.2.2、REPLACE / INSERT(字符串替换)
                            SELECT REPLACE('这是一个数据库', '一个', 'MySQL');
                            # 结果:这是MySQL数据库
                            SELECT INSERT('这是一个数据库',3,2,'MySQL');
                            # 结果:这是MySQL数据库
                            
                            2.2.3、LOWER(指定内容转换为小写)
                            SELECT LOWER('MYSQL');
                            # 结果:mysql
                            
                            2.2.4、UPPER(指定内容转换为大写)
                            SELECT UPPER('mysql');
                            # 结果:MYSQL
                            
                            2.2.5、SUBSTRING(指定内容截取)
                            SELECT SUBSTRING('JavaMySQLOracle',5,5);
                            # 结果:MySQL
                            
                            2.2.6、CAST / CONVERT (将字符串数字转换成数字类型)
                            # 将字符串数字转换成整型
                            SELECT CAST('123' AS SIGNED);
                            SELECT CONVERT('123', SIGNED);
                            # 将字符串数字转换成浮点型
                            SELECT CAST('123.45' AS DECIMAL(9,2));
                            SELECT CONVERT('123.45', DECIMAL(9,2));
                            

                            2.3、时间函数

                            2.3.1、获取时间相关函数
                            • UNIX_TIMESTAMP() :获取当前时间秒数
                            • SYSDATE() :当前系统时间 (日、月、年、时、分、秒),取的是动态的实时时间
                            • NOW() :取的是语句开始执行的系统时间,取自MySQL的一个变量”TIMESTAMP”,而这个变量在语句开始执行的时候就设定好了,因此在整个语句执行过程中都不会变化
                            • CURDATE() :获取当前日期
                            • CURTIME() :获取当前时间
                            • WEEK(DATE) :获取指定日期为一年中的第几周
                            • YEAR(DATE) :获取指定日期的年份
                            • HOUR(TIME) :获取指定时间的小时值
                            • MINUTE(TIME) :获取时间的分钟值
                            • DATEDIFF(DATE1DATE2) :获取DATE1和DATE2之间相隔的天数
                            • ADDDATE(DATEN) :计算DATE加上N天后的日期
                              # 获取当前时间秒数
                              SELECT UNIX_TIMESTAMP();
                              # 获取当前时间毫秒数
                              SELECT UNIX_TIMESTAMP() * 1000;
                              # 查询系统当前时间
                              SELECT SYSDATE();
                              # 查询当前时间
                              SELECT NOW();
                              # 查询当前日期
                              SELECT CURDATE();
                              # 获取指定日期的年份
                              SELECT YEAR('2023-09-11 00:05:00'); # 结果:2023,这里可以传字符串格式时间也可以传datetime等时间类型,但是不支持时间戳
                              
                              2.3.2、将数字类型时间戳转换成时间格式
                              SELECT FROM_UNIXTIME(1694239200000/1000, '%Y-%m-%d %H:%i:%s'); 
                              # 结果:2023-09-09 14:00:00
                              
                              2.3.3、将字符串时间转换成数字时间戳
                              • 标准日期时间格式
                                SELECT UNIX_TIMESTAMP('2023-09-09 14:00:00') as ts;
                                SELECT UNIX_TIMESTAMP('2023/9/9 14:00:00') as ts;
                                # 结果 1694239200 ,这里得到的是秒,需要乘1000得到毫秒
                                SELECT UNIX_TIMESTAMP('2023-09-09') as ts;
                                SELECT UNIX_TIMESTAMP('2023/9/9') as ts;
                                # 结果 1694188800 ,这里得到的是秒,需要乘1000得到毫秒
                                
                                • 不是标准的日期时间格式
                                  SELECT UNIX_TIMESTAMP(STR_TO_DATE('2023.09.09 14:00:00', '%Y.%m.%d %H:%i:%s')) as ts;
                                  # 结果 1694239200 ,这里得到的是秒,需要乘1000得到毫秒
                                  

                                  2.4、取整、取小数、取模函数

                                  2.4.1、向上取整

                                  ceil(x)或ceiling(x)

                                  SELECT ceil(1.5);
                                  # 结果 2
                                  
                                  2.4.2、向下取整

                                  floor(x)

                                  SELECT floor(1.5);
                                  # 结果 1
                                  
                                  2.4.3、不四舍五入取整、取小数

                                  truncate(x ,y),y代表小数点后几位

                                  SELECT truncate(1.56 ,1);
                                  # 结果 1.5
                                  
                                  2.4.4、四舍五入取整、取小数

                                  round(x ,y)

                                  SELECT round(1.5);
                                  # 结果 2
                                  
                                  2.4.5、取模

                                  mod(x,y)

                                  SELECT mod(3,2);
                                  # 结果 1
                                  

                                  2.5、特殊函数(例如获取随机数)

                                  2.5.1、获取随机数

                                  rand(),返回 0 到 1 的随机数

                                  SELECT rand();
                                  # 结果类似 0.4608162319854053
                                  
                                  2.5.2、判断正负

                                  sign(x),返回 x 的符号,x 是负数返回 -1、x 是0返回 0、x 是正数返回 1

                                  SELECT sign(-2);
                                  # 结果 -1
                                  SELECT sign(0);
                                  # 结果 0
                                  SELECT sign(2);
                                  # 结果 1
                                  

                                  三、高级查询

                                  3.1 内连接

                                  # 语法:select 字段 from 表1 inner join 表2 on 表1.字段 = 表2.字段;
                                  #	根据两个表中共有的字段进行匹配,然后将符合条件的合集进行拼接
                                  #	on后面是连接条件,也就是共有字段
                                  # 举例:将 student 表与 engScore 表通过相同的 name 拼接起来,简单的来说就是两个 excel 合并
                                  select * from student inner join engScore on student.name = engScore.name;
                                  

                                  3.2 左连接

                                  # 语法:select 字段 from 表1 left join 表2 on 连接条件;
                                  # 举例:与内连接形式相同,但左表为主表,指定字段都会显示,右表为从表,无内容会显示 null
                                  select * from student left join engScore on student.name = engScore.name;
                                  

                                  3.3 右连接

                                  # 语法:select 字段 from 表1 right join 表2 on 连接条件;
                                  # 举例:与内连接形式相同,但右表为主表,指定字段都会显示,左表为从表,无内容会显示 null
                                  select * from student right join engScore on student.name = engScore.name;
                                  

                                  3.4 union 拼接结果集(不包含重复行)

                                  # 语法:
                                  # select id,name from 表名 where 字段 = 条件
                                  # union 
                                  # select id,name from 表名 where 字段 = 条件
                                  # 举例:查询name=张三 和 name=李四的数据,不包含重复行
                                  select * from student where `name` = "张三"
                                  union 
                                  select * from student where `name` = "李四"
                                  

                                  3.5 union all 拼接结果集(包含重复行)

                                  # 语法:
                                  # select id,name from 表名 where 字段 = 条件
                                  # union all
                                  # select id,name from 表名 where 字段 = 条件
                                  # 举例:查询name=张三 和 name=李四的数据,包含重复行
                                  select * from student where `name` = "张三"
                                  union all
                                  select * from student where `name` = "李四"