Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >MySQL之单表查询

MySQL之单表查询

作者头像
人生不如戏
发布于 2018-04-10 07:07:41
发布于 2018-04-10 07:07:41
5K00
代码可运行
举报
文章被收录于专栏:抠抠空间抠抠空间
运行总次数:0
代码可运行

一、单表查询的语法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT 字段1,字段2... 
       FROM 表名
       WHERE 条件
       GROUP BY field
       HAVING 筛选
       ORDER BY field
       LIMIT 限制条数                

二、关键字的执行顺序

1.找到表:from
2.拿着where指定的约束条件,去文件/表中取出一条条记录
3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
4.将分组的结果进行having过滤
5.执行select
6.去重
7.将结果按条件排序:order by
8.限制结果的显示条数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT 字段1,字段2...FROM 表名     ①
       WHERE 条件       ②
       GROUP BY field   ③
       HAVING 筛选    ④
       ORDER BY field  ⑥
       LIMIT 限制条数    ⑦

三、简单查询

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#简单查询
    SELECT id,name,sex,age,hire_date,post,post_comment,salary,office,depart_id 
    FROM employee;

    SELECT * FROM employee;

    SELECT name,salary FROM employee;

#避免重复DISTINCT
    SELECT DISTINCT post FROM employee;    

#通过四则运算查询
    SELECT name, salary*12 FROM employee;
    SELECT name, salary*12 AS Annual_salary FROM employee;
    SELECT name, salary*12 Annual_salary FROM employee;

#定义显示格式
   CONCAT() 函数用于连接字符串
   SELECT CONCAT('姓名: ',name,'  年薪: ', salary*12)  AS Annual_salary 
   FROM employee;
   
   CONCAT_WS() 第一个参数为分隔符
   SELECT CONCAT_WS(':',name,salary*12)  AS Annual_salary 
   FROM employee;

   结合CASE语句:
   SELECT
       (
           CASE
           WHEN NAME = 'egon' THEN
               NAME
           WHEN NAME = 'alex' THEN
               CONCAT(name,'_BIGSB')
           ELSE
               concat(NAME, 'SB')
           END
       ) as new_name
   FROM
       emp;

四、where约束

where字句中可以使用:

1. 比较运算符:> < >= <= <> !=

2. between 80 and 100 值在10到20之间

3. in(80,90,100) 值是10或20或30

4. like 'egon%' pattern可以是%或_, %表示任意多字符 _表示一个字符

5. 逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#1:单条件查询
    SELECT name FROM employee
        WHERE post='sale';
        
#2:多条件查询
    SELECT name,salary FROM employee
        WHERE post='teacher' AND salary>10000;

#3:关键字BETWEEN AND
    SELECT name,salary FROM employee 
        WHERE salary BETWEEN 10000 AND 20000;

    SELECT name,salary FROM employee 
        WHERE salary NOT BETWEEN 10000 AND 20000;
    
#4:关键字IS NULL(判断某个字段是否为NULL不能用等号,需要用IS)
    SELECT name,post_comment FROM employee 
        WHERE post_comment IS NULL;

    SELECT name,post_comment FROM employee 
        WHERE post_comment IS NOT NULL;
        
    SELECT name,post_comment FROM employee 
        WHERE post_comment=''; 注意''是空字符串,不是null
    ps:
        执行
        update employee set post_comment='' where id=2;
        再用上条查看,就会有结果了

#5:关键字IN集合查询
    SELECT name,salary FROM employee 
        WHERE salary=3000 OR salary=3500 OR salary=4000 OR salary=9000 ;
    
    SELECT name,salary FROM employee 
        WHERE salary IN (3000,3500,4000,9000) ;

    SELECT name,salary FROM employee 
        WHERE salary NOT IN (3000,3500,4000,9000) ;

#6:关键字LIKE模糊查询
    通配符’%SELECT * FROM employee 
            WHERE name LIKE 'eg%';

    通配符’_’
    SELECT * FROM employee 
            WHERE name LIKE 'al__';

