一.准备工作

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

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. node.js—File System(文件系统模块)

    文件系统模块概述 该模块是核心模块,提供了操作文件的一些API,需要使用require导入后使用,通过 require('fs') 使用该模块 文件 I/O 是由简单封装的标准 POSIX 函数提供的 ...

  2. B - Moo Volume

    Farmer John has received a noise complaint from his neighbor, Farmer Bob, stating that his cows are ...

  3. Pandas 处理丢失数据

    处理丢失数据 import pandas as pd from pandas import Series, DataFrame import numpy as np 有两种丢失数据: 1. None ...

  4. Mybatis之插件拦截

    参考:http://www.mybatis.org/mybatis-3/zh/configuration.html#plugins MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用.默 ...

  5. 网站建设部署与发布--笔记4-部署mysql

    部署MySQL 1.更新操作系统 $ yum update -y 2.安装mysql数据库,在CentOS 7.2 中,使用了mariadb替代了官方的mysql $ yum install mari ...

  6. poj-1330(暴力写的lca)

    传送门 一看就是lca的板子题 然而 (写这个的时候我忘了怎么写lca) 于是我就试着写暴力了 本以为会tle结果e了一次后居然a掉了 开心到起飞.嘿嘿嘿 但还是格式输出错误了一次而且在ce之前也de ...

  7. 玄学bug(1)---注释里面的中文会报错

    有时候正常没有问题的程序会报错,可能跟注释里面的中文也有关系 with open('photo1.jpg','rb') as file: data = file.read() #print(data) ...

  8. C# — Socket通信实现

    昨天晚上在网上查找资料,简单实现了C#开发的Socket通信,以下是具体的开发流程,我使用的是VS2017进行开发的: 一.服务器端: 1.新建一个项目,Windows控制台程序 2.重命名cs文件 ...

  9. Docker网络和容器的通信

    Docker的本地网络实现其实就是利用了Linux上的网络命名空间和虚拟网络设备(特别是veth pair). 基本原理 直观上看,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)与外界 ...

  10. item 23: 理解std::move和std::forward

    本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 根据std::move和std::forward不 ...