mysql第四篇:数据操作之单表查询
单表查询
一.简单查询
-- 创建表
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
`id` int() NOT NULL AUTO_INCREMENT,
`name` varchar() NOT NULL,
`age` tinyint() DEFAULT '',
`sex` enum('男','女','人妖') NOT NULL DEFAULT '人妖',
`salary` decimal(,) NOT NULL DEFAULT '250.00',
`hire_date` date NOT NULL,
`dept_id` int() DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8; -- 创建数据 -- 教学部
INSERT INTO `person` VALUES ('', 'alex', '', '人妖', '53000.00', '2010-06-21', '');
INSERT INTO `person` VALUES ('', 'wupeiqi', '', '男', '8000.00', '2011-02-21', '');
INSERT INTO `person` VALUES ('', 'egon', '', '男', '6500.00', '2015-06-21', '');
INSERT INTO `person` VALUES ('', 'jingnvshen', '', '女', '6680.00', '2014-06-21', ''); -- 销售部
INSERT INTO `person` VALUES ('', '歪歪', '', '女', '3000.00', '2015-02-21', '');
INSERT INTO `person` VALUES ('', '星星', '', '女', '2000.00', '2018-01-30', '');
INSERT INTO `person` VALUES ('', '格格', '', '女', '2000.00', '2018-02-27', '');
INSERT INTO `person` VALUES ('', '周周', '', '女', '2000.00', '2015-06-21', ''); -- 市场部
INSERT INTO `person` VALUES ('', '月月', '', '女', '4000.00', '2014-07-21', '');
INSERT INTO `person` VALUES ('', '安琪', '', '女', '4000.00', '2015-07-15', ''); -- 人事部
INSERT INTO `person` VALUES ('', '周明月', '', '女', '5000.00', '2014-06-21', '');
-- 鼓励部
INSERT INTO `person` VALUES ('', '苍老师', '', '女', '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结尾
十一 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
mysql第四篇:数据操作之单表查询的更多相关文章
- (七)MySQL数据操作DQL:单表查询1
(1)单表查询 1)环境准备 mysql> CREATE TABLE company.employee5( id int primary key AUTO_INCREMENT not null, ...
- mysql第四篇:数据操作之多表查询
mysql第四篇:数据操作之多表查询 一.多表联合查询 #创建部门 CREATE TABLE IF NOT EXISTS dept ( did int not null auto_increment ...
- Mysql基础(四):库、表、记录的详细操作、单表查询
目录 数据库03 /库.表.记录的详细操作.单表查询 1. 库的详细操作 3. 表的详细操作 4. 行(记录)的详细操作 5. 单表查询 数据库03 /库.表.记录的详细操作.单表查询 1. 库的详细 ...
- mysql查询操作之单表查询、多表查询、子查询
一.单表查询 单表查询的完整语法: .完整语法(语法级别关键字的排列顺序如下) select distinct 字段1,字段2,字段3,... from 库名.表名 where 约束条件 group ...
- 查询数据SELECT 之单表查询
一.单表查询的语法与关键字的执行优先级""" # 单表查询# 单标查询完整与法:# select distinct(关键字,代表查询的意思,后面跟)字段1,字段2...( ...
- 数据库常用SQL语句(一):常用的数据库、表操作及单表查询语句
以MySql数据库为例进行说明 1.数据库操作语句 2.表的操作语句 3.表中的字段操作语句 4.MYSQL支持的完整性约束 数据库管理系统提供了一致机制来检查数据库表中的数据是否满足规定的条件,以保 ...
- 06-查询操作(DQL)-单表查询
一. 综述 查询操作主要从两个方面来说:单表查询和多表查询. 单表查询包括:简单查询.过滤查询.结果排序.分页查询.聚集函数. 二 . 案例设计 1. 设计产品表(product).包括:主键 ...
- MySQL数据库的创建和操作以及多表查询
创建数据库: CREATE DATABASE 数据库名称; 查看所有的数据库: SHOW DATABASES; 操作指定数据库: USE 数据库名称; 查看当前所操作的数据库: SELECT DATA ...
- MySQL入门,第七部分,单表查询
首先我们需要了解一下整个数据库的结构 其中Student表中Sno为主键.Study表中Sno和Cno合起来做主键.Course表中Cno为主键 其创建脚本如下: #----------------- ...
随机推荐
- 一个平凡计算机爱好者的linux进步之路
我从小就对计算机特别感兴趣,小的时候梦想就是拥有一台属于自己的电脑.无奈那时候农村条件限制,学校.家庭都不配备电脑.只好悄悄的跑去网吧研究一番,但毕竟时间有限,生活费有限,也不可能经常去网吧玩,在网吧 ...
- 使用nginx做反向代理来访问tomcat服务器
本次记录的是使用nginx来做一个反向代理来访问tomcat服务器.简单的来说就是使用nginx做为一个中间件,来分发客户端的请求,将这些请求分发到对应的合适的服务器上来完成请求及响应. 第一步:安装 ...
- axis2--生成的wsdl文件方法的参数问题
我是一个使用axis2的新手,发现一个问题: * axis2生成的wsdl文件中关于提供服务的方法,其参数名称丢失,会变成args0 * , 原因: axis2 无法从java字节码中获取关于方法签名 ...
- shiro#springboot
1. shiro的使用围绕着securityManager,权限需要从realm中来. securityManager可以设置realm或者realms,或者通过设置authenticator来设置r ...
- Java小项目之:教你做个聊天系统!
Java小项目之:聊天系统 今天给大家带来的java练手小项目是一个简单的聊天室,界面简单,操作不难. 分为注册系统,登录系统和聊天系统三部分,很适合java小白练手. 完整的源码和素材请关注并私信我 ...
- python实现进程的三种方式及其区别
在python中有三种方式用于实现进程 多进程中, 每个进程中所有数据( 包括全局变量) 都各有拥有⼀份, 互不影响 1.fork()方法 ret = os.fork() if ret == 0: # ...
- Java中null的判断
Java中空指针的异常十分常见 if (name != null && !name.equals("")) { //do something } 或者 if (!& ...
- validate表单验证-单独验证
今天编写一个表单验证程序,我来说一下今天遇到的坑:程序不是通过submit按钮提交验证的,是在自己写的一个方法中提交的,出现了表单无法验证的情况.然后我就了解了一下jquery validate的验证 ...
- tab选项卡,不带自动切换定时器
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...
- P1044 火星数字
P1044 火星数字 转跳点: