基本的查询语句

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. XUnit 依赖注入

    XUnit 依赖注入 Intro 现在的开发中越来越看重依赖注入的思想,微软的 Asp.Net Core 框架更是天然集成了依赖注入,那么在单元测试中如何使用依赖注入呢? 本文主要介绍如何通过 XUn ...

  2. electron入坑指南

    electron入坑指南 简介 electron 实际集成chrome浏览器和node环境, 运行你写的网页 app 基本目录结构 index.html 名称可以不是index, 这个文件与普通网页的 ...

  3. PowerDesigner导出SQL,注释为空时以name代替

    版本 操作步骤 打开Edit Current DBMS 选中Script->Objects->Column->Add 将Value中的内容全部替换为如下 %20:COLUMN% [% ...

  4. mac 开发新户攻略-brew

    原文 https://www.cnblogs.com/kccdzz/p/7676840.html 这里为了备份一下,方便我自己寻找. 1.介绍 brew是一个软件包管理工具,类似于centos下的yu ...

  5. Bubble Babble Binary Data Encoding的简介以及bubblepy的安装使用方法

    Bubble Babble Binary Data Encoding是由Antti Huima创建的一种编码方法,可以把二进制信息表示为由交替的元音和辅音组成的伪词(pseudo-words),主要用 ...

  6. 从 0 到 1 实现 React 系列 —— 1.JSX 和 Virtual DOM

    看源码一个痛处是会陷进理不顺主干的困局中,本系列文章在实现一个 (x)react 的同时理顺 React 框架的主干内容(JSX/虚拟DOM/组件/生命周期/diff算法/setState/ref/. ...

  7. adb.exe 已停止工作 解决

    netstat -aon|findstr 5037tasklist /fi "PID eq 10388"TASKKILL /F /IM PPAdbServer.exe

  8. day01(计算机组成,进制,内存分布,操作系统)

    本周内容: 第一天: 计算机原理 操作系统 第二天: 编程语言 python入门:环境 - 编辑器 变量 基本数据类型 学习方法: 鸡汤 - 干货 wwwh : what  | why | where ...

  9. ondaHTTPError: HTTP 000 CONNECTION FAILED for url

    可能是网络问题,换网络. 可能是获取库的IP无法链接到,换库的IP,如添加清华镜像IP等.

  10. threejs 初识

    用于展示3D动效,就是 跟拍电影一样,需要有3大模块:scene,camera,renderer. scene:场景,用于放置用到的模型. camera:摄像机,拍电影似的,得有个摄像机. rende ...