一.准备工作

  先把表建立好,方便一会查询.  

create table emp(
id int not null unique auto_increment,
name varchar(20) not null,
sex enum("男","女") not null default "男",
age int(3) unsigned not null default 18,
hire_date date not null,
post varchar(50),
post_comment varchar(100),
salary double(15,2),
office int,
depart_id int
); #插入数据
insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values
('egon','male',18,'','老男孩驻沙河办事处外交大使',7300.33,401,1), #以下是教学部
('alex','male',78,'','teacher',1000000.31,401,1),
('wupeiqi','male',81,'','teacher',8300,401,1),
('yuanhao','male',73,'','teacher',3500,401,1),
('liwenzhou','male',28,'','teacher',2100,401,1),
('jingliyang','female',18,'','teacher',9000,401,1),
('jinxin','male',18,'','teacher',30000,401,1),
('成龙','male',48,'','teacher',10000,401,1), ('歪歪','female',48,'','sale',3000.13,402,2),#以下是销售部门
('丫丫','female',38,'','sale',2000.35,402,2),
('丁丁','female',18,'','sale',1000.37,402,2),
('星星','female',18,'','sale',3000.29,402,2),
('格格','female',28,'','sale',4000.33,402,2), ('张野','male',28,'','operation',10000.13,403,3), #以下是运营部门
('程咬金','male',18,'','operation',20000,403,3),
('程咬银','female',18,'','operation',19000,403,3),
('程咬铜','male',18,'','operation',18000,403,3),
('程咬铁','female',18,'','operation',17000,403,3)
;

二. 查询语法和语句的优先级(重点)

优先级:

重点中的重点:关键字的执行优先级
from
where
group by
having
select
distinct
order by
limit
--------------------------------------------------------------------------------------------
1.找到表:from 2.拿着where指定的约束条件,去文件/表中取出一条条记录 3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组 4.将分组的结果进行having过滤 5.执行select 6.去重 7.将结果按条件排序:order by 8.限制结果的显示条数

语法:

select distinct 字段1,字段2,字段3 from 库.表  #去重
where #条件
group #by 分组条件
having #过滤
order by #排序
limit n;# 显示数目
 1.注意:
select * from t1 where 条件 group by 分组字段
1.分组只能查询分组字段,要想查看其余的利用聚合函数
2.聚合函数的分类:count,min,max,avg,group_concat,sum等。
3.模糊匹配:用like关键字。
select * from t1 where name like '%eg%'; #%表示任意字符
select * from t1 where name like 'd__l'; #一个下划线表示一个字符,两个下划线就表示两个字符
4.拷贝表 :create table t2 select * from t1;
create table t2 select * from t1 where 1=2 ; #只拷贝表结构

知识复习

三.简单查询

#查询所有
#1.select * from emp; # 效率不高,测试时可以使用
#2.select name,sex,age,hire_date,post,salary,office,depart_id from emp;#效率比* 高 #查询指定字段的内容
select name,salary from emp; #查看姓名和薪资情况
#查询去重,比如查询有那几个部门
select distinct post from emp; #在被查询字段前面加上distinct
#查询时 使用四则运算
select name,salary*12 from emp; #计算个人的年薪
select name as "姓名",salary*12 as "年薪" from emp; #给相应的字段设置别名
# 自定义字段格式,使用concat函数.每个字段都可以使用
select concat("姓名:",name)as "姓名",concat("性别:",sex)as "性别",concat("年薪:",salary *12) as "年薪" from emp; #以分隔符来显示内容如:egon:male:18 这种格式
#方式1
select concat(name,":",sex,":",age) from emp;
#方式2
select concat_ws(":",name,sex,age) from emp;
#小练习
"""1 查出所有员工的名字,薪资,格式为
<名字:egon> <薪资:3000>
2 查出所有的岗位(去掉重复)
3 查出所有员工名字,以及他们的年薪,年薪的字段名为annual_year
"""
 select concat("<","名字:",name,">","    <","薪资:",salary,">")from emp;  #1.员工信息
select distinct post from emp; #2.职位去重
select name as "姓名",salary as annual_year from emp; #3.按格式查找年薪

四. 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

