什么是 SQL ?

SQL, 全称为Structured Query Language(结构化查询语言)。 要讲SQL就绕不开database(数据库), 平时所说的数据库,一般就是指的 Relational database(关系型数据库)。

关系型数标题据库(Relational databases)

数据库由若干张表(Table)组成,这里说的数据Table很像Excel里的表; 正如Excel里的表格,Table也是由 行(rows)和列(columns)组成

一个Table存储一个类别的数据,每一行是一条数据,每一列是这种数据的一个属性; Table就像一个二维的表格,列(columns)是有限固定的,行(rows)是无限不固定的。

01 SELECT 查询

SELECT 语句, 通常又称为 查询 (queries), 正如其名, SELECT 可以用来从数据库中取出数据。一条 SELECT 语句或者叫一个查询, 可以描述我们要从什么表取数据, 要取哪些数据,在返回之前怎么对结果做一些转化计算等等。

Select 查询某些属性列(specific columns)的语法
SELECT column(列名), another_column, …
FROM mytable(表名);

如果我们想取出所有列的数据, 当然可以把所有列名写上,不过更简单的方式用星号 (*) 来代表所有列.如下:

Select 查询所有列
SELECT * FROM mytable(表名);

练习题1:


【简单查询】找到所有电影的名称title
【简单查询】找到所有电影的导演
【简单查询】找到所有电影的名称和导演
【简单查询】找到所有电影的名称和上映年份
【简单查询】找到所有电影的所有信息
【简单查询】找到所有电影的名称,Id和播放时长

查看答案请到《【SQL学习】-初学01-答案》

02 条件查询 (constraints)

真实情况下,我们很少直接查所有行,即使查询出来也看不完。为了更精确的查询出特定数据,我们需要学习一个新的SQL语法:SELECT查询的 WHERE 子句. 一个查询的 WHERE子句用来描述哪些行应该进入结果,具体就是通过 condition条件 限定这些行的属性满足某些具体条件。比如:WHERE 体重大于 10KG的狗。你可以把 WHERE想象成一个 筛子,每一个特定的筛子都可以筛下某些豆子。

条件查询语法
SELECT column, another_column, …
FROM mytable
WHERE conditionAND/OR another_conditionAND/OR …;注:这里的 condition 都是描述属性列的,具体会在下面的表格体现。

可以用 AND or OR 这两个关键字来组装多个条件(表示并且,或者)

越是精确的条件筛选,会让结果更容易理解,同时因为条件在返回之前筛掉不必要的结果,SQL的运行速度也会快很多

小贴士
虽然之前我们的SQL 关键之如 SELECT, WHERE, AND,OR 都是大写的,但SQL其实是兼容写成 select,where小写的. 大写这些关键字有助于我们把 关键字 和 你的表名,列名区分开,让 SQL更容易理解。

练习题02

【简单条件】找到id为6的电影
【简单条件】找到在2000-2010年间year上映的电影
【简单条件】找到不是在2000-2010年间year上映的电影
【简单条件】找到头5部电影
【简单条件】找到2010(含)年之后的电影里片长小于两个小时的片子

查看答案请到《【SQL学习】-初学01-答案》

学会了WHERE 语句来筛选数字类型的属性,如果属性是字符串, 我们会用到字符串相关的一些操作符号,其中 LIKE(模糊查询) 和 %(通配符) 是新增的两个. 下面这个表格对字符串操作符有详细的描述:


小贴士
在字符串表达式中的字符串需要用引号 " 包含,如果不用引号,SQL会认为是一个属性列的名字,如:col_name = color 表示 col_name和color两个属性一样的行 col_name = “color” 表示 col_name 属性为字符串 "color"的行.

Select 查询语法复习
SELECT column, another_column, …
FROM mytable
WHERE conditionAND/OR another_conditionAND/OR …;

练习题03

【复杂条件】找到所有Toy Story系列电影
【复杂条件】找到所有John Lasseter导演的电影
【复杂条件】找到所有不是John Lasseter导演的电影
【复杂条件】找到所有电影名为 “WALL-” 开头的电影
【复杂条件】有一部98年电影中文名《虫虫危机》请给我找出来

查看答案请到《【SQL学习】-初学01-答案》

03 查询结果Filtering过滤 和 sorting排序

