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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)