MySQL数据查询之单表查询

单表查询简单查询-创建表DROPTABLEIFEXISTS`person`;CREATETABLE`person`(`id`int(11)NOTNULLAUTO_IN

大家好,又见面了,我是你们的朋友全栈君。

单表查询

简单查询

<span role="heading" aria-level="2">MySQL数据查询之单表查询
<span role="heading" aria-level="2">MySQL数据查询之单表查询

- 创建表
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `age` tinyint(4) DEFAULT '0',
  `sex` enum('','','人妖') NOT NULL DEFAULT '人妖',
  `salary` decimal(10,2) NOT NULL DEFAULT '250.00',
  `hire_date` date NOT NULL,
  `dept_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

-- 创建数据

-- 教学部
INSERT INTO `person` VALUES ('1', 'alex', '28', '人妖', '53000.00', '2010-06-21', '1');
INSERT INTO `person` VALUES ('2', 'wupeiqi', '23', '', '8000.00', '2011-02-21', '1');
INSERT INTO `person` VALUES ('3', 'egon', '30', '', '6500.00', '2015-06-21', '1');
INSERT INTO `person` VALUES ('4', 'jingnvshen', '18', '', '6680.00', '2014-06-21', '1');

-- 销售部
INSERT INTO `person` VALUES ('5', '歪歪', '20', '', '3000.00', '2015-02-21', '2');
INSERT INTO `person` VALUES ('6', '星星', '20', '', '2000.00', '2018-01-30', '2');
INSERT INTO `person` VALUES ('7', '格格', '20', '', '2000.00', '2018-02-27', '2');
INSERT INTO `person` VALUES ('8', '周周', '20', '', '2000.00', '2015-06-21', '2');

-- 市场部
INSERT INTO `person` VALUES ('9', '月月', '21', '', '4000.00', '2014-07-21', '3');
INSERT INTO `person` VALUES ('10', '安琪', '22', '', '4000.00', '2015-07-15', '3');

-- 人事部
INSERT INTO `person` VALUES ('11', '周明月', '17', '', '5000.00', '2014-06-21', '4');
-- 鼓励部
INSERT INTO `person` VALUES ('12', '苍老师', '33', '', '1000000.00', '2018-02-21', null);

准备表和数据

 

#查询语法: 
select [distinct]*(所有)|字段名,...字段名 from 表名;
 
#查询所有字段信息
select * from person;
 
#查询指定字段信息
select id,name,age,sex,salary from person;
 
#别名查询,使用的as关键字,as可以省略的
select name,age as'年龄',salary '工资' from person;
 
#直接对列进行运算,查询出所有人工资,并每人增加100块.
select (5/2);
select name, salary+100 from person;
 
#剔除重复查询
select distinct age from person;

条件查询

条件查询:使用 WHERE 关键字 对简单查询的结果集 进行过滤

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

    2. null 关键字: is null , not null

    3.逻辑运算符: 与 and 或 or (多个条件时,需要使用逻辑运算符进行连接)

#查询格式:
select [distinct]*(所有)|字段名,...字段名 from 表名 [where 条件过滤]
 
#比较运算符: > < >= <= = <>(!=)    is null 是否为null
select * from person where age = 23;
select * from person where age <> 23;
select * from person where age is null;
select * from person where age is not null;
 
#逻辑运算符: 与 and 或 or
select * from person where age = 23 and salary =29000;
select * from person where age = 23 or salary =29000;

区间查询

关键字 between 10 and  20 :表示 获得10 到 20 区间的内容

# 使用  between...and  进行区间 查询
select * from person where salary between 4000 and 8000;
ps: between...and 前后包含所指定的值
等价于 select * from person where salary >= 4000 and salary <= 8000;

集合查询

关键字: in, not null

#使用 in 集合(多个字段)查询
select * from person where age in(23,32,18);
等价于: select * from person where  age =23 or age = 32 or age =18;
 
#使用 in 集合 排除指定值查询
select * from person where age not in(23,32,18);

模糊查询

关键字 like , not like

    %:  任意多个字符

       _  : 只能是单个字符

#模糊查询  like %:任意多个字符,  _:单个字符
 
#查询姓名以""字开头的
select * from person where name like '张%';
#查询姓名以""字结尾的
select * from person where name like '%张';
#查询姓名中含有""字的
select * from person where name like '%张%';
 
#查询 name 名称 是四个字符的人
select * from person where name like '____';
#查询 name 名称 的第二个字符是 'l'的人
select * from person where name like '_l%';
 
#排除名字带 a的学生
select * from student where name not like 'a%'

排序查询

关键字: ORDER BY  字段1 DESC, 字段2 ASC

#排序查询格式:
select 字段|* from 表名 [where 条件过滤] [order by 字段[ASC][DESC]]
 
升序:ASC 默认为升序
降序:DESC
PS:排序order by 要写在select语句末尾
 
#按人员工资正序排列,注意:此处可以省略 ASC关键字
select * from person order by salary ASC;
select * from person order by salary;
 
#工资大于5000的人,按工资倒序排列
select * from person where salary >5000 order by salary DESC;
 
#按中文排序
select * from person order by name;
 
#强制中文排序
select * from person order by CONVERT(name USING gbk);
ps:UTF8 默认校对集是 utf8_general_ci , 它不是按照中文来的。你需要强制让MySQL按中文来排序
 

聚合查询

 聚合:  将分散的聚集到一起.

 聚合函数: 对列进行操作,返回的结果是一个单一的值,除了 COUNT 以外,都会忽略空值

COUNT:统计指定列不为NULL的记录行数;

 SUM:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;

  MAX:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;

  MIN:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;

  AVG:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

#格式:
select 聚合函数(字段) from 表名;
 
#统计人员中最大年龄、最小年龄,平均年龄分别是多少
select max(age),min(age),avg(age) from person;

分组查询

分组的含义: 将一些具有相同特征的数据 进行归类.比如:性别,部门,岗位等等

 怎么区分什么时候需要分组呢?  

  套路: 遇到 “每” 字,一般需要进行分组操作.

  例如: 1. 公司每个部门有多少人.

      2. 公司中有 多少男员工 和 多少女员工.

#分组查询格式:
select 被分组的字段 from 表名 group by 分组字段 [having 条件字段]
ps: 分组查询可以与 聚合函数 组合使用.

#查询每个部门的平均薪资
select avg(salary),dept from person  GROUP BY dept;

#查询每个部门的平均薪资 并且看看这个部门的员工都有谁?
select avg(salary),dept,GROUP_CONCAT(name) from person GROUP BY dept;
#GROUP_CONCAT(expr):按照分组,将expr字符串按逗号分隔,组合起来

#查询平均薪资大于10000的部门, 并且看看这个部门的员工都有谁?  
select avg(salary),dept,GROUP_CONCAT(name) from person GROUP BY dept; having avg(salary)>10000;

where 与 having区别:
#执行优先级从高到低:where > group by > having 
#1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。
#2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数

分页查询

好处:限制查询数据条数,提高查询效率

#查询前5条数据
select * from person limit 5;
 
#查询第5条到第10条数据
select * from person limit 5,5;
 
#查询第10条到第15条数据
select * from person limit 10,5;
 
ps: limit (起始条数),(查询多少条数);

正则表达式

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结尾

正则详情参考 :http://www.cnblogs.com/wangfengming/articles/8067037.html

SQL语句关键字执行顺序

查询:姓名不同人员的最高工资,并且要求大于5000元,同时按最大工资进行排序并取出前5条.

select name, max(salary)
   
from person  
   
where name is not null  
   
group by name  
   
having max(salary) > 5000
   
order by max(salary)
 
limit 0,5

SQL 语句的执行顺序如下:

   (1). 首先执行 FROM 子句, 从 person 表 组装数据源的数据

   (2). 执行 WHERE 子句, 筛选 person 表中 name 不为 NULL 的数据

   (3). 执行 GROUP BY 子句, 把 person 表按 “name” 列进行分组

   (4). 计算 max() 聚集函数, 按 “工资” 求出工资中最大的一些数值

   (5). 执行 HAVING 子句, 筛选工资大于 5000的人员.

   (7). 执行 ORDER BY 子句, 把最后的结果按 “Max 工资” 进行排序.

   (8). 最后执行 LIMIT 子句, . 进行分页查询

执行顺序: FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY ->limit  

习题链接:http://www.cnblogs.com/wangfengming/articles/7944029.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/124492.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【cocos2d-js官方文档】十、log「建议收藏」

    【cocos2d-js官方文档】十、log

    2022年1月20日
    54
  • 【转载】究竟什么才是高精度地图(雷锋网)

    【转载】究竟什么才是高精度地图(雷锋网)原文地址:究竟什么才是高精度地图(一)究竟什么才是高精度地图(二)究竟什么才是高精度地图(三)究竟什么才是高精度地图(一)导语:如果有一张辅助的高精度地图,能否避免特斯拉ModelS的事故?

    2022年8月1日
    5
  • Macromedia flash制作落叶飘下动画

    Macromedia flash制作落叶飘下动画flash制作落叶动画打开MacromediaFlash软件,新建一个flash文档将所需所有素材导入到库中设置背景并将拖入到舞台的图片转换为图片元件设置落叶图层为图层2添加引导层,自定义枫叶下落路线轨迹。打开MacromediaFlash软件,新建一个flash文档将所需所有素材导入到库中使用“文件-导入-导入到库”命令将所有素材导入到库中。导入结果如下图设置背景并将拖入到舞台的图片转换为图片元件将库中的图片拖入到舞台中间,自动创建图层1,选中左侧工具栏中的“任意变形工具”,拖动过

    2022年5月2日
    53
  • 发送国外邮箱失败

    发送国外邮箱失败在公司当发送邮件给国外客户的时候,发送失败提示:点击下面链接:则代表地址被加入了黑名单,发送不到邮件。解决方法,点击方框内的网站,打开网页后拉到最下面:点击解除封禁跳转到则表示成功。需要1-2个小时进行解除! 转载于:https://blog.51cto.com/8763846/1629650…

    2022年7月12日
    25
  • php 手机号正则_正则验证手机号是否合法

    php 手机号正则_正则验证手机号是否合法随着时代的发展,手机号码也在不断扩展。当我在进行PHP网页开发的时候,直接采用在网上找的手机号的正则表达式验证,结果后来测试的时候发现:当我使用的手机号177开头的进行输入时,竟然显示请输入正确的手机号,后来一看正则表达式是没有设定17开头的号码,于是又进行了学习,最终,得到了最新手机号的正则表达式验证(如下代码),以供自己和大家日后学习使用。//$phone存放手机号,$phoneErr存放手机号的错误信息//首先判定手机号不为空,然后进行正则表达式的手机号验证if(!empty($phone))

    2025年12月9日
    3
  • 在pycharm中配置Anaconda的python工具包_anaconda pycharm环境配置

    在pycharm中配置Anaconda的python工具包_anaconda pycharm环境配置anacondaanaconda是一个工具包平台,里面有一系列Python编程过程中需要使用的工具包,安装了anaconda就相当于配置好了Python环境,不需要在额外安装一次Python,也不需要再一个个安装工具包,避免了从入门到放弃,anaconda的安装流程如下:首先下载anaconda安装包,可以直接在官网下载,anaconda下载地址根据自身需求下载合适的版本即可。下载完成后,双击安装程序点击next点击Iagree选择AllUsers选择自己的安装路径,点击nex

    2022年8月27日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号