DISTINCT 语法介绍,我们拿之前的 Movies表来说,可能很多电影都是同一年Year发布的,如果你想要按年份排重,一年只能出现一部电影到结果中, 你可以用 DISTINCT 关键字来指定某个或某些属性列唯一返回。写作:DISTINCT Year

选取出唯一的结果的语法
SELECT DISTINCT column, another_column, …
FROM mytable
WHERE condition(s);

DISTINCT 语法会直接删除重复的行, GROUP BY 也会返回唯一的行,不过可以对具有相同的 属性值的行做一些统计计算,比如:求和.
结果排序 (Ordering results)
在实际的数据表中,数据添加的时候不是完全顺序的,比如我们实际的Dog表,不会是按狗的身高从小到大去添加数据,当数据量成千上万之后,如果结果不做任何排序,结果会看起来很错乱.

为了解决结果排序问题, 我们可以用 ORDER BY col_name 排序的语法来让结果按一个或多个属性列做排序.

**

结果排序(ordered results)

**

SELECT column, another_column, …
FROM mytable
WHERE condition(s)
ORDER BY column ASC/DESC;

ORDER BY col_name 这句话的意思就是让结果按照 col_name 列的具体值做 ASC升序DESC 降序,对数字来说就是升序 1,2,3,… 或降序 … 3,2,1 . 对于文本列,升序和降序指的是按文本的字母序。

通过Limit选取部分结果

LIMIT 和 OFFSET 子句通常和ORDER BY 语句一起使用,当我们对整个结果集排序之后,我们可以 LIMIT来指定只返回多少行结果 ,用 OFFSET来指定从哪一行开始返回。你可以想象一下从一条长绳子剪下一小段的过程,我们通过 OFFSET 指定从哪里开始剪,用 LIMIT 指定剪下多少长度。

select * from table limit 2,1;
-- 含义是跳过2条取一条数据,limit后面是从第二条开始读,读取1条信息,即读取第三条数据select * from table limit 2 offset 1
-- 含义是从第一条(不包括)数据开始取出2条数据,limit后面跟的是2条数据,offset后面是从第一条开始读取,即读取2,3条
limited查询
SELECT column, another_column, …
FROM mytable
WHERE condition(s)
ORDER BY column ASC/DESC
LIMIT num_limit OFFSET num_offset;

你可以想象一下一个新闻网站的新闻条目数据,他们在页面上是按热度和时间排序的,每一个页面只显示10条数据,在所有这些属性都是不断变化的情况下。我们可以想见通过SQL的ORDER LIMIT OFFSET 句法,我们可以根据要求从数据库筛选出需要的新闻条目.

小贴士
如果你对 LIMIT 和 OFFSET 在SQL中何时执行有疑问,可以说LIMIT和OFFSET一般在SQL的其他部分都执行完之后,再执行。 具体有一个章节来说明SQL中不同子句的执行顺序问题 Lesson 12: Order of execution .

练习04

【结果排序】按导演名排重列出所有电影(只显示导演),并按导演名正序排列
【结果排序】列出按上映年份最新上线的4部电影
【结果排序】按电影名字母序升序排列,列出前5部电影
【结果排序】按电影名字母序升序排列,列出上一题之后的5部电影
【结果排序】如果按片长排列,John Lasseter导演导过片长第3长的电影是哪部,列出名字即可

查看答案请到《【SQL学习】-初学01-答案》

04 复习

服务SELECT查询语法
SELECT column, another_column, …
FROM mytable
WHERE condition(s)
ORDER BY column ASC/DESC
LIMIT num_limit OFFSET num_offset;

latitudes(纬度)和 longitudes(经度)的概念, latitudes在赤道以北是正数,以南是负数;longitudes在子午线东部是正数,以西是负数, 在查询中需要注意 经纬度和东西南北方向的对应关系。

【复习】列出所有加拿大人的Canadian信息(包括所有字段)
【复习】列出所有在Chicago西部的城市,从西到东排序(包括所有字段)
【复习】用人口数population排序,列出墨西哥Mexico最大的2个城市(包括所有字段)
【复习】列出美国United States人口3-4位的两个城市和他们的人口(包括所有字段)

05 用JOINs进行多表联合查询

到目前为止我们已经学会了如何做一个单表的查询,但是在现实数据库中往往包含一组相关的数据表,这些表一般会符合数据库范式(normalization)[1]. 让我们先了解下关系数据库的范式

数据库范式(normalization)

