基本的查询语句

select 语句是由几个组件或者说子句构成。在 MySQL 中,select 子句必不可少,通常的查询语句会至少包含6个子句中的2~3个。下面的表列出了用于不同目的的各个子句。注意:SQL 语句不区分大小写,因此 SELECT 与 select 是相同的。

子句名称 使用目的
select 确定结果集中应该包含哪些列
from 指明所要提取数据的表,以及这些表是如何连接的
where 过滤不需要的数据
group by 用于对具有相同列值的行进行分组
having 过滤掉不需要的组
order by 按一个或多个列,对最后结果集中的行进行排序

select 子句

select 子句不仅能返回 from 子句后面各表中所包含的列,还能返回字符串,数字,表达式,内建函数等。

例如:

SELECT emp_id, 'ACTIVE', emp_id * 3.14159, UPPER(lname) FROM employee;

如果只是执行一个内建函数或对简单的表达式求值,则可以完全省略 from 子句。

例如:

SELECT VERSION(), USER(), DATABASE();

列的别名

SELECT emp_id, 'ACTIVE' AS status, emp_id * 3.14159 AS empid_x_pi, UPPER(lname) AS last_name_upper FROM employee;

也可以去掉 AS 关键字。

去除重复的行

在 select 关键字之后加上 distinct 关键字。

限制查询结果

offset 关键字,limit 关键字可以指定跳过多少行数据以及检索的行数。

例如:

SELECT name FROM product LIMIT 5 OFFSET 3;

MySQL 和 MariaDB 支持简化版的 LIMIT 5 OFFSET 3 语句,即 LIMIT 3,5。逗号之前的值对应 OFFSET,逗号之后的值对应 LIMIT。

from 子句

表的概念

在 SQL 语言中,存在着3种类型的表:

  • 永久表(使用 create table 语句创建的表)
  • 临时表(子查询所返回的表以及使用 create temporary table temp_table_name 语句创建的表)
  • 虚拟表(使用 create view 子句所创建的视图)

子查询

子查询指的是包含在另一个查询中的查询。子查询可以出现在 select 语句中的各个部分并且被包含在圆括号中,并对子查询得到的临时表定义表别名。

例如:

SELECT e.emp_id, e.fname, e.lname FROM (SELECT emp_id, fname, lname, start_date, title FROM employee) e;
在外围查询中,通过别名来引用子查询。

视图

由于视图虽表现得像一个表,但并不拥有任何数据,因此又称之为虚拟表。

例如:

CREATE VIEW person_vw AS SELECT person_id, fname, lname, YEAR(birth_date) year FROM person;
之后对其发出查询请求:
SELECT person_id, year FROM person_vw;

表连接

如果 from 子句出现了多个表,那么要求同时包含各表之间的连接条件。例如:

SELECT employee.emp_id, employee.fname, employee.lname, department.name AS dept_name
FROM employee INNER JOIN department
ON employee.dept_id = department.dept_id;
--这个是内连接

定义表别名

定义表别名与定义列别名是一样的,AS 关键字可省可不省。

where 子句

where 子句的作用是过滤掉我们不感兴趣的行。where 子句可以同时包含多个条件,它们之间使用操作符and, or或者not分割。

构建条件

1)相等条件 =

2)不等条件 != / <>( !=和<>通常可以互换。但是,并非所有 DBMS 都支持这两种不等于操作符。例如,Microsoft Access 支持<>而不支持!=。)

3)范围条件 >,<, >=, <=, between X and Y

4)成员条件 in ,not in

5) 匹配条件 like '含有通配符的搜索表达式' (表示1个字符,%表示任意数目的字符,DB2 不支持通配符)这样我们就可以匹配包含某个字符/字符串或具备固定格式的字符串了,注意不要过度使用通配符

6)检查是否为null——is null,相反的is not null。(通过过滤选择不包含指定值的所有行时,你可能希望返回含 NULL 值的行。但是这做不到。因为未知(unknown)有特殊的含义,数据库不知道它们是否匹配,所以在进行匹配过滤或非匹配过滤时,不会返回这些结果。)

