SQL必知必会(第5版) 读书笔记
适用范围
本书涵盖的DBMS一般来说,本书中所讲授的SQL可以应用到任何数据库管理系统(DBMS)。但是,各种SQL实现不尽相同,本书介绍的SQL主要适用于以下系统(需要时会给出特殊说明和注释):
❑ IBM DB2(包括云上DB2);❑ Microsoft SQL Server(包括Microsoft SQL Server Express);❑ MariaDB;❑ MySQL;❑ Oracle(包括Oracle Express);❑ PostgreSQL;❑ SQLite。
http://forta.com/books/0135182794
书中所有的数据库示范例
了解mysql
我们需要以某种方式与数据库打交道,而sql正是用来实现这一任务的语言。
其实,每当我们在手机上选取联系人,或是从电子邮件地址里查找名字时,就是在使用数据库。我们在网站上进行搜索,也是在使用数据库。
但尽管我们一直都在使用数据库,但我们仍然对究竟什么事数据库并不清楚。所以,先了解一些最重要的数据库术语,并加以说明。
数据库(database)
从sql的角度来看数据库是以某种有组织的方式储存的数据集合。最简单的方法是将数据库想象成一个文件柜。文件柜只是一个存放数据的物理位置,他不管数据是什么,也不管数据是如何组织的。
数据库是保存有组织的数据的容器(通常是一个文件或一组文件)
ps:人们通常用数据酷这个术语来代表数据库软件,这是不正确的,也因此产生了许多混淆。确切的说,数据库软件应称为数据库管理系统(DBMS)。数据库是通过DBMS创建和操纵的容器,而就他究竟是什么,形式什么样的,各种数据库都不一样。
表(table)
你往文件柜里放资料时,并不是随便将它们扔进某个抽屉就结束了,而是在文件柜中创建文件,然后将相关资料放入特定的文件中。
在数据库领域中,这些文件称为表。表是一种结构化的文件,可用来存储特定的类型的数据。表可以保存顾客清单,产品目录,活着其他信息清单。
表是某种特定类型数据的结构化清单
关键点:存储在表中的数据是同一种类型的数据或清单。绝不要把顾客的清单和订单的清单存储在同一个数据库表中,否则以后的检索和访问会很困难。应该创建两个表,每个清单一个表。
表名
数据库中的每一个表都有一个名字来标识自己。这个名字是唯一的,即数据库中没有其他表具有相同的名字。
在一个数据库中不能使用相同的表名,但在不同的数据库中完全可以使用相同的表名。
表具有一些特性,这些特性定义了数据在表中如何存储,包括存储什么样的数据,数据如何分解,各部分信息如何命名等信息。描述表的这组信息就是所谓的模式(schema),模式可以用来描述数据库中特定的表,也可以用来描述整个数据库(和其中表的关系)
模式
关于数据库和表的布局及特性的信息
列和数据类型
表由列组成。列存储表中某部分的信息。
列(column)
表中的一个字段。所有表都是由一个或多个列组成的。
数据分解
正确的将数据分解为多个列极为重要。例如,城市,州,邮政编码应该总是彼此独立的列。通过分解这些数据,才有可能利用特定的列对数据进行分类和过滤。如果城市和州组合在一个列中,则按州进行分类或过滤就会很困难。
数据类型
允许什么类型的数据。每个表列都有相应的数据类型,他限制(或允许)该列中相应的数据类型。
数据类型限定了可存储在列中的数据种类(例如,放置在数值字段中录入字符值)。数据类型还帮助正确的分类数据,并在优化磁盘使用方面起重要作用。因此,在创建表时必须特效关注所用的数据类型。
数据类型兼容
数据类型及其名称是sql不兼容的一个主要原因。虽然大多数基本数据类型得到了一致的智齿,但许多高级的数据类型却没有。更糟的是,偶然会有相同的数据类型在不同的DBMS中具有不同的名称。对此用户毫无办法,重要的是在创建表结构时要记住这些差异。
行
表中的数据是按行存储的,所保存的每个记录存储在自己的行内。如果江表想象成网格,网格中垂直的列为表列,水平行为表行。
行是表中的一个记录。有些人在提到行时称其为数据库记录(record)。这两个术语多半可以互通,但从技术上,行才是正确的术语。
主键(primary key)
表中每一行都应该有一列(或几列)可以唯一标识自己。顾客表可以使用顾客编号,而订单表可以使用订单id,雇员表可以使用雇员id。
一列(或几列),其值能够唯一标识表中每一行。
唯一标识表中每行的这个列(或这几列)
tips:
应该总是定义主键
虽然并不总是需要主键,但多数数据库设计者都会保证他们创建的每一个表具有一个主键,以便于以后的数据操作和管理。
表中的任何列都可以作为主键,只要他满足以下条件:
1.任意两行都不具有相同的主键值;
2.每一行都必须具有一个主键值(主键列不能为NULL)
3.主键列中的值不允许修改货更新;
4.主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)。
主键通常定义在表的一列上,但并不是必须这么做,也可以一起使用多个列作为主键。在使用多列作为主键时,上述条件必须应用到所有列,所有列值的组合必须是唯一的(但其中单个列的值可以不唯一)。
什么是sql
SQL(发音为字母S-Q-L或sequel)是Structured Query Language(结构化查询语言)的缩写。SQL是一种专门用来与数据库沟通的语言。
设计sql的目的是很好地完成一项任务---提供一种从数据库中读写数据的简单有效的方法。
sql的优点:
1.sql不是某个特定数据库厂商专有的语言。绝大多数重要的DBMS都智齿sql,所以学习此语言使你几乎能与所有数据库打交道。
2.sql简单易学。他的语句全都是由有很强的描述性的英语单词组成,而且这些单词的数目不多。
3.sql虽然看上去很简单,但实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。
本书讲授的SQL主要是ANSI SQL。在使用某种DBMS特定的SQL时,会特别说明。
sql语句
SELECT语句
最近常用的sql语句大概就是select语句了。
他的用途是从一个或多个表中检索信息。
关键字(keyword)
作为sql组成部分的保留字。关键字不能用作表或列的名字。
使用select检索表数据,必须至少给出两条信息---想选择什么,以及从什么地方选择。
简单的select语句
select prod_name
from products;
解析:
上述语句利用select语句从products中检索一名为prod_name的列。所需的列名写在select关键字之后。from关键字指出从哪个表中检索数据。
根据你使用的具体DBMS和客户端,可能你会看到一条信息说明检索了多少行,以及花了多长时间。例如,mysql命令行会显示类似于下面这样一行信息:
9 rows in set (0.01sec)
未排序数据
查询数据的顺序不同,出现这种情况很正常。如果没有明确的排序查询结果,则返回的数据没有特定的顺序。返回数据的顺序可能是数据被添加到表的顺序,也可能不是。只要返回相同行数的行,就是正确的。
结束sql语句
多条sql语句必须以分号(;)分割。多数DBMS不需要在单条sql语句后加分号,但也有DBMS可能必须在单条sql语句后加分号。
sql语句和大小写
sql语句不区分大小写,因此SELECT和select是一样的。同样,写成Select也是没有关系的。
建议sql关键字使用大写,而对于列名和表名使用小写,这样做代码更易于阅读和调试。
使用空格
在处理sql语句时,其中所有的空格都被忽略。sql语句可以写成长长的一行,也可以分写在多行。下面这三种写法的作用是一样的。
1.
select prod_name
from products;
2.
select prod_name from products;
3.
select
prod_name
from
products;
检索多个列
要想从一个表中检索多个列,任然使用相同的select语句。唯一不同是必须在select关键字后给出多个列名,列名之间必须以逗号分隔。
当心逗号,
在选择多个列时,一定要在列名之间加上逗号,但最后一个列名不加。否则会报错。
sql语句一般返回原始的。无格式的数据,不同的DBMS和客户端显示数据的方式略有不同(如对齐格式不同,小数位数不同)。数据的格式化是表示问题,而不是检索问题。因此,如何表示一般会在显示该数据的应用程序中规定。通常很少直接使用实际检索出的数据(没有应用程序提供的格式)
检索所有列
如果不给出任何列名,则select语句将检索表中的所有列。
select *
from products;
SQL必知必会(第5版) 读书笔记的更多相关文章
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 学习《SQL必知必会(第4版)》中文PDF+英文PDF+代码++福达BenForta(作者)
不管是数据分析还是Web程序开发,都会接触到数据库,SQL语法简洁,使用方式灵活,功能强大,已经成为当今程序员不可或缺的技能. 推荐学习<SQL必知必会(第4版)>,内容丰富,文字简洁明快 ...
- 读书笔记--SQL必知必会--建立练习环境
书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL in 10 Minutes - Fourth Edition> MyS ...
- 《SQL必知必会》学习笔记(一)
这两天看了<SQL必知必会>第四版这本书,并照着书上做了不少实验,也对以前的概念有得新的认识,也发现以前自己有得地方理解错了.我采用的数据库是SQL Server2012.数据库中有一张比 ...
- SQL 必知必会
本文介绍基本的 SQL 语句,包括查询.过滤.排序.分组.联结.视图.插入数据.创建操纵表等.入门系列,不足颇多,望诸君指点. 注意本文某些例子只能在特定的DBMS中实现(有的已标明,有的未标明),不 ...
- 《SQL必知必会》笔记
SQL必知必会(第4版) 作者:[美]Ben Forta 本书介绍了sql在不同数据库工具(Oracle.SQLite.SQL server.MySQL.MariaDB.PostgreSQL...)是 ...
- SQL必知必会 -------- SELECT、注释
主要是看<SQL必知必会>第四版的书,而写的一些SQL笔记,红色的是方便以后查询的sql语句,工作中主要是使用mysql数据库,所以笔记也是围绕mysql而写的. 下文调试的数据表sql语 ...
- MySQL必知必会(第4版)整理笔记
参考书籍: BookName:<SQL必知必会(第4版)> BookName:<Mysql必知必会(第4版)> Author: Ben Forta 说明:本书学习笔记 1.了解 ...
- 读书笔记--SQL必知必会12--联结表
12.1 联结 联结(join),利用SQL的SELECT在数据查询的执行中联结表. 12.1.1 关系表 关系数据库中,关系表的设计是把信息分解成多个表,一类数据一个表,各表通过某些共同的值互相关联 ...
- 读书笔记--SQL必知必会18--视图
读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...
随机推荐
- JavaSE--初识&&开发基础
JDK.JRE.JVM JDK:Java Development Kit java开发环境 JRE:Java Runtime Environment java运行时环境 JVM:JAVA Virtua ...
- LRU缓存及其实现
缓存是我们日常开发中来提高性能最直接的方式,经常会听到有人说:性能不行?是因为你没加缓存!常见的缓存有外部缓存服务以及程序内部缓存,外部缓存服务包括:Redis.Memcached等,内部缓存就是我们 ...
- git合并某分支上的单次提交(cherry-pick)
1. 查找提交对应的hash值 git log 查看 d 查看下一页,q退出 vscode通过gitlens插件查看 2.合并提交 git cherry-pick hahs值
- KubeVela 1.5:灵活框选 CNCF 原子能力打造独特的企业应用发布平台
简介: KubeVela 1.5 于近日正式发布.在该版本中为社区带来了更多的开箱即用的应用交付能力,包括新增系统可观测:新增 Cloud Shell 终端,将 Vela CLI 搬到了浏览器:增强的 ...
- 阿里云张新涛:连接产业上下游,构建XR协作生态
简介: 用交互技术辅以澎湃的算力带给大家最真实的"沉浸式体验" 2022年9月2日,在世界人工智能大会"区块新生 数字宇宙--元宇宙技术与生态合作"分论坛上,阿 ...
- [Go] httprouter 自动 OPTIONS 响应 和 CORS
httprouter 是 Gin framework 使用的路由组件. 要对 OPTIONS 请求自动响应,比如支持 CORS 请求或者设置请求头,可用 Router.GlobalOPTIONS. r ...
- WPF 已知问题 InputEventArgs 的 Timestamp 属性是静态的导致事件之间相互影响
本文记录一个 WPF 已知的设计问题,当前此问题已经被大佬修复,这个设计问题刚好属于比较边缘的模块,我写了这么多年的代码还没有踩到这个坑一次,也没有听到有谁提到这个坑 远古时候,不知道大佬是故意还是失 ...
- k3s安装---适配边缘计算场景的轻量级的k8s(二)
三.安装k8s k3s官网:https://k3s.io 文档: github:https://github.com/k3s-io/k3s 3.1 安装基础环境 # 安装基础环境 1.安装yum源 c ...
- 笔记06-第六讲 Cadence同一页面建立电气互连
笔记06-第六讲 Cadence同一页面建立电气互连 内容: 90度和任意角度连线; 连线方式; 十字线添加/删除连接点; Net alias; 无连接的管脚处理; 注意事项. 连线有两种方式,右侧工 ...
- 将字节数组输入流拷贝成字节数组输出流,将ByteArrayInputStream转成ByteArrayOutputStream
/** 将 ByteArrayInputStream 拷贝成 ByteArrayOutputStream * 将 字节数组输入流 拷贝成 字节数组输出流 */ public static ByteAr ...