Mysql数据库查询语法详解
数据库的完整查询语法
在平常的工作中经常需要与数据库打交道 , 虽然大多时间都是简单的查询抑或使用框架封装好的ORM的查询方法 , 但是还是要对数据库的完整查询语法做一个加深理解
数据库完整查询语法框架
select [distinct] 字段1 [as 别名], ..., 字段n [as 别名] from [库名.]表名
[
where 约束条件
group by 分组依据
having 过滤条件
order by 排序的字段
limit 限制显示的条数
];
注:
1.查表中所有字段用*表示(select * from ...)
2.条件的书写规则严格按照语法顺序书写,可以缺省,但不可以错序
3.约束条件的流程:from -> where -> group by -> having -> distinct -> order by -> limit
4.字段可以起别名
5.字段可以直接做运算 select age + 1 'new_age' from emp;
6.分组后的条件均可以使用聚合函数
''' '''
3. 伪代码解析流程
def from():
return "查询的文件"
def where(file):
return "条件筛选后的结果"
def group_by(res):
return "分组后的结果"
def having(res):
return "再次过滤后的结果"
def distinct(res):
return "去重后的结果"
def order_by(res):
return "排序后的结果"
def limit(res):
return "限制条数后的结果" def select(from=from, where=null, ..., limit=null):
file = from()
res = where(file) if where else file
res = group_by(res) if group_by else res
...
res = limit(res) if limit else res return res
select(where=where, group_by=group_by)
基础语法
- select field_name from Table_name >>> 表中单个字段查询
- select * from Table_name >>> 表中所有字段查询
where 条件
- 条件可以是各种运算及正则匹配
1. 比较运算符 ```
= < > <= >= !=
``` ```
select * from emp where area!="上海";
``` 2. 区间运算符 between 10 and 20 # 表示10-20 之间 in (10,20,30) # 表示10,20或者30 ```
select * from emp where id between 3 and 5; # [3, 5], 闭合区间,包含3和5
``` 3. 逻辑运算符 and or not ```
select * from emp where area='山东' and port='济南'; mysql> select * from emp where area='山东' and port='济南';
+----+-------+--------+------+--------+--------+--------+-----------+
| id | name | gender | age | salary | area | port | dep |
+----+-------+--------+------+--------+--------+--------+-----------+
| 2 | owen | 男 | 38 | 9.4 | 山东 | 济南 | 技术部 |
| 10 | kevin | 男 | 36 | 5.8 | 山东 | 济南 | 人资部 |
+----+-------+--------+------+--------+--------+--------+-----------+
2 rows in set (0.00 sec)
``` 4. 相似运算符(like) 下划线或者%可以进行模糊匹配 ```
select * from emp where name like '__en%'; # 匹配出Owen mysql> select * from emp where name like '__en%';
+----+------+--------+------+--------+--------+--------+-----------+
| id | name | gender | age | salary | area | port | dep |
+----+------+--------+------+--------+--------+--------+-----------+
| 7 | owen | 男 | 28 | 8.8 | 安徽 | 宣城 | 技术部 |
+----+------+--------+------+--------+--------+--------+-----------+
1 row in set (0.00 sec)
``` 5. 正则匹配(regexp) - 由于like完成模糊匹配的范围有限 , 可以模糊个数 , 但不能模糊类型
- ------正则可以完成类型和个数的模糊匹配(只支持部分语法) ```python
select * from emp where name regexp '.*[0-9]+.*'; # 匹配出名字中带数字的记录 mysql> select * from emp where name regexp '.*[0-9]+.*';
+----+------+--------+------+--------+--------+--------+-----------+
| id | name | gender | age | salary | area | port | dep |
+----+------+--------+------+--------+--------+--------+-----------+
| 13 | san1 | 男 | 30 | 6 | 上海 | 浦东 | 咨询部 |
| 14 | san2 | 男 | 30 | 6 | 上海 | 浦西 | 研发部 |
+----+------+--------+------+--------+--------+--------+-----------+
2 rows in set (0.00 sec)
```
group by 分组依据
- 以记录的字段共性对记录进行分组
- 分组后字段可进行聚合函数处理
___聚合函数___ max():最大值
min():最小值
avg():平均值
sum():和
count():记数
group_concat():组内字段拼接,用来查看组内其他字段 ___example___
# eg1
# 每个部门的平均薪资
select dep, avg(salary) '平均薪资' from emp group by dep;
mysql> select dep, avg(salary) '平均薪资' from emp group by dep;
+-----------+-------------------+
| dep | 平均薪资 |
+-----------+-------------------+
| 咨询部 | 6.250000059604645 |
| 人资部 | 5.400000027247837 |
| 技术部 | 5.850000023841858 |
+-----------+-------------------+
3 rows in set (0.00 sec)
# eg:2
# 每个部门都有哪些人
select dep, group_concat(name) 'name' from emp group by dep;
mysql> select dep,group_concat(name) 'name' from emp group by dep;
+-----------+---------------------------------------+
| dep | name |
+-----------+---------------------------------------+
| 咨询部 | san1,san,ying,zero |
| 技术部 | san2,kevin,owen,jiboy,tank,jerry,engo |
| 人资部 | monkey,yangsir |
+-----------+---------------------------------------+
3 rows in set (0.04 sec)
# eg3
# 各性别中附属于教学部的最高薪资
select max(salary) '最高薪资', gender from emp where dep='教学部' group by gender;
having 筛选
- 对where和group by处理的结果进一步筛选 , 得到我们想要的数据
1.各部门的平均薪资
select dep, avg(salary) '平均薪资' from emp group by dep; 2.平均薪资大于6w的部门(部门与部门的平均薪资)
解决: 以dep进行分组, 以avg(salary)作为判断条件(筛选)
select dep, avg(salary) '平均薪资' from emp group by dep having avg(salary) > 6; # 总结: having通过聚合函数结果完成筛选
select max(salary) from emp having max(salary) > 9.4;
# 虽然没有明确书写group by, 但在having中使用了聚合函数,所以该查询就将整个表当做一个默认大表来考虑,所以查询的字段只能为聚合函数的结果
order by 排序
- 对筛选结果进行升序或者降序排列(默认是升序)
- 升序: asc ; 降序: desc
# eg:order by age desc => 按照年龄降序
select * from emp order by age desc; # 需求:
# 将部门按照部门平均工资降序方式排序
select dep, avg(salary) from emp group by dep order by avg(salary) desc;
limit 限制
- 显示最终数据结果的行数 , 只能与数字配合使用
# limit 1:只能显示一行数据
# limit 6,5:从第6+1行开始显示5条数据(索引从0开始) select * from emp limit 1;
select * from emp limit 6,5; # 需求:
# 获得薪资最高的人的一条信息
select * from emp order by salary desc limit 1;
总结下来 , 对旧的知识又有了新的认识.....想起这并不是最完整的查询语法 , 更加完整的查询语法应该还要算上子查询与父查询, 时间太晚,未完待续......
Mysql数据库查询语法详解的更多相关文章
- 重新学习MySQL数据库7:详解MyIsam与InnoDB引擎的锁实现
重新学习Mysql数据库7:详解MyIsam与InnoDB引擎的锁实现 说到锁机制之前,先来看看Mysql的存储引擎,毕竟不同的引擎的锁机制也随着不同. 三类常见引擎: MyIsam :不支持事务,不 ...
- mysql数据库表分区详解(数量过大的数据库表通过分区提高查询速度)
这篇文章主要介绍了MySQL的表分区,例如什么是表分区.为什么要对表进行分区.表分区的4种类型详解等,需要的朋友可以参考下 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysq ...
- mysql慢查询----pt-query-digest详解慢查询日志(linux系统)
一.简介 pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog.General log.slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdu ...
- MYSQL数据库引擎区别详解
数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HEAP.另 ...
- Mysql数据库配置参数详解大全
名称 是否需要重启 值 允许值 描述 auto_increment_increment 否 1 1-65,535 auto_increment_increment和auto_increment_off ...
- mysql create dabase 语法详解
由于SQL标准的存在,各个关系型数据库管理系统中创建库的语句都差不多 一.mysql 中创建数据库的语法如下: 1.创建数据库的语法: create {database | schema } [if ...
- Lucene查询语法详解
Lucene查询 Lucene查询语法以可读的方式书写,然后使用JavaCC进行词法转换,转换成机器可识别的查询. 下面着重介绍下Lucene支持的查询: Terms词语查询 词语搜索,支持 单词 和 ...
- MySQL数据库图文安装详解及相关问题
(尊重劳动成果,转载请注明出处: http://blog.csdn.net/qq_25827845/article/details/53366444冷血之心的博客) 首先说明:安装目录中不能有中文和空 ...
- linux/Ubuntu系统上安装mysql数据库(附图详解)
在前面的文章中,我已经分享了如何在Ubuntu系统中安装以及搭建java开发环境,那么当我们需要跟数据打交道的时候,那么就需要在ubuntu系统中安装一个数据库了,那么废话就不多说了,我们这里主要是分 ...
随机推荐
- Linux上常用命令整理(一)—— cat
近几个月刚从windows上转过来,开始慢慢熟悉linux,先不撕比到底哪个更好,首先要怀着相互借鉴的精神去了解各个平台. Linux上做开发,除去使用文本编辑器做开发的大神之外,大家(包括我这种菜鸟 ...
- SSIS 抽取excel出错:所请求的 OLE DB 访问接口 Microsoft.ACE.OLEDB.12.0 尚未注册
如果是安装的office2010就要装这个,如果是2007就不用装! http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b ...
- opencv作业
作业下载地址: 链接:http://pan.baidu.com/s/1qYQnbkw 密码:v7y9
- mysql 取整
在mysql中,当处理数值时,会用到数值处理函数,如有一个float型数值2.13,你想只要整数2,那就需要下面的函数floor与round. floor:函数只返回整数部分,小数部分舍弃. ...
- 发现了一个entity framework的BUG
小弟学浅才疏可能是小题大做,但遇上了并且让我麻烦了一阵,就值得记下来 BUG的过程就是我在建立实体模型的时候 命名了一个叫system的实体模型 导致了所有生成类中 引用using system失败
- jar包生成exe可执行程序
1.生成工具EXE4J下载链接:https://www.ej-technologies.com/download/exe4j/files 2.安装.使用:https://blog.csdn.net/h ...
- 1126 数字统计 2010年NOIP全国联赛普及组
1126 数字统计 2010年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 请统计某个 ...
- Kendo UI 单页面应用(四) Layout
Kendo UI 单页面应用(四) Layout Layout 继承自 View,可以用来包含其它的 View 或是 Layout.下面例子使用 Layout 来显示一个 View <div i ...
- 利用bintray-release插件上传到Bintray- HTTP/1.1 404 Not Found [message:Repo 'maven' was not found]问题解决
凡是网上教程 有个5678步的总有这样或者那样的坑. 上周撸了一个小工具准备上传到jcenter,方便管理以及以后使用.看了一下教程,短短几步,弄了很久. 按Hongyang的教程http://www ...
- python中的random
random.randint(a,b) 用于生成一个指定范围内的整数,a为下限,b为上限,生成的随机整数a<=n<=b;若a=b,则n=a:若a>b,报错 import ran ...