#1.单条件查询
#1.查找所有的销售员
select id,name,age from emp where post='sale';
#2.查找工资大于8000的讲师
select id,name,salary from emp where salary >=8000 and post="teacher";
#3,查找薪资大于等于20000,小于等于30000的
#select name,post,salary from emp where 20000<=salary<=30000;# 不支持这样写
select name,post,salary from emp where salary >=20000 and salary <=30000;
select name,post,salary from emp where salary between 20000 and 30000;
#4.查找薪资小于20000 或大于30000的
select name,post,salary from emp where salary <20000 or salary >30000;
select name,post,salary from emp where salary not between 20000 and 30000; #取反.刚好不在20000-30000这个范围内
#5.查找年龄是81,73,48的人
select name,age from emp where age=81 or age=73 or age=48;
select name,age from emp where age in(81,73,48);
#6.查找描述信息是否为null
select * from emp where post_comment is NULL;
#7.查询名字是jin开头的员工
select name from emp where name like"jin%"; #记得加%,表示任意长度的任意字符
select name from emp where name like"jin_"; #下划线表示一个字符,就是说字符长度为4个.

小练习:

1. 查看岗位是teacher的员工姓名、年龄 
2. 查看岗位是teacher且年龄大于30岁的员工姓名、年龄 
3. 查看岗位是teacher且薪资在9000-1000范围内的员工姓名、年龄、薪资 
4. 查看岗位描述不为NULL的员工信息 
5. 查看岗位是teacher且薪资是10000或9000或30000的员工姓名、年龄、薪资 
6. 查看岗位是teacher且薪资不是10000或9000或30000的员工姓名、年龄、薪资
7. 查看岗位是teacher且名字是jin开头的员工姓名、年薪

1. select name,age from emp where post="teacher";
2. select name,age from emp where age >30;
3. select name,age from emp where salary between 9000 and 10000;
4. select * from emp where post_comment is not null;
5. select name,age,salary from emp where post="teacher" and salary in(10000,9000,30000);
6. select name,age,salary from emp where post ="teacher" and salary not in(10000,9000,30000);
7. from emp where post="teacher" and name like"jin%";

答案

五. group by(分组查询)

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

#1、首先明确一点:分组发生在where之后,即分组是基于where之后得到的记录而进行的

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

#3、为何要分组呢?
取每个部门的最高工资
取每个部门的员工数
取男人数和女人数 小窍门:‘每’这个字后面的字段,就是我们分组的依据 #4、大前提:
可以按照任意字段分组,但是分组完毕后,比如group by post,只能查看post字段,如果想查看组内信息,需要借助于聚合函数

注意:如果我们用unique的字段作为分组的依据,则每一条记录自成一组,这种分组没有意义,多条记录之间的某个字段值相同,该字段通常用来作为分组的依据

六. ONLY_FULL_GROUP_BY,聚合函数  

 #设置
set global sql_mode = "ONLY_FULL_GROUP_BY";
#取消
set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

设置和取消ONLY_FULL_GROUP_BY模式

聚合函数:

max,min,sum,count,avg,group_concat

#强调:聚合函数聚合的是组的内容,若是没有分组,则默认一组

示例:
SELECT COUNT(*) FROM emp;
SELECT COUNT(*) FROM emp WHERE depart_id=1;
SELECT MAX(salary) FROM emp;
SELECT MIN(salary) FROM emp;
SELECT AVG(salary) FROM emp;
SELECT SUM(salary) FROM emp;
SELECT SUM(salary) FROM emp WHERE depart_id=3;
  SELECT POST GOURP_CONCAT(name) FROM emp GROUP BY post;    #格式化输出

小练习:

1. 查询岗位名以及岗位包含的所有员工名字
2. 查询岗位名以及各岗位内包含的员工个数
3. 查询公司内男员工和女员工的个数
4. 查询岗位名以及各岗位的平均薪资
5. 查询岗位名以及各岗位的最高薪资
6. 查询岗位名以及各岗位的最低薪资
7. 查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
1.select post,group_concat(name) from emp group by post;
2.select post,count(id) from emp group by post;
3.select sex,count(id) from emp group by sex ;
4.select post,avg(salary) from emp group by post;
5.select post,max(salary) from emp group by post;
6.select post,min(salary) from emp group by post;
7.select sex,avg(salary) from emp group by sex;

 