五 分组查询:GROUP BY

1 什么是分组?为什么要分组?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#1、首先明确一点:分组发生在where之后,即分组是基于where之后得到的记录而进行的

#2、分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等

#3、为何要分组呢?
    取每个部门的最高工资
    取每个部门的员工数
    取男人数和女人数

小窍门:‘每’这个字后面的字段,就是我们分组的依据


#4、大前提:
    可以按照任意字段分组,但是分组完毕后,比如group by post,只能查看post字段,如果想查看组内信息,需要借助于聚合函数

2 GROUP BY

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
单独使用GROUP BY关键字分组
    SELECT post FROM employee GROUP BY post;
    注意:我们按照post字段分组,那么select查询的字段只能是post,想要获取组内的其他相关信息,需要借助函数

GROUP BY关键字和GROUP_CONCAT()函数一起使用
    SELECT post,GROUP_CONCAT(name) FROM employee GROUP BY post;#按照岗位分组,并查看组内成员名
    SELECT post,GROUP_CONCAT(name) as emp_members FROM employee GROUP BY post;

GROUP BY与聚合函数一起使用
    select post,count(id) as count from employee group by post;#按照岗位分组,并查看每个组有多少人

强调:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
如果我们用unique的字段作为分组的依据,则每一条记录自成一组,这种分组没有意义
多条记录之间的某个字段值相同,该字段通常用来作为分组的依据

3 聚合函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#强调:聚合函数聚合的是组的内容,若是没有分组,则默认一组

示例:
    SELECT COUNT(*) FROM employee;
    SELECT COUNT(*) FROM employee WHERE depart_id=1;
    SELECT MAX(salary) FROM employee;
    SELECT MIN(salary) FROM employee;
    SELECT AVG(salary) FROM employee;
    SELECT SUM(salary) FROM employee;
    SELECT SUM(salary) FROM employee WHERE depart_id=3;

4 HAVING过滤

HAVING与WHERE不一样的地方在于!!!!!!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!!!执行优先级从高到低:where > group by > having 
#1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。

#2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select @@sql_mode;
+--------------------+
| @@sql_mode         |
+--------------------+
| ONLY_FULL_GROUP_BY |
+--------------------+
1 row in set (0.00 sec)

mysql> select * from emp where salary > 100000;
+----+------+------+-----+------------+---------+--------------+------------+--------+-----------+
| id | name | sex  | age | hire_date  | post    | post_comment | salary     | office | depart_id |
+----+------+------+-----+------------+---------+--------------+------------+--------+-----------+
|  2 | alex | male |  78 | 2015-03-02 | teacher | NULL         | 1000000.31 |    401 |         1 |
+----+------+------+-----+------------+---------+--------------+------------+--------+-----------+
1 row in set (0.00 sec)

mysql> select * from emp having salary > 100000;
ERROR 1463 (42000): Non-grouping field 'salary' is used in HAVING clause

mysql> select post,group_concat(name) from emp group by post having salary > 10000;#错误,分组后无法直接取到salary字段
ERROR 1054 (42S22): Unknown column 'salary' in 'having clause'
mysql> select post,group_concat(name) from emp group by post having avg(salary) > 10000;
+-----------+-------------------------------------------------------+
| post | group_concat(name) |
+-----------+-------------------------------------------------------+
| operation | 程咬铁,程咬铜,程咬银,程咬金,张野 |
| teacher | 成龙,jinxin,jingliyang,liwenzhou,yuanhao,wupeiqi,alex |
+-----------+-------------------------------------------------------+
2 rows in set (0.00 sec)

六 查询排序:ORDER BY

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
按单列排序
    SELECT * FROM employee ORDER BY salary;
    SELECT * FROM employee ORDER BY salary ASC;
    SELECT * FROM employee ORDER BY salary DESC;

按多列排序:先按照age排序,如果年纪相同,则按照薪资排序
    SELECT * from employee
        ORDER BY age,
        salary DESC;

