【SQL基础】,入门级必备,SQLserver MySQL

一、SQL简介

1、关于SQL

SQL 是用于访问和处理数据库的标准的计算机语言。 在本教程中,您将学到如何使用 SQL 访问和处理数据系统中的数据,这类数据库包括:Oracle, Sybase, SQL Server, DB2, Access 等等。

2、关于SQL数据库

结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。

3、SQL能做什么

  • SQL可以创建新的数据库及其对象(表,索引,视图,存储过程,函数和触发器)。

  • SQL可以修改现有数据库的结构。

  • SQL可以从数据库中删除(删除)对象。

  • SQL可以TRUNCATE(截取)表中的所有记录。

  • SQL可以对数据字典进行COMMENT。

  • SQL可以RENAME一个对象。

  • SQL可以从数据库中选择(检索)数据。

  • SQL可以将数据插入到表中。

  • SQL可以更新表中的现有数据。

  • SQL可以从数据库表中删除记录。

  • SQL可以在数据库中设置用户的GRANT和REVOKE权限。

4、如何在网站中使用 SQL

要创建一个显示数据库中数据的网站,需要:

  • 一个RDBMS数据库程序(即MS Access,SQL Server,MySQL)。

  • 使用服务器端脚本语言,如PHP或ASP。

  • 使用SQL来获取所需的数据。

  • 使用HTML / CSS来设置页面的样式

5、RDBMS

RDBMS 指关系型数据库管理系统,全称 Relational Database Management System。

RDBMS 是 SQL 的基础,同样也是所有现代数据库系统的基础,比如 MS SQL Server、IBM DB2、Oracle、MySQL 以及 Microsoft Access。

RDBMS 中的数据存储在被称为表的数据库对象中。

表是相关的数据项的集合,它由列和行组成。

代码示例:

SELECT * FROM Customers;

每个表都被分解成称为字段的更小的实体。Customers表中的字段由CustomerID,CustomerName,ContactName,Address,City,PostalCode和Country组成。字段是表中的一列,用于维护表中每条记录的特定信息。

记录(也称为行)是表中存在的每个单独条目。例如,在上面的Customers表中有91条记录。记录是表中的横向实体。列是表中的垂直实体,其包含与表中的特定字段相关联的所有信息。

6、SQL语句结构:结构化查询语言包含6个部分

6.1、数据查询语言(DQL:Data Query Language):

其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。

6.2、数据操作语言(DML:Data Manipulation Language):

其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。

  • INSERT-- 插入 (创建记录)

  • DELETE-- 删除 (删除记录)

  • UPDATE-- 修改(修改记录)

  • SELECT -- 检索 (从一个或多个表检索某些记录)

6.3、事务处理语言(TPL):

它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN,TRANSACTION,COMMIT和ROLLBACK。

6.4、数据控制语言(DCL):

它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。

  • GRANT-- 授予权限

  • REVOKE-- 撤销已授予的权限

6.5、数据定义语言(DDL):

其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。

  • CREATE TABLE-- 创建(在数据库中创建新表、表视图或其他对象)

  • ALTER TABLE-- 更改 (修改现有的数据库对象,如表)

  • DROP TABLE-- 删除 (删除数据库中的整个表、表或其他对象的视图)

6.6、指针控制语言(CCL):

它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。

7、SQL数据类型

结构化查询语言中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型。

7.1、字符型(VARCHAR VS CHAR)

VARCHAR型和CHAR型数据都是用来储存字符串长度小于255的字符。

向一个长度为四十个字符的VARCHAR型字段中输入数据Bill Gates。当从这个字段中取出此数据时,取出的数据其长度为十个字符——字符串Bill Gates的长度。如把字符串输入一个长度为四十个字符的CHAR型字段中,当取出数据时,所取出的数据长度将是四十个字符。字符串的后面会被附加多余的空格。

VARCHAR型字段的另一个突出的好处是它可以比CHAR型字段占用更少的内存和硬盘空间。当数据库很大时,这种内存和磁盘空间的节省会变得非常重要。

7.2、文本型(TEXT)

使用文本型数据,可以存放超过二十亿个字符的字符串。当需要存储大串的字符时,应该使用文本型数据。一个文本型字段中的数据通常要么为空,要么很大。

当从HTML FORM的多行文本编辑框(TEXTAREA)中收集数据时,应该把收集的信息存储于文本型字段中。但是,无论何时,只要能避免使用文本型字段,就应该不使用它。文本型字段既大且慢,滥用文本型字段会使服务器速度变慢。文本型字段还会吃掉大量的磁盘空间。