day 7-16 单表查询的更多相关文章

  1. python实现简易数据库之二——单表查询和top N实现

    上一篇中,介绍了我们的存储和索引建立过程,这篇将介绍SQL查询.单表查询和TOPN实现. 一.SQL解析 正规的sql解析是用语法分析器,但是我找了好久,只知道可以用YACC.BISON等,sqlit ...

  2. MySQL学习9 - 单表查询

    一.单表查询的语法 二.关键字的执行优先级(重点) 三.单表查询示例 1.where约束 2.group by分组查询 3.聚合函数 4.HAVING过滤 5.order by查询排序 6.limit ...

  3. 06-查询操作(DQL)-单表查询

    一. 综述   查询操作主要从两个方面来说:单表查询和多表查询. 单表查询包括:简单查询.过滤查询.结果排序.分页查询.聚集函数. 二 . 案例设计   1. 设计产品表(product).包括:主键 ...

  4. 查询数据SELECT 之单表查询

    一.单表查询的语法与关键字的执行优先级""" # 单表查询# 单标查询完整与法:# select distinct(关键字,代表查询的意思,后面跟)字段1,字段2...( ...

  5. python 全栈开发,Day62(外键的变种(三种关系),数据的增删改,单表查询,多表查询)

    一.外键的变种(三种关系) 本节重点: 如何找出两张表之间的关系 表的三种关系 一.介绍 因为有foreign key的约束,使得两张表形成了三种了关系: 多对一 多对多 一对一 二.重点理解如果找出 ...

  6. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

  7. MySql(六)单表查询

    十.单表查询 一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制 ...

  8. 数据库——SQL数据单表查询

    数据查询   语句格式 SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>] … FROM <表或视图名>[,<表或视图名&g ...

  9. mysq更新(六) 单表查询 多表查询

      本节重点: 单表查询 语法: 一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY fiel ...

  10. 2008技术内幕:T-SQL语言基础 单表查询摘记

    这里的摘抄来自<Microsoft SQL Server 2008技术内幕:T-SQL语言基础>,书中用到的案例数据库是这个 TSQLFundamentals2008 ,官网给出的连接是这 ...

随机推荐

  1. React项目中那些奇怪的写法

    1.在一个React组件里看到一个奇怪的写法: const {matchs} = this.props.matchs; 原来,是解构赋值,虽然听说过,但是看起来有点奇怪 下面做个实验: <scr ...

  2. Android真机调试不打印日志解决方式

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/RowandJJ/article/details/24543459  1.在拨号界面输入:*#*#28 ...

  3. memcache讲解和在.net中初使用

    memcache讲解和在.net中初使用 2017年10月17日 22:51:36 等待临界 阅读数:503   前言 传统数据库面临的问题 数据库死锁 磁盘IO 正文 了解memcache 原理 基 ...

  4. 箱线图boxplot

    箱线图boxplot--展示数据的分布 图表作用: 1.反映一组数据的分布特征,如:分布是否对称,是否存在离群点 2.对多组数据的分布特征进行比较 3.如果只有一个定量变量,很少用箱线图去看数据的分布 ...

  5. P3368 【模板】树状数组 2--洛谷luogu

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的值 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

  6. Python脱产8期 Day12 2019/4/26

    一 函数默认值的细节 1.如果函数的默认参数的默认值为变量,在所属函数定义阶段一执行就被确定为当时变量存放的值 例: a = 100def fn(num=a): print(num) # 100a = ...

  7. [03] 线程同步 synchronized

    1.线程同步概述 线程之间有可能共享一些资源,比如内存.文件.数据库等.多个线程同时读写同一份共享资源时,就可能引起冲突,所以引入了线程的"同步"机制. 所谓同步,就是说线程要有先 ...

  8. Python协程(真才实学,想学的进来)

    真正有知识的人的成长过程,就像麦穗的成长过程:麦穗空的时候,麦子长得很快,麦穗骄傲地高高昂起,但是,麦穗成熟饱满时,它们开始谦虚,垂下麦芒. --蒙田<蒙田随笔全集> *** 上篇论述了关 ...

  9. arm汇编之 bne与beq

    在网上看了一些bne和beq的区别,但是对于初学者来说,容易越看越糊涂,因此简单介绍下: 我们先分析CPSR寄存器的Z标识位: cmp指令可以直接影响CPSR寄存器的Z标识位(条件位),从图中可以看出 ...

  10. Vue-computed的set和get

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...