七 限制查询的记录数:LIMIT

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
示例:
    SELECT * FROM employee ORDER BY salary DESC 
        LIMIT 3;                    #默认初始位置为0 
    
    SELECT * FROM employee ORDER BY salary DESC
        LIMIT 0,5; #从第0开始,即先查询出第一条,然后包含这一条在内往后查5SELECT * FROM employee ORDER BY salary DESC
        LIMIT 5,5; #从第5开始,即先查询出第6条,然后包含这一条在内往后查5

八 使用正则表达式查询

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MySQL中使用 REGEXP 操作符来进行正则表达式匹配。

模式	描述
^	匹配输入字符串的开始位置。 
$	匹配输入字符串的结束位置。
.	匹配任何字符(包括回车和新行)
[...]	字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'[^...]	负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
p1|p2|p3	匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z""food"'(z|f)ood' 则匹配 "zood""food"。
 

# ^  匹配 name 名称 以 "e" 开头的数据
select * from person where name REGEXP '^e';
 
# $  匹配 name 名称 以 "n" 结尾的数据
select * from person where name REGEXP 'n$';
 
# . 匹配 name 名称 第二位后包含"x"的人员 "."表示任意字符
select * from person where name REGEXP '.x';
 
# [abci] 匹配 name 名称中含有指定集合内容的人员
select * from person where name REGEXP '[abci]';
 
# [^alex] 匹配 不符合集合中条件的内容 , ^表示取反
select * from person where name REGEXP '[^alex]';
#注意1^只有在[]内才是取反的意思,在别的地方都是表示开始处匹配
#注意2 : 简单理解 name  REGEXP '[^alex]' 等价于 name != 'alex'
 
# 'a|x' 匹配 条件中的任意值
select * from person where name REGEXP 'a|x';  
 
#查询以w开头以i结尾的数据
select * from person where name regexp '^w.*i$';
#注意:^w 表示w开头, .*表示中间可以有任意多个字符, i$表示以 i结尾
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-03-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL单表查询
3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
changxin7
2019/09/10
18.1K0
SQL学习笔记四(补充-1)之MySQL单表查询
3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
Jetpropelledsnake21
2019/02/15
2.1K0
MySQL单标查询
查询数据的本质:mysql会到你本地的硬盘上找到对应的文件,然后打开文件,按照你的查询条件来找出你需要的数据。下面是完整的一个单表查询的语法 select * from,这个select * 指的是要查询所有字段的数据。 SELECT distinct 字段1,字段2... FROM 库名.表名 #from后面是说从库的某个表中去找数据,mysql会去找到这个库对应的文件夹下去找到你表名对应的那个数据文件,找不到就直接报错了,找到了就继续后面的操作 WHERE 条件 #从表中找符合条件的数据记录,where后面跟的是你的查询条件 GROUP BY field(字段) #分组 HAVING 筛选 #过滤,过滤之后执行select后面的字段筛选,就是说我要确定一下需要哪个字段的数据,你查询的字段数据进行去重,然后在进行下面的操作 ORDER BY field(字段) #将结果按照后面的字段进行排序 LIMIT 限制条数 #将最后的结果加一个限制条数,就是说我要过滤或者说限制查询出来的数据记录的条数关于上面这些内容,我们在下面一个一个的来详细解释
changxin7
2022/05/06
2.7K0
MySQL单表查询的操作和注意事项
基本语法格式: SELECT 字段1,字段2... FROM 表名                   WHERE 条件                   GROUP BY field 分租                   HAVING 筛选                   ORDER BY field 排序                   LIMIT 限制条数
星哥玩云
2022/08/16
1.2K0
MySQL单表查询详细解析
  3,group by:将取出的一条条数据进行分组,如果没有group by,则整体作为一组