一旦向文本型字段中输入了任何数据(甚至是空值),就会有2K的空间被自动分配给该数据。除非删除该记录,否则无法收回这部分存储空间。

7.3、数值型(整数INT 、小数NUMERIC、钱数MONEY)

INT 对比 SMALLINT 对比 TINYINT:通常,为了节省空间,应该尽可能的使用最小的整型数据。一个TINYINT型数据只占用一个字节;一个INT型数据占用四个字节。这看起来似乎差别不大,但是在比较大的表中,字节数的增长是很快的。另一方面,一旦已经创建了一个字段,要修改它是很困难的。因此,为安全起见,应该预测一下,一个字段所需要存储的数值最大有可能是多大,然后选择适当的数据类型。

NUMERIC:为了能对字段所存放的数据有更多的控制,可以使用NUMERIC型数据来同时表示一个数的整数部分和小数部分。NUMERIC型数据使你能表示非常大的数——比INT型数据要大得多。一个NUMERIC型字段可以存储从-10^38到10^38范围内的数。NUMERIC型数据还使你能表示有小数部分的数。例如,你可以在NUMERIC型字段中存储小数3.14。

MONEY 对比 SMALLMONEY:可以使用 INT型或NUMERIC型数据来存储钱数。但是,专门有另外两种数据类型用于此目的。如果希望网点能挣很多钱,可以使用MONEY型数据。如果野心不大,可以使用SMALLMONEY型数据。MONEY型数据可以存储从-922,337,203,685,477.5808到922,337,203,685,477.5807的钱数。如果需要存储比这还大的金额,可以使用NUMERIC型数据。

SMALLMONEY型数据只能存储从-214,748.3648到214,748.3647 的钱数。同样,如果可以的话,应该用SMALLMONEY型来代替MONEY型数据,以节省空间。

7.4、逻辑型(BIT)

如果使用复选框(CHECKBOX)从网页中搜集信息,可以把此信息存储在BIT型字段中。BIT型字段只能取两个值:0或1。 ​ 注意:在创建好一个表之后,不能向表中添加 BIT型字段。如果打算在一个表中包含BIT型字段,必须在创建表时完成。

7.5、日期型(DATETIME 对比 SMALLDATETIME)

一个 DATETIME型的字段可以存储的日期范围是从1753年1月1日第一毫秒到9999年12月31日最后一毫秒。

如果不需要覆盖这么大范围的日期和时间,可以使用SMALLDATETIME型数据。它与DATETIME型数据同样使用,只不过它能表示的日期和时间范围比DATETIME型数据小,而且不如DATETIME型数据精确。一个SMALLDATETIME型的字段能够存储从1900年1月1日到2079年6月6日的日期,它只能精确到秒。

7.6、Microsoft Access 数据类型

数据类型描述存储
Text用于文本或文本与数字的组合。最多 255 个字符。
MemoMemo 用于更大数量的文本。最多存储 65,536 个字符。 注释:无法对 memo 字段进行排序。不过它们是可搜索的。
Byte允许 0 到 255 的数字。1 字节
Integer允许介于 -32,768 与 32,767 之间的全部数字。2 字节
Long允许介于 -2,147,483,648 与 2,147,483,647 之间的全部数字。4 字节
Single单精度浮点。处理大多数小数。4 字节
Double双精度浮点。处理大多数小数。8 字节
Currency用于货币。支持 15 位的元,外加 4 位小数。 提示:您可以选择使用哪个国家的货币。8 字节
AutoNumberAutoNumber 字段自动为每条记录分配数字,通常从 1 开始。4 字节
Date/Time用于日期和时间8 字节
Yes/No逻辑字段,可以显示为 Yes/No、True/False 或 On/Off。 在代码中,使用常量 True 和 False (等价于 1 和 0)。 注释:Yes/No 字段中不允许 Null 值1 比特
Ole Object可以存储图片、音频、视频或其他 BLOBs(Binary Large OBjects)。最多 1GB
Hyperlink包含指向其他文件的链接,包括网页。
Lookup Wizard允许您创建一个可从下拉列表中进行选择的选项列表。4 字节

7.7、MySQL 数据类型

 在 MySQL 中,有三种主要的类型:Text(文本)、Number(数字)和 Date/Time(日期/时间)类型。

7.7.1、Text 类型:

数据类型描述
CHAR(size)保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符。
VARCHAR(size)保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度。最多 255 个字符。注释:如果值的长度大于 255,则被转换为 TEXT 类型。
TINYTEXT存放最大长度为 255 个字符的字符串。
TEXT存放最大长度为 65,535 个字符的字符串。
BLOB用于 BLOBs(Binary Large OBjects)。存放最多 65,535 字节的数据。
MEDIUMTEXT存放最大长度为 16,777,215 个字符的字符串。
MEDIUMBLOB用于 BLOBs(Binary Large OBjects)。存放最多 16,777,215 字节的数据。
LONGTEXT存放最大长度为 4,294,967,295 个字符的字符串。
LONGBLOB用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。
ENUM(x,y,z,etc.)允许您输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。 注释:这些值是按照您输入的顺序排序的。 可以按照此格式输入可能的值: ENUM('X','Y','Z')
SET与 ENUM 类似,不同的是,SET 最多只能包含 64 个列表项且 SET 可存储一个以上的选择。

7.7.2、Number 类型:

数据类型描述
TINYINT(size)-128 到 127 常规。0 到 255 无符号*。在括号中规定最大位数。
SMALLINT(size)-32768 到 32767 常规。0 到 65535 无符号*。在括号中规定最大位数。
MEDIUMINT(size)-8388608 到 8388607 普通。0 to 16777215 无符号*。在括号中规定最大位数。
INT(size)-2147483648 到 2147483647 常规。0 到 4294967295 无符号*。在括号中规定最大位数。
BIGINT(size)-9223372036854775808 到 9223372036854775807 常规。0 到 18446744073709551615 无符号*。在括号中规定最大位数。
FLOAT(size,d)带有浮动小数点的小数字。在 size 参数中规定最大位数。在 d 参数中规定小数点右侧的最大位数。
DOUBLE(size,d)带有浮动小数点的大数字。在 size 参数中规定最大位数。在 d 参数中规定小数点右侧的最大位数。
DECIMAL(size,d)作为字符串存储的 DOUBLE 类型,允许固定的小数点。在 size 参数中规定最大位数。在 d 参数中规定小数点右侧的最大位数。

注意:这些整数类型拥有额外的选项 UNSIGNED。通常,整数可以是负数或正数。如果添加 UNSIGNED 属性,那么范围将从 0 开始,而不是某个负数。

7.7.3、Date 类型:

数据类型描述
DATE()日期。格式:YYYY-MM-DD 注释:支持的范围是从 '1000-01-01' 到 '9999-12-31'
DATETIME()*日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS 注释:支持的范围是从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'
TIMESTAMP()*时间戳。TIMESTAMP 值使用 Unix 纪元('1970-01-01 00:00:00' UTC) 至今的秒数来存储。格式:YYYY-MM-DD HH:MM:SS 注释:支持的范围是从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC
TIME()时间。格式:HH:MM:SS 注释:支持的范围是从 '-838:59:59' 到 '838:59:59'
YEAR()2 位或 4 位格式的年。 注释:4 位格式所允许的值:1901 到 2155。2 位格式所允许的值:70 到 69,表示从 1970 到 2069。

注意:即便 DATETIME 和 TIMESTAMP 返回相同的格式,它们的工作方式很不同。在 INSERT 或 UPDATE 查询中,TIMESTAMP 自动把自身设置为当前的日期和时间。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。

7.8、SQL Server 数据类型

7.8.1、String 类型:

数据类型描述存储
char(n)固定长度的字符串。最多 8,000 个字符。Defined width
varchar(n)可变长度的字符串。最多 8,000 个字符。2 bytes + number of chars
varchar(max)可变长度的字符串。最多 1,073,741,824 个字符。2 bytes + number of chars
text可变长度的字符串。最多 2GB 文本数据。4 bytes + number of chars
nchar固定长度的 Unicode 字符串。最多 4,000 个字符。Defined width x 2
nvarchar可变长度的 Unicode 字符串。最多 4,000 个字符。
nvarchar(max)可变长度的 Unicode 字符串。最多 536,870,912 个字符。
ntext可变长度的 Unicode 字符串。最多 2GB 文本数据。
bit允许 0、1 或 NULL
binary(n)固定长度的二进制字符串。最多 8,000 字节。
varbinary可变长度的二进制字符串。最多 8,000 字节。
varbinary(max)可变长度的二进制字符串。最多 2GB。
image可变长度的二进制字符串。最多 2GB。

7.8.2、Number 类型:

数据类型描述存储
tinyint允许从 0 到 255 的所有数字。1 字节
smallint允许介于 -32,768 与 32,767 的所有数字。2 字节
int允许介于 -2,147,483,648 与 2,147,483,647 的所有数字。4 字节
bigint允许介于 -9,223,372,036,854,775,808 与 9,223,372,036,854,775,807 之间的所有数字。8 字节
decimal(p,s)固定精度和比例的数字。 允许从 -10^38 +1 到 10^38 -1 之间的数字。 p 参数指示可以存储的最大位数(小数点左侧和右侧)。 p 必须是 1 到 38 之间的值。默认是 18。 s 参数指示小数点右侧存储的最大位数。 s 必须是 0 到 p 之间的值。默认是 0。5-17 字节
numeric(p,s)固定精度和比例的数字。 允许从 -10^38 +1 到 10^38 -1 之间的数字。 p 参数指示可以存储的最大位数(小数点左侧和右侧)。 p 必须是 1 到 38 之间的值。默认是 18。 s 参数指示小数点右侧存储的最大位数。 s 必须是 0 到 p 之间的值。默认是 0。5-17 字节
smallmoney介于 -214,748.3648 与 214,748.3647 之间的货币数据。4 字节
money介于 -922,337,203,685,477.5808 与 922,337,203,685,477.5807 之间的货币数据。8 字节
float(n)从 -1.79E + 308 到 1.79E + 308 的浮动精度数字数据。 n 参数指示该字段保存 4 字节还是 8 字节。 float(24) 保存 4 字节,而 float(53) 保存 8 字节。n 的默认值是 53。4 或 8 字节
real从 -3.40E + 38 到 3.40E + 38 的浮动精度数字数据。4 字节

7.8.2、Date 类型:

数据类型描述存储
datetime从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 3.33 毫秒。8 字节
datetime2从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 100 纳秒。6-8 字节
smalldatetime从 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度为 1 分钟。4 字节
date仅存储日期。从 0001 年 1 月 1 日 到 9999 年 12 月 31 日。3 bytes
time仅存储时间。精度为 100 纳秒。3-5 字节
datetimeoffset与 datetime2 相同,外加时区偏移。8-10 字节
timestamp存储唯一的数字,每当创建或修改某行时,该数字会更新。 timestamp 值基于内部时钟,不对应真实时间。 每个表只能有一个 timestamp 变量。

7.8.3、其他数据类型:

数据类型描述
sql_variant存储最多 8,000 字节不同数据类型的数据,除了 text、ntext 以及 timestamp。
uniqueidentifier存储全局唯一标识符 (GUID)。
xml存储 XML 格式化数据。最多 2GB。
cursor存储对用于数据库操作的指针的引用。
table存储结果集,供稍后处理。

8、主机

如果将网站存储数据在数据库,并从数据库显示数据, Web 服务器必须能使用 SQL 语言访问数据库系统。

 如果 Web 服务器托管在互联网服务提供商(ISP,全称 Internet Service Provider),必须寻找 SQL 主机计划。

 最常见的 SQL 主机数据库是 MySQL、MS SQL Server 和 MS Access。

 可以在 Windows 和 Linux/UNIX 操作系统上运行 SQL 主机数据库。

 下面是操作系统上对应运行的数据库系统的概览

  • MS SQL Server 只在 Windows OS 上运行。

  • MySQL 在 Windows, Mac OS X 和 Linux/UNIX 操作系统上运行。

  • MS Access(只建议用于小型网站) 只在 Windows OS 上运行。

二、关于RDBMS

1、SQL RDBMS 概念

 RDBMS是关系数据库管理系统(Relational Database Management System)的缩写。

 RDBMS是SQL的基础,也是所有现代数据库系统(如MS SQL Server、IBMDB2、Oracle、MySQL和MicrosoftAccess)的基础。

 关系数据库管理系统(Relational Database Management System,RDBMS)是一种基于E.F.Codd提出的关系模型的数据库管理系统。

2、什么是表?

 RDBMS中的数据存储在称为表的数据库对象中。这个表基本上是一个相关数据条目的集合,它由许多列和行组成。表是关系数据库中最常见和最简单的数据存储形式。

3、什么是字段?

 每个表都被分解成更小的实体,称为字段。字段是表中的列,用于维护有关表中每条记录的特定信息。

4、什么是记录或者行数据?

 记录也称为数据行,即表中存在的每个单独的条目。 记录是表中的水平实体。

5、什么是列?

 列是表中的垂直实体,其中包含与表中特定字段关联的所有信息。

