MySQL中的查询子句
查询语句
字句名称 | 使用目的 |
---|---|
select | 确定结果集中应该包含那些列 |
from | 指明所要提取数据的表,以及这些表是如何连接的 |
where | 过滤不需要的数据 |
group by | 用于对具有想用列值的行进行分组 |
having | 过滤掉不需要的组 |
order by | 按一个或多个列,对最后结果集中的行进行排序 |
select语句由几个组建或者说子句构成。不过在MySQL中,只有一种子句是必不可少的,那就是select子句。
select子句
SELECT * FROM department;
在此查询中,from子句只列出了一个表(department),并且select子句只是在结果集中需要包含所有department表中的列(通过 * 号表示)。该查询的含义可以表是如下:
- 显示department表中所有的行和列
当然也可以选择只获取department表终各列的一个子集,例如:
SELECT name FROM department;
因此select子句的作用可以概括如下:
- select子句用于在所有可能的列中,选择查询结果集要包含哪些列。
我们可以在select子句中加上:
- 字符,比如数字或字符串;
- 表达式,比如transaction.amount*-1;
- 调用内建函数,比如 ROUND(transaction.amount,2);
- 用户自定义的函数调用。
例:
SELECT emp_id,
'ACTIVE',
emp_id * 3.14159,
UPPER(lname)
FROM employee;
如果只是需要执行一个内建函数或对简单的表达式求值可以完全省略from子句,例如:
SELECT VERSION(), USER(), DATABASE();
将会返回MySQL版本,用户,和当前的数据库名。
列的别名
可以在select子句中的每个元素后面增加列别名来达到自定义标签的目的:
SELECT emp_id,
'ACTIVE' status,
emp_id * 3.14159 empid_x_pi,
UPPER(lname) last_name_upper
FROM employee;
为了在子句中更清晰地表是列名,可以在这些别名前面加上关键字as,例如:
SELECT emp_id,
'ACTIVE' AS status,
emp_id * 3.14159 AS empid_x_pi,
UPPER(lname) AS last_name_upper
FROM employee;
去除重复的行
可以在select关键字之后加上distinct关键字来去除重复的行:
SELECT DISTINCT cust_id FROM account;
from子句
- from子句定义了查询中所使用的表,以及连接这些表的方式。
表 是关联行的集合。包含3种类型:
- 永久表(使用
create table
语句创建的表) - 临时表(子查询所返回的表);
- 虚拟表(使用
create view
子句创建的视图)。
子查询产生的表
子查询是包含在另一个查询中的查询。
子查询可以出现在select语句中的各个部分并且被包含在圆括号中。
在from子句中,子查询的作用是根据其他查询子句(其中的from子句可以与其他表进行交互)产生临时表。例:
SELECT
e.emp_id, e.fname, e.lname
FROM (
SELECT
emp_id, fname, lname, start_date, title
FROM employee
) e;
在外围查询中,通过别名(本例中为e)来引用子查询。
视图
视图是存储在数据字典中的查询,它的行为表现得像一个表,但实际上并不拥有任何数据(实际上是一张虚拟表)。
当发出一个对视图的查询时,该查询会被绑定到视图定义上,以产生最终被执行的查询。
例:定义一个查询employee表的视图,其中包含了一个对内奸函数的调用:
CREATE VIEW employee_vw AS
SELECT emp_id, fname, lname,
YEAR(start_date) start_year
FROM employee;
当视图被创建后,并没有产生或存储任何数据,服务器只是简单地保留该查询以供将来使用。现在既然该视图已经存在了,就可以对其发出查询请求,例如:
SELECt emp_id, start_year FROM employee_vw;
表连接
如果from子句中出现了多个表,那么要求同时包含各表之间的连接条件。例:
SELECT employee.emp_id, employee.fname,
employee.lname, department.name dept_name
FROM employee
INNER JOIN
department
ON employee.dept_id = department.dept_id
定义表别名
有两种在from子句之外引用表的方式:
- 使用完整的表名称,如 employee.emp_id;
- 为每一个表指定别名,并在查询中需要的地方使用该别名。
例:
SELECT e.emp_id, e.fname,
e.lname, d.name dept_name
FROM employee e
INNER JOIN
department d
ON e.dept_id = d.dept_id
还可以在别名前面使用as关键字,如:
SELECT e.emp_id, e.fname,
e.lname, d.name dept_name
FROM employee AS e
INNER JOIN
department AS d
ON e.dept_id = d.dept_id
where子句
where子句用于在结果集中过滤掉不需要的行。
例如,如果需要查询employee表,但是只想获取头衔为head teller的雇员数据,那么就可以在查询的where子句中进行指定:
SELECT emp_id, fname, lname, start_date, title
FROM employee
WHERE title = 'Head Teller';
该子句中只包含了一个过滤条件,但在需要时可以同时包含更多的条件,它们之间使用操作符and、or或者not分割:
SELECT emp_id, fname, lname, start_date, title
FROM employee
WHERE title = 'Head Teller'
AND start_date > '2018-01-01'
如果在where子句中需要同时使用and和or等操作符,可以使用圆括号来进行条件分组:
SELECT emp_id, fname, lname, start_date, title
FROM employee
WHERE (title = 'Head Teller' AND start_date > '2018-01-01')
OR (fname='zifeiy' AND start_date > '2017-01-01')
group by和having子句
group by子句用于根据列值对数据进行分组。
在使用group by子句的同时可能还需要使用having子句,它能够以与where子句类似的方式对分组数据进行过滤。
下面的查询首先为每个部门计算其所含的雇员数,然后返回至少包含2个雇员的部门名称:
SELECT d.name, count(e.emp_id) num_employees
FROM department d INNER JOIN employee e
ON d.dept_id = e.dept_id
GROUP BY d.name
HAVING count(e.emp_id) > 2;
order by子句
order by子句用于对结果及中的原始列数据或是根据列数据计算的表达式结果进行排序。
例:
SELECT open_emp_id, product_cd
FROM account
ORDER BY open_emp_id;
业科技结合多列进行排序:
SELECT open_emp_id, product_cd
FROM account
ORDER BY open_emp_id, product_cd;
现在结果及中首先根据雇员ID排序,然后根据账户类型排序。
在order by子句中各列出现的顺序决定了对各列进行排序的次序。
1.升序或降序排序
在排序时,可以通过关键字asc和desc指定是升序还是降序。
由于默认情况下是升序排序,因此只需要在想要降序排序时加上desc关键字即可。例:
SELECT account_id, product_cd, open_date, avail_balance
FROM account
ORDER BY avail_balance DESC;
2.根据表达式排序
可以在order by子句后增加表达式来进行排序:
SELECT cust_id, cust_type_cd, city, state, fed_id
FROM customer
ORDER BY RIGHT(fed_id, 3);
3.根据数字占位符排序
如果需要根据select子句中的列来排序,那么可以选择使用该列位于select子句中的位置号来替代列名。
例如,加沙需要根据返回的第2列和第5列排序,则可以采用如下方法:
SELECT emp_id, title, start_date, fname, lname
FROM employee
ORDER BY 2, 5;
MySQL中的查询子句的更多相关文章
- mysql中如何查询最近24小时、top n查询
MySQL中如何查询最近24小时. where visittime >= NOW() - interval 1 hour; 昨天. where visittime between CURDATE ...
- mysql 中合并查询结果union用法 or、in与union all 的查询效率
mysql 中合并查询结果union用法 or.in与union all 的查询效率 (2016-05-09 11:18:23) 转载▼ 标签: mysql union or in 分类: mysql ...
- mysql中模糊查询的四种用法介绍
下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] ...
- 【原创】7. MYSQL++中的查询结果获取(各种Result类型)
在本节中,我将首先介绍MYSQL++中的查询的几个简单例子用法,然后看一下mysqlpp::Query中的几个与查询相关的方法原型(重点关注返回值),最后对几个关键类型进行解释. 1. MYSQL++ ...
- Mysql中分页查询两个方法比较
mysql中分页查询有两种方式, 一种是使用COUNT(*)的方式,具体代码如下 1 2 3 SELECT COUNT(*) FROM foo WHERE b = 1; SELECT a FROM ...
- mysql中in查询中排序
mysql中in查询条件的时候,很多时候排序是不规则的,如何按照in里面的条件进行排序呢? mysql中给出了办法,在in后面加order by field,order by field的首个条件是按 ...
- 下面介绍mysql中模糊查询的四种用法:
下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] ...
- 【面经】面试官:如何以最高的效率从MySQL中随机查询一条记录?
写在前面 MySQL数据库在互联网行业使用的比较多,有些小伙伴可能会认为MySQL数据库比较小,存储不了很多的数据.其实,这些小伙伴是真的不了解MySQL.MySQL的小不是说使用MySQL存储的数据 ...
- MySQL中的查询事务问题
之前帮同学做个app的后台,使用了MySQL+MyBatis,遇到了一个查询提交的问题,卡了很久,现在有时间了来复盘下 环境情况 假设有学生表: USE test; CREATE TABLE `stu ...
随机推荐
- POJ-1256 next_permutation函数应用
字典序列: 在字典序中蕴含着一个点,就是大小的问题,谁先出现,谁后出现的问题.譬如a<b<c,出现顺序就是a,b,c. 本题中字符集是所有大小写字母,而题目中规定的谁大谁小已经不是按asc ...
- 【Python】 uuid生成唯一ID
uuid uuid是128位的全局唯一标识符(univeral unique identifier),通常用32位的一个字符串的形式来表现.有时也称guid(global unique identif ...
- 【XML】 XML格式一些记录
XML XML格式常用于网络通讯,本身不会有作为而是作为纯文本传输,可以说它是一种独立于应用和硬件的数据传输工具.虽然看起来XML比HTML要更加简单,也知道的更加晚一点,但是需要知道的是,XML才是 ...
- 【Linux】 文本比较工具 diff和cmp
Linux 文本比较工具 ■ diff命令 diff用于逐行比较两个文本文件,列出其不同之处 diff [option] <file1> <file2> file1和file2 ...
- linux --> 获取进程执行时间
获取进程执行时间 一.时间概念 在linux下进行编程时,可能会涉及度量进程的执行时间.linux下进程的时间值分三种: 时钟时间(real time):指进程从开始执行到结束,实际执行的时间. 用户 ...
- java开源安全框架-------Apache Shiro--第二天
身份验证 即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标志信息来表明他就是他本人,如提供身份证.用户名.密码来证明 在shiro中,用户需要提供principals(身份)和crede ...
- 多目标跟踪(MOT)论文随笔-POI: Multiple Object Tracking with High Performance Detection and Appearance Feature
网上已有很多关于MOT的文章,此系列仅为个人阅读随笔,便于初学者的共同成长.若希望详细了解,建议阅读原文. 本文是tracking by detection 方法进行多目标跟踪的文章,最大的特点是使用 ...
- 测试工作中经常用到的几个Linux命令(第一弹)
自己平时测试工作中经常要在Linux下搭建测试环境,有涉及到启动/终止服务器,修改tomcat配置文件,偶尔碰到端口被占用... 这时就不得不需要一些基本的Linux命令来处理遇到的这些问题(顺便迈向 ...
- C语言程序设计(基础)- 第2周作业
1.阅读提问的智慧,要求仔细阅读链接内容,用自己的话描述你的收获,并举例子说明应该如何提问. 2.所有同学请在自己电脑上配置git.编译器(win10 系统的话就Dev-C++).翻译软件,十一回校后 ...
- 一个C&C++程序的生命历程
翻了好多博客,内容星星点点,没找到我想要的,现在吸取大神精华,加上本人拙见,总结如下: 一个C或C++程序从你开始编写,到结束,整个过程,都做了些什么,请看下文: 先看大体的过程:看图: 我在这里主要 ...