星哥玩云
2022/08/17
2.7K0
mysql-单表查询
mysql> create table employee(id int primary key auto_increment,name  varchar(20) not null,sex enum('male','female') not null default 'male',age int(3) unsigned not null default 28,hire_date date not null,post varchar(50),post_comment varchar(100),salary  double(15,2),office int,depart_id int);
py3study
2018/08/03
4.5K0
MySQL总结
2.alter table t1 modify name char(3); 修改类型
changxin7
2019/09/12
1.9K0
MySQL总结
MySQL之单表查询、多表查询
having的语法格式与where一致,只不过having是在分组之后进行的过滤,即where虽然不能用聚合函数,但是having可以!
py3study
2020/01/16
22.2K0
MySQL-复杂查询及条件-起别名-多表查询-04
当表字段特别多的时候,结果的排版可能会出现混乱的现象,你可以在语句最后加 \G 来改变排版,方便查看
suwanbin
2019/09/26
3.9K0
MySQL-复杂查询及条件-起别名-多表查询-04
MYSQL回顾(单表查询相关)
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'alpha.employee.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
VV木公子
2020/02/18
17.3K0
MYSQL回顾(单表查询相关)
MySQL单表查询
MySQL之单表查询 创建表 # 创建表 mysql> create table company.employee5( id int primary key AUTO_INCREMENT not null, name varchar(30) not null, sex enum('male','female') default 'male' not null, hire_date date not null, post varchar(50) not null,
星哥玩云
2022/08/18
6.6K0
MySQL数据查询之单表查询
  3.逻辑运算符: 与 and 或 or (多个条件时,需要使用逻辑运算符进行连接)
全栈程序员站长
2022/07/21
6.5K0
MySQL快速入门(二)
ps:modify只能改字段数据类型完整约束,不能改字段名,但是change可以!
HammerZe
2022/03/24
2.6K0
MySQL快速入门(二)
MySQL数据库3分组与单表、多表查询
select * from 表名 where 列名 in (值1,值2,。。。);
GH
2019/12/16
6.6K0
MySQL数据库3分组与单表、多表查询
SQL学习笔记四(补充-2)之MySQL多表查询
EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录。 而是返回一个真假值。True或False 当返回True时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询
Jetpropelledsnake21
2019/02/15
1.1K0
MySQL的单表多表查询
#4.like 'fdfdsf': parttern可以是%或_。 %表示任意多字符,_表示一个字符
老油条IT记
2020/03/23
14.6K0
mysql的基本操作
一、库操作 创建库:create database 数据库的名字; 删除库:drop database 数据库的名字; 查看当前有多少个数据库:show databases; 查看当前使用的数据库:select database(); 切换到这个数据库(文件夹)下:use 数据库的名字; 二、表操作 2.1 增删改查 增 创建表:create table 表名(字段名 数据类型(长度)); create table day (id int,name char(4)); mysql5.6版本默认是engi
py3study
2020/01/15
1.4K0
SQL的单表查询
create database mydb1; Create database mydb2 character set gbk; Create database mydb3 character set gbk COLLATE gbk_chinese_ci;
全栈程序员站长
2021/07/22
2.3K0
mysql的学习笔记(阶段一)
use mysql; create table if not exists stu2 ( sid int(11), name varchar(10), gender varchar(10), brith date ); show table stu1; show columns from stu1; -- alter table stu2 add address varchar(10); alter table stu2 add (address varchar(10),score int(
兰舟千帆
2022/07/16
6310
MySQ--语句大全
#----综合使用 书写顺序 select distinct * from '表名' where '限制条件' group by '分组依据' having '过滤条件' order by limit '展示条数' 执行顺序 from -- 查询 where -- 限制条件 group by -- 分组 having -- 过滤条件 order by -- 排序 limit -- 展示条数 distinct -- 去重 select -- 查询的结果 正则:select * from emp where name regexp '^j.*(n|y)$'; 集合查询:max 、min 、avg 、sum 、count 、group_concat 。 内连接:inner join 左连接:left join 右连接:right join 全连接: 左连接 union 右连接 replace 替换
用户2337871
2019/12/16
1.8K0
相关推荐
MySQL单表查询
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验