6、什么是空值?

 表中的空值是显示为空的字段中的值,这意味着具有空值的字段是没有值的字段。

 非常重要的一点是空值不同于零值或包含空格的字段。具有空值的字段是在创建记录时留空的字段。

7、SQL约束

 约束是在表上的数据列上强制执行的规则。它们用于限制可以进入表中的数据类型。确保了数据库中数据的准确性和可靠性。

 约束可以是列级别,也可以是表级别。列级约束仅应用于一列,而表级约束则应用于整个表。

 以下是sql中可用的一些最常用的约束

NOT NULL 约束:保证列中数据不能有 NULL 值
DEFAULT 约束:提供该列数据未指定时所采用的默认值
UNIQUE 约束:保证列中的所有数据各不相同(唯一性约束)
主键约束:唯一标识数据表中的行/记录
外键约束:唯一标识其他表中的一条行/记录
CHECK 约束:此约束保证列中的所有值满足某一条件
索引:用于在数据库中快速创建或检索数据

 约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。

8、数据完整性

 每个关系数据库管理系统都存在以下类型的数据完整性:

实体完整性−表中没有重复行。
域完整性−通过限制值的类型、格式或范围来强制执行给定列的有效条目。
引用完整性−不能删除其他记录使用的行。
用户定义的完整性−强制执行一些不属于实体、域或引用完整性的特定业务规则。

9、数据库规范化

 数据库规范化是在数据库中有效地组织数据的过程。这个规范化过程有两个原因:

消除冗余数据,例如,将相同的数据存储在多个表中。 
确保数据依赖关系是有意义的。

 这两个原因都是值得追求的目标,因为它们减少了数据库消耗的空间量,并确保了数据的逻辑存储。

 规范化由一系列指导原则组成,有助于指导您创建良好的数据库结构。

 规范化指导原则称为范式(范式:Normal Form,可缩写为NF),范式的目的是组织数据库结构,使其符合第一范式、第二范式和第三范式的规则。

 可以更长远的去选择第四范式,第五范式,等等,但一般来说,第三范式已经足够了。

1NF:在关系模型中,对于添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项,简单来说就是:列不可再分。
2NF:在1NF的基础上,非码属性必须完全依赖于候选码,简单来说就是:非主属性不能只依赖主键的部分。
3NF:在2NF基础上,任何非主属性不依赖于其它非主属性,简单来说就是:每列数据都与主键直接相关。

三、SQL语法

1、SQL 语法规则

SQL语句总是以关键字开始,如SELECT、INSERT、UPDATE、DELETE、DROP、CREATE。
SQL语句以分号结尾。
SQL不区分大小写,意味着update与UPDATE相同。

2、数据库表

数据库通常包含一个或多个表。每个表都用一个名称标识(例如,"Customers"或"Orders")。表包含带有数据(行)的记录。

下面是选自 "Customers" 表的数据:

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico
4Around the HornThomas Hardy120 Hanover Sq.LondonWA1 1DPUK
5Berglunds snabbköpChristina BerglundBerguvsvägen 8LuleåS-958 22Sweden

 上面的表包含五条记录(每一条对应一个客户)和七个列(CustomerID、CustomerName、ContactName、Address、City、PostalCode 和 Country)。

3、SQL 语句

 需要在数据库上执行的大部分操作都是使用SQL语句完成的。

 以下SQL语句选择“Customers”表中的所有记录: SQL 对大小写不敏感,SELECT 与 select 是相同的。

SELECT * FROM Customers;

4、SQL 语句后面的分号?

一些数据库系统需要在每个SQL语句的末尾使用分号。
分号是分离数据库系统中每个SQL语句的标准方法,这样就可以在对服务器的同一请求中执行多个SQL语句。 

5、一些最重要的 SQL 命令

SELECT - 从数据库中提取数据
UPDATE - 更新数据库中的数据
DELETE - 从数据库中删除数据
INSERT INTO - 向数据库中插入新数据
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引

SELECT语句

SELECT column_name(s) FROM table_name

WHERE子句

SELECT [*] FROM [TableName] WHERE [condition1]

SELECT语句与WHERE和/或子句

SELECT [*] FROM [TableName] WHERE [condition1] [AND [OR]] [condition2]...

WHERE子句中可以使用以下运算符:

运算符描述
=等于
<>不等于。 注意:在某些版本的SQL中,这个操作符可能写成!=
>大于
<小于
>=大于等于
<=小于等于
BETWEEN在某个范围内
LIKE搜索某种模式
IN为列指定多个可能的值

ORDER BY 子句

 ORDER BY 关键字默认情况下按升序排序(ASC)记录。如果需要按降序对记录进行排序,可以使用DESC关键字。

SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC;

可以在ORDER BY子句中使用多个列,但要确保用于对该列进行排序的列应该在列表中。

以下SQL语句从"Customers" 表中选择所有客户,按 "Country" 升序排列,并按 "CustomerName" 列降序排列:

SELECT * FROM Customers
ORDER BY Country ASC, CustomerName DESC;

DISTINCT(去重)子句

SQL DISTINCT 关键字,与 SELECT 语句一起使用可以时,可以达到消除所有重复记录,只返回唯一记录的目的。

SELECT 查询中使用 DISTINCT 关键字,对重复的SALARY金额达到去除重复的目的:

SQL> SELECT DISTINCT SALARY FROM CUSTOMERS
     ORDER BY SALARY;
SELECT DISTINCT column1, column2....columnN
FROM   table_name;
​
// 以下SQL语句仅从"Customers" 表中的 "Country" 列中选择DISTINCT值: 
SELECT DISTINCT Country FROM Customers; 
// 以下SQL语句列出了不同(distinct)客户国家的数量: 
SELECT COUNT(DISTINCT Country) FROM Customers; 

SELECT IN子句

 IN 运算符允许在 WHERE 子句中指定多个值。IN 运算符是多个 OR 条件的简写。

SELECT column1, column2....columnN
FROM   table_name
WHERE  column_name IN (val-1, val-2,...val-N);

或者

SELECT column_name(s)
FROM table_name
WHERE column_name IN (SELECT STATEMENT);

IN 操作符实例

 以下 SQL 语句选取位于“Germany”,“France”和“UK”的所有客户:

SELECT * FROM Customers
WHERE Country IN ('Germany', 'France', 'UK');

 以下 SQL 语句选取不在“Germany”,“France”或“UK”中的所有客户:

SELECT * FROM Customers
WHERE Country NOT IN ('Germany', 'France', 'UK');

 以下 SQL 语句选取来自同一国家的所有客户作为供应商:

SELECT * FROM Customers
WHERE Country IN (SELECT Country FROM Suppliers);

SELECT LIKE (类)子句

SELECT column1, column2....columnN
FROM   table_name
WHERE  column_name LIKE { PATTERN };

SELECT COUNT(计数)子句

SELECT COUNT(column_name)
FROM   table_name
WHERE  CONDITION;

SELECT与HAVING子句

SELECT SUM(column_name)
FROM   table_name
WHERE  CONDITION
GROUP BY column_name
HAVING (arithematic function condition); // 进一步算术信息

INSERT INTO语句

INSERT INTO 语句可以用两种形式编写。  第一个表单没有指定要插入数据的列的名称,只提供要插入的值,即可添加一行新的数据:

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);

 第二种,如果要为表中的所有列添加值,则不需要在SQL查询中指定列名称。但是,请确保值的顺序与表中的列顺序相同。INSERT INTO语法如下所示:

INSERT INTO table_name
VALUES (value1, value2, value3, ...);

使用另一个表填充一个表:可以通过另一个表上的SELECT语句查询出来的字段值,然后将数据填充到本表中,条件是另一个表所查询的字段与本表要插入数据的字段是一一对应的。

INSERT INTO first_table_name [(column1, column2, ... columnN)] 
SELECT column1, column2, ...columnN 
FROM second_table_name
[WHERE condition];

UPDATE SET语句

UPDATE table_name
SET column=value, column1=value1,...
WHERE someColumn=someValue

要注意SQL UPDATE 语句中的 WHERE 子句,WHERE子句指定哪些记录需要更新。如果省略WHERE子句,所有记录都将更新。

以下SQL语句为第一个客户(CustomerID = 1)更新了“ContactName”和“City”:

UPDATE Customers                
SET ContactName = 'Alfred Schmidt', City= 'Frankfurt'                
WHERE CustomerID = 1;       

更新多个记录:WHERE子句决定了将要更新的记录数量。以下SQL语句将把国家/地区为"Mexico"的所有记录的联系人姓名更新为“Juan”:

UPDATE Customers
SET ContactName='Juan'
WHERE Country='Mexico';

DELETE语句

DELETE FROM tableName
WHERE someColumn = someValue

注意SQL DELETE 语句中的 WHERE 子句,WHERE子句指定需要删除哪些记录。如果省略了WHERE子句,表中所有记录都将被删除!