例如:

SELECT * FROM employee WHERE end_date IS NULL AND NOT (title = 'Teller' OR start_date < '2002-01-01');
SELECT cust_id, fed_id FROM customer WHERE fed_id LIKE '___-__-____';
SELECT emp_id, fname, lname FROM employee WHERE lname LIKE 'F%' OR lname LIKE 'G%';

group by子句和having子句

group by 子句用于根据列值对数据分组,having 子句能够以与 where 子句类似的方式对分组数据进行过滤。

例如:

--查询包含两个雇员的部门名称,雇员总数
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 语句中最后一条子句。如果它不是最后的子句,将会出现错误消息。

指定排序方向

在排序时,可以通过关键字 asc 和 desc 指定是升序还是降序,默认是升序。

SELECT account_id, product_cd, open_date, avail_balance FROM account
ORDER BY avail_balance DESC;
--DESC关键字只应用到直接位于其前面的列名。

根据表达式排序

使用列数据对结果集进行排序十分有用,但有时或许还需要根据一些并非存放在数据库中的,甚至可能没有在查询中出现的内容进行排序。比如有个客户表,也许你会需要根据客户的个人识别号码的最后3位数字进行排序:

SELECT cust_id, cust_type_cd, city, state, fed_id FROM customer ORDER BY RIGHT(fed_id, 3);

根据数字占位符排序

除了根据列名来对结果进行排序外,我们还可以选择使用该列位于select子句中的位置号来替代列名。

例如:

SELECT emp_id, title, start_date, fname, lname FROM employee ORDER BY 2, 5;

多表查询

当我们需要将多张表的数据整合到一起时,需要使用连接机制进行多表查询。共有五种连接类型:内连接,外连接,交叉连接,自然连接,自连接。SQL是一种非过程化语言,因此多表连接时 from 子句中各表出现的顺序并不重要。

内连接

内连接返回的结果集是两个表中所有相匹配的数据,通过 on 子句来作为搜索条件。默认情况下,DBMS将多表查询按内连接即 inner join 来执行,不过最好在from子句中显示指定连接类型。还可以将子查询结果作为查询表来进行内连接。

例如:

SELECT a.account_id, a.cust_id, a.open_date, a.product_cd FROM account a INNER JOIN
(SELECT emp_id, assigned_branch_id FROM employee WHERE start_date < '2007-01-01'
AND (title = 'Teller' OR title = 'Head Teller')) e
ON a.open_emp_id = e.emp_id
INNER JOIN (SELECT branch_id FROM branch WHERE name = 'Woburn Branch') b
ON e.assigned_branch_id = b.branch_id;
--注意:主查询中缺少了where子句,因为所有的过滤条件都包含于子查询中,所以主查询不需要任何过滤条件。

视图

为什么使用视图

视图是一种简单的数据查询机制。不同于表,视图不涉及数据存储,因此不同担心视图会充满磁盘空间。通过命名 select 语句来创建视图,然后将这个查询保存起来供其他用户使用,而其他用户使用这个视图时就像他们自己在直接查询数据。使用视图具有以下优点:

  • 数据安全
  • 数据聚合
  • 隐藏复杂性
  • 连接分区数据