数据库范式是数据表设计的规范,在范式规范下,数据库里每个表存储的重复数据降到最少(这有助于数据的一致性维护),同时在数据库范式下,表和表之间不再有很强的数据耦合,可以独立的增长 (ie. 比如汽车引擎的增长和汽车的增长是完全独立的). 范式带来了很多好处,但随着数据表的分离,意味着我们要查询多个数据属性时,需要更复杂的SQL语句,也就是本节开始介绍的多表连接技术。这样SQL的性能也会面临更多的挑战,特别是当大数据量的表很多的情况下.

如果一个实体(比如Dog)的属性数据被分散到多个数据表中,我们就需要学习如何通过 JOIN连表技术来整合这些数据并找到我们想要查询的数据项.

用JOINs进行多表联合查询

主键(primary key), 一般关系数据表中,都会有一个属性列设置为 主键(primary key)。主键是唯一标识一条数据的,不会重复复(想象你的身份证号码)。一个最常见的主键就是auto-incrementing integer(自增ID,每写入一行数据ID+1, 当然字符串,hash值等只要是每条数据是唯一的也可以设为主键.

借助主键(primary key)(当然其他唯一性的属性也可以),我们可以把两个表中具有相同 主键ID的数据连接起来(因为一个ID可以简要的识别一条数据,所以连接之后还是表达的同一条数据)(你可以想象一个左右连线游戏)。具体我们用到 JOIN 关键字。我们先来学习 INNER JOIN.

用INNER JOIN 连接表的语法
SELECT column, another_table_column, …
FROM mytable (主表)
INNER JOIN another_table (要连接的表)ON mytable.id = another_table.id (想象一下刚才讲的主键连接,两个相同的连成1条)
WHERE condition(s)
ORDER BY column, … ASC/DESC
LIMIT num_limit OFFSET num_offset;

通过ON条件描述的关联关系;INNER JOIN 先将两个表数据连接到一起. 两个表中如果通过ID互相找不到的数据将会舍弃。此时,你可以将连表后的数据看作两个表的合并,SQL中的其他语句会在这个合并基础上 继续执行(想一下和之前的单表操作就一样了).
还有一个理解INNER JOIN的方式,就是把 INNER JOIN 想成两个集合的交集。

小贴士
INNER JOIN 可以简写做 JOIN. 两者是相同的意思,但我们还是会继续写作 INNER JOIN 以便和后面的 LEFT JOIN, RIGHT JOIN等相比较.

练习05

【联表】找到所有电影的国内Domestic_sales和国际销售额
【联表】找到所有国际销售额比国内销售大的电影
【联表】找出所有电影按市场占有率rating倒序排列
【联表】每部电影按国际销售额比较,排名最靠前的导演是谁,国际销量多少

06 外连接(OUTER JOINs)

INNER JOIN 只会保留两个表都存在的数据(还记得之前的交集吗),这看起来意味着一些数据的丢失,在某些场景下会有问题.

真实世界中两个表存在差异很正常,所以我们需要更多的连表方式,也就是本节要介绍的左连接LEFT JOIN,右连接RIGHT JOIN 和 全连接FULL JOIN. 这几个 连接方式都会保留不能匹配的行。

用LEFT/RIGHT/FULL JOINs 做多表查询
SELECT column, another_column, …
FROM mytable
INNER/LEFT/RIGHT/FULL JOIN another_tableON mytable.id = another_table.matching_id
WHERE condition(s)
ORDER BY column, … ASC/DESC
LIMIT num_limit OFFSET num_offset;

和INNER JOIN 语法几乎是一样的. 我们看看这三个连接方法的工作原理:
在表A 连接 B, LEFT JOIN保留A的所有行,不管有没有能匹配上B 反过来 RIGHT JOIN则保留所有B里的行。最后FULL JOIN 不管有没有匹配上,同时保留A和B里的所有行

将两个表数据1-1连接,保留A或B的原有行,如果某一行在另一个表不存在,会用 NULL来填充结果数据。所有在用这三个JOIN时,你需要单独处理 NULL. 关于 NULL 下一节会做更详细的说明

小贴士
这些Join也可以写作 LEFT OUTER JOIN, RIGHT OUTER JOIN, 或 FULL OUTER JOIN, 和 LEFT JOIN, RIGHT JOIN, and FULL JOIN 等价.


练习06

【复习】找到所有有雇员的办公室(buildings)名字
【复习】找到所有办公室里的所有角色(包含没有雇员的),并做唯一输出(DISTINCT)
【难题】找到所有有雇员的办公室(buildings)和对应的容量

【SQL学习】-初学01相关推荐

  1. JavaWeb黑马旅游网-学习笔记01【准备工作】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  2. JavaWeb-综合案例(用户信息)-学习笔记01【列表查询】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb-综合案例(用户信息)-学习笔记01[列表查询] JavaWeb-综合案例(用户信息)-学习笔记02[登录功能] JavaWeb-综合案 ...

  3. JDBC学习笔记01【JDBC快速入门、JDBC各个类详解、JDBC之CRUD练习】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  4. MySQL学习笔记01【数据库概念、MySQL安装与使用】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  5. SQL学习(2):大厂真题实例-视频平均播放进度

    SQL学习(2):大厂真题实例-视频平均播放进度 题目来源:<牛客题霸:SQL大厂真题>: 01 某音短视频 SQL2 平均播放进度大于60%的视频类别 文章目录 SQL学习(2):大厂真 ...

  6. SQL Server 进阶 01 数据库的设计

    SQL Server 进阶 01 数据库的设计 本篇目录 课程内容回顾及介绍 为什么需要规范的数据库设计 设计数据库的步骤 绘制E-R(实体-关系)图 实体-关系模型 如何将E-R图转换为表 数据规范 ...

  7. 一名数据分析师的SQL学习历程

    作者:luanhz 来源:小数志 导读 一直认为,扎实的SQL功底是一名数据分析师的安身立命之本,甚至可以称得上是所有数据从业者的基本功.当然,这里的SQL绝不单单是写几条查询语句那么简单,还包括数据 ...

  8. 史上最全SQL学习指南(教程+实例+练习题)

    报告称,未来10年数据细分岗位将扩张5倍,大数据19w的人才缺口将继续增加.国内外一线互联网公司纷纷开设了数据分析岗位. 数据分析岗位中用的最频繁的工具就是SQL了.不论是满足业务日常取数需求,还是自 ...

  9. MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01

    MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01 1. MySQL体系结构和存储引擎 1.1 定义数据库和实例 数据库database: 物理操作系统文件或其他形式文件类型的集合. 当使 ...

最新文章

  1. sklearn使用投票器VotingClassifier算法构建多模型融合的硬投票器分类器(hard voting)并计算融合模型的混淆矩阵、可视化混淆矩阵(confusion matrix)
  2. 带宽计算方法 及 大B与小b 说明
  3. DAVINCI开发原理之三----达芬奇编解码引擎Codec Engine(CE)
  4. 【暴力】MSWORLD
  5. Linux 修改用户名的主目录 家目录
  6. python项目开发案例集锦_在线分享 | 在 VS Code 中一站式完成 Python 项目开发
  7. 计算机机房接地线要求,机房防雷接地规范要求,机房的防雷接地方式?
  8. 域名 与 ip 地址
  9. PWM如何控制直流电机
  10. 打造自己的ip代理池
  11. 查看各大网站服务器操作系统
  12. Android开发wifi功能(附近Wi-Fi,输入密码,链接Wi-Fi)
  13. vue2 vant组件库报错:ERROR in ./node_modules/@vant/use/dist/index.esm.mjs 101:12-19export ‘isVNode‘ (imp
  14. 小米MIUI关闭内容中心通知
  15. 正在播放2020Me比较特别的我_电视剧播放指数榜单,《燕云台》有望成为爆款,只因这两点真不错...
  16. iOS-开发者相关的几种证书
  17. ui动画_ui后效动画指南
  18. 【学习笔记】IGMP snooping原理
  19. 搜狗输入法 exe 文件列表
  20. 2023年一月份图形化四级打卡试题

热门文章

  1. Macrank 下载 office 办公 mac
  2. Android标准APP的四大自动化测试法宝
  3. 表格标签、tr、td、th、table
  4. 从怡亚通到利丰到华润
  5. 2020Java开发工程师的就业方向有哪些
  6. 状态机、混沌状态、机器学习和智能设备
  7. python网络套接字_Python网络编程-socket套接字
  8. 《肖申克的救赎》见解,心得、分享
  9. 利用顺序表建立简单图书管理系统
  10. T 客汇盘点:2017 年备受关注的 20 家企业级服务公司