删除所有数据,可以删除表中的所有行,而不需要删除该表。这意味着表的结构、属性和索引将保持不变:

DELETE FROM table_name;

 或者

DELETE * FROM table_name;

CREATE 语句

CREATE TABLE table_name(
column1 datatype,
column2 datatype,
column3 datatype,
.....
columnN datatype,
PRIMARY KEY( one or more columns )
);

DROP 语句

DROP TABLE table_name;

CREATE INDEX语句

CREATE UNIQUE INDEX index_name
ON table_name ( column1, column2,...columnN);

DROP INDEX语句

ALTER TABLE table_name
DROP INDEX index_name;

DESC语句

DESC table_name;

TRUNCATE 截断表语句

TRUNCATE TABLE 命令用于删除现有数据表中的所有数据。

 可以使用 DROP TABLE 命令来删除整个数据表,不过 DROP TABLE 命令不但会删除表中所有数据,还会将整个表结构从数据库中移除。如果想要重新向表中存储数据的话,必须重建该数据表。

TRUNCATE TABLE table_name;

ALTER TABLE语句

ALTER TABLE table_name {ADD|DROP|MODIFY} column_name {data_ype};

ALTER TABLE语句(对表名重命名)

ALTER TABLE table_name RENAME TO new_table_name;

USE语句

USE database_name;

当SQL Schema中有多个数据库时,在开始操作之前,需要选择一个执行所有操作的数据库。

 SQL USE语句用于选择SQL架构中的任何现有数据库。

 USE语句的基本语法如下所示 :

USE DatabaseName;

 数据库名称在RDBMS中必须是唯一的。

COMMIT语句

COMMIT;

ROLLBACK语句

ROLLBACK;

AND语法

SELECT column1, column2, ...
FROM table_name
WHERE condition1 AND condition2 AND condition3 ...;

OR语法

SELECT column1, column2, ...
FROM table_name
WHERE condition1 OR condition2 OR condition3 ...;

NOT语法

SELECT column1, column2, ...
FROM table_name
WHERE NOT condition;

AND & OR

SELECT * FROM Customers
WHERE Country='Germany'
AND (City='Berlin' OR City='München');

AND结合OR、NOT

以下SQL语句选择国家是“德国”的“客户”的所有字段,城市必须是“柏林”或“慕尼黑”(用括号形成复杂表达式):

SELECT * FROM Customers
WHERE Country='Germany' AND (City='Berlin' OR City='München');

 以下SQL语句选择来自"Customers" 的国家不是 "Germany" 且不是 "USA"的所有字段:

SELECT * FROM Customers
WHERE NOT Country='Germany' AND NOT Country='USA';

NULL

 SQL 中,NULL 用于表示缺失的值。数据表中的 NULL 值表示该值所处的字段为空。

 具有NULL值的字段是没有值的字段。

 如果表中的字段是可选的,则可以插入新记录或更新记录而不向该字段添加值。然后,该字段将被保存为NULL值。

 值为 NULL 的字段没有值。尤其要明白的是,NULL 值与 0 或者包含空白(spaces)的字段是不同的。

使用比较运算符(例如=,<或<>)来测试NULL值是不可行的。不得不使用IS NULL和IS NOT NULL运算符。

IS NULL语法

SELECT column_names
FROM table_name
WHERE column_name IS NULL;

选择 "Address" 列中有 NULL 值的记录,使用 IS NULL 操作符:

 我们必须使用 IS NULL 操作符:

SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL

IS NOT NULL语法

SELECT column_names
FROM table_name
WHERE column_name IS NOT NULL;

创建表的时候,NULL 的基本语法如下:

SQL> CREATE TABLE CUSTOMERS(
   ID   INT              NOT NULL,
   NAME VARCHAR (20)     NOT NULL,
   AGE  INT              NOT NULL,
   ADDRESS  CHAR (25) ,
   SALARY   DECIMAL (18, 2),       
   PRIMARY KEY (ID)
);

 这里,NOT NULL表示对于给定列,必须按照其数据类型明确赋值。有两列并没有使用 NOT NULL 来限定,也就是说这些列可以为 NULL。值为 NULL 的字段是在记录创建的过程中留空的字段。

选择 "Address" 列中没有 NULL 值的记录,使用 IS NOT NULL 操作符:

 我们必须使用 IS NOT NULL 操作符:

SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL

四、SQL运算符

1、SQL 运算符