SQL学习指南之查询入门的更多相关文章

  1. SQL学习之组合查询(UNION)

    1.大多数的SQL查询只包含从一个或多个表中返回数据的单条SELECT语句,但是,SQL也允许执行多个查询(多条SELECT语句),并将结果作为一个查询结果集返回.这些组合查询通常称为并或复合查询. ...

  2. SQL学习指南第四篇

    SQL必知必会(第4版)学习笔记 插入数据 插入有几种方式: 插入完整的行 插入行的一部分 插入某些查询的结果(INSERT SELECT) 注意:省略列 如果表的定义允许,则可以在 INSERT 操 ...

  3. SQL学习指南第三篇

    再谈连接 外连接 之前的范例都是没有考虑条件可能无法为表中的所有行匹配的问题 左外连接与右外连接 SELECT a.account_id, a.cust_id, b.name FROM account ...

  4. SQL学习指南第二篇

    使用集合 union操作符(组合查询) 多数 SQL 查询只包含从一个或多个表中返回数据的单条 SELECT 语句.但是,SQL 也允许执行多个查询(多条 SELECT 语句),并将结果作为一个查询结 ...

  5. SQL 学习指南-数据库使用

    1.缺失子句 now() 是MySQL的内建函数,返回当前的日期和时间.在MySQL中可以直接使用下列语句查询: SELECT NOW(); 但是某些数据库规定查询语句必须包含 from 子句,并在其 ...

  6. SQL学习指南 ——笔记

    前言:每章的练习题很实用,跟着练了一遍.答案附录有 1.流行的商业级关系数据库:

  7. 准备写一些读书笔记,最近在填坑 SQL学习指南 Spring in Action effective Java

    把一些读书的理解通过白板图的形式展示出来,加深自己的认识, 因为目前没有工程项目练手,暂时在学习中把这些知识深化认识一下

  8. Java工程师学习指南 入门篇

    Java工程师学习指南 入门篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都 ...

  9. SQL学习笔记之SQL查询练习题1

    (网络搜集) 0x00 表名和字段 –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id ...

随机推荐

  1. IPD体系向敏捷开发模式转型实施成功的四个关键因素

    文/杨学明  集成产品开发(IPD).集成能力成熟度模型(CMMI).敏捷开发(Agile Development)是当前国内外企业产品研发管理的最常用的3种模式.随着创新环境的快速发展,许多企业都会 ...

  2. 关于Python, ftplib模块中的cwd()进入含中文目录失败的问题

    使用Python的ftplib模块连接ftp服务器时, 使用cwd()连接含中文的目录, 报错 : UnicodeEncodeError: 'latin-1' codec can't encode c ...

  3. Lcd(一)显示原理

    一.LCD控制原理 S5PV210处理器中自带LCD控制器,控制LCD的显示,把 LCD 图像数据从一个位于系统内存的 video buffer 传送到一个外部的 LCD 驱动器接口. 类型: STN ...

  4. Linux学习历程——Centos 7 mkdir命令

    一.命令介绍 mkdir 命令用于创建空白目录格式为“mkdir [选项] 目录”, 除了能够创建单个空白目录,还能结合 -p 参数来递归创建具有嵌套层叠关系的文件目录. -------------- ...

  5. 图像分析函数:skimage.measure中的label、regionprops

    算法解释详细,有算法执行过程动态GIF图的:https://blog.csdn.net/icvpr/article/details/10259577 算法文字解释的简介易懂的:https://www. ...

  6. win10系统的“USB选择性暂停设置”怎么打开

    Win10系统自带的“USB选择性暂停设置”功能开启后会帮助我们节省电源,这一项功能对于笔记本来说用处很大.那么怎样才能打开这一功能呢?下面小编就来告诉大家打开“USB选择性暂停设置”功能的方法. 1 ...

  7. Boosting Static Representation Robustness for Binary Clone Search against Code Obfuscation and Compiler Optimization(二)

    接着上篇Asm2Vec神经网络模型流程继续,接下来探讨具体过程和细节. 一.为汇编函数建模  二.训练,评估   先来看第一部分为汇编函数建模,这个过程是将存储库中的每一个汇编函数建模为多个序列.由于 ...

  8. 【任务】Python语言程序设计.MOOC学习

    [博客导航] [Python导航] 任务 18年11月29日开始,通过9周时间跨度,投入约50小时时间,在19年1月25日之前,完成中国大学MOOC平台上的<Python语言程序设计>课程 ...

  9. day15-面向对象基础(二)

    今天整理类的组合以及类的三大特性 1.类的组合 2.类的继承 3.类的封装 4.类的多态 开始今日份整理 1.类的组合 类与类之间,并不是独立的,很多的时候在正常使用的时候都是类与类之间互相调用,所以 ...

  10. odoo学习

    odoo视图对应模型:model="ir.ui.view"> <record id="mrp_workcenter_view_light_inherit&qu ...