运算符是保留字或主要用于 SQL 语句的 WHERE 子句中的字符,用于执行操作,例如:比较和算术运算。 这些运算符用于指定 SQL 语句中的条件,并用作语句中多个条件的连词。

常见运算符有以下几种:

算术运算符
比较运算符
逻辑运算符
否定条件运算符

2、SQL 算术运算符

假设变量 a 的值是:10,变量 b 的值是:20,以下为各运算符执行结果:

运算符描述例子
+加法,执行加法运算。a + b 得到 30
-减法,执行减法运算。a - b 得到 -10
*乘法,执行乘法运算。a * b 得到 200
/用左操作数除以右操作数。b / a 得到 2
%用左操作数除以右操作数并返回余数。b % a 得到 0

3、SQL 逻辑运算符

这是在 SQL 所有的逻辑运算符的列表。

运算符描述
ALLALL运算符用于将值与另一个值集中的所有值进行比较。
ANDAND运算符允许在SQL语句的WHERE子句中指定多个条件。
ANYANY运算符用于根据条件将值与列表中的任何适用值进行比较。
BETWEENBETWEEN运算符用于搜索在给定最小值和最大值内的值。
EXISTSEXISTS运算符用于搜索指定表中是否存在满足特定条件的行。
ININ运算符用于将值与已指定的文字值列表进行比较。
LIKELIKE运算符用于使用通配符运算符将值与类似值进行比较。
NOTNOT运算符反转使用它的逻辑运算符的含义。 例如:NOT EXISTS, NOT BETWEEN, NOT IN等等,这是一个否定运算符。
OROR运算符用于组合SQL语句的WHERE子句中的多个条件。
IS NULLIS NULL运算符用于将值与NULL值进行比较。
UNIQUEUNIQUE运算符搜索指定表的每一行的唯一性(无重复项)。

五、SQL表达式

1、SQL 表达式

表达式是计算值的一个或多个值、运算符和SQL函数的组合。这些SQL表达式类似于公式,它们是用查询语言编写的。可以使用它们查询数据库中的特定数据集。

2、句法

考虑SELECT语句的基本语法,如下所示:

SELECT column1, column2, columnN 
FROM table_name 
WHERE [CONDITION|EXPRESSION];

 有不同类型的sql表达式,如下所示:

  • 布尔型

  • 数值型

  • 日期

3、布尔表达式

SQL布尔表达式基于匹配单个值获取数据。

SELECT column1, column2, columnN 
FROM table_name 
WHERE SINGLE VALUE MATCHING EXPRESSION;

 使用具有以下记录的Customers表:

SQL> SELECT * FROM CUSTOMERS;
+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+
7 rows in set (0.00 sec)

 下表是一个简单的示例,展示了各种sql布尔表达式的用法。

SQL> SELECT * FROM CUSTOMERS WHERE SALARY = 10000;
+----+-------+-----+---------+----------+
| ID | NAME  | AGE | ADDRESS | SALARY   |
+----+-------+-----+---------+----------+
|  7 | Muffy |  24 | Indore  | 10000.00 |
+----+-------+-----+---------+----------+
1 row in set (0.00 sec)

4、数值表达式

数值表达式用于在任何查询中执行任何数学运算。

SELECT numerical_expression as  OPERATION_NAME
[FROM table_name
WHERE CONDITION] ;

 这里,数值表达式用于数学表达式或任何公式。下面是一个简单的示例,展示了SQLNDigitic表达式的用法:

SQL> SELECT (15 + 6) AS ADDITION
+----------+
| ADDITION |
+----------+
|       21 |
+----------+
1 row in set (0.00 sec)

 有几个内置函数,如avg()、sum()、count()等,用于对表或特定表列执行所谓的聚合数据计算。

SQL> SELECT COUNT(*) AS "RECORDS" FROM CUSTOMERS; 
+---------+
| RECORDS |
+---------+
|       7 |
+---------+
1 row in set (0.00 sec)

5、日期表达式

日期表达式返回当前系统日期和时间值:

SQL>  SELECT CURRENT_TIMESTAMP;
+---------------------+
| Current_Timestamp   |
+---------------------+
| 2022-11-27 07:19:57 |
+---------------------+
1 row in set (0.00 sec)

 另一个日期表达式如下所示:

SQL>  SELECT  GETDATE();
+-------------------------+
| GETDATE                 |
+-------------------------+
| 2022-11-27 07:21:47.300 |
+-------------------------+
1 row in set (0.00 sec)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值