SQL基础语法

SQL基础语法

SQL学习入门之SQL语法



前言

SQL是Structured Query Language的缩写,意思是结构化查询语言,是一种在数据库管理系统(Relational Database Management System, RDBMS)中查询数据,或通过RDBMS对数据库中的数据进行更改的语言。


SQL是什么?

SQL是为操作数据库而开发的语言。它原本是为了提高数据库查询效率而开发的语言,但是现在不仅可以进行数据查询,就连数据的插入和删除等操作也基本上都可以通过SQL 来完成了。

1、 SQL 语句及其种类

SQL 用关键字、表名、列名等组合而成的一条语句(SQL 语句)来描述操作的内容。关键字是指含义或使用方法已事先定义好的英语单词,存在包含“对表进行查询”或者“参考这个表”等各种意义的关键字。
根据对RDBMS 赋予的指令种类的不同,SQL 语句可以分为以下三类。

  • DDL
    DDL(Data Definition Language,数据定义语言) 用来创建或者删除存储数据用的数据库以及数据库中的表等对象。DDL 包含以下几种指令。

  • CREATE: 创建数据库和表等对象

  • DROP: 删除数据库和表等对象

  • ALTER: 修改数据库和表等对象的结构

  • DML
    DML(Data Manipulation Language,数据操纵语言) 用来查询或者变更表中的记录。DML 包含以下几种指令。

  • SELECT:查询表中的数据

  • INSERT:向表中插入新数据

  • UPDATE:更新表中的数据

  • DELETE:删除表中的数据

  • DCL
    DCL(Data Control Language,数据控制语言)用来确认或者取消对数据库中的数据进行的变更。除此之外,还可以对RDBMS 的用户是否有权限操作数据库中的对象(数据库表等)进行设定。DCL 包含以下几种指令。

  • COMMIT: 确认对数据库中的数据进行的变更

  • ROLLBACK: 取消对数据库中的数据进行的变更

  • GRANT: 赋予用户操作权限

  • REVOKE: 取消用户的操作权限

SQL 根据功能不同可以分为三类,其中使用最多的是DML。

2、SQL 的基本书写规则

书写SQL 语句时必须要遵守一些规则。接下来简单介绍SQL 的一些基本书写规则。

(1) SQL 语句要以分号(;)结尾

一条SQL 语句可以描述一个数据库操作。在RDBMS 当中,SQL 语句也是逐条执行的。
SQL 语句则使用分号(;)结尾。

(2)结尾 SQL 语句不区分大小写

SQL 不区分关键字的大小写 。例如,不管写成SELECT 还是select,解释都是一样的。表名和列名也是如此。

虽然可以根据个人喜好选择大写还是小写(或大小写混杂),但为了理解起来更加容易,可以用以下规则来书写SQL 语句。

  • 关键字大写
  • 表名的首字母大写
  • 其余(列名等)小写

但是插入到表中的数据是区分大小写的。例如,在操作过程中,数据 Computer、COMPUTER 或 computer,三者是不一样的。

(3)常数的书写方式是固定的

SQL 语句常常需要直接书写字符串、日期或者数字。例如,书写向表中插入字符串、日期或者数字等数据的SQL 语句。

在SQL 语句中直接书写的字符串、日期或者数字等称为常数。常数的书写方式如下所示。

SQL 语句中含有字符串的时候,需要像’abc’这样,使用单引号(')将字符串括起来,用来标识这是一个字符串。

SQL 语句中含有日期的时候,同样需要使用单引号将其括起来。日期的格式有很多种(‘26 Jan 2010’ 或者’10/01/26’ 等),也可以使用’2010-01-26’ 这种’ 年-月-日’ 的格式。

在SQL 语句中书写数字的时候,不需要使用任何符号标识,直接写成 1000 这样的数字即可。

(4)单词需要用半角空格或者换行来分隔

SQL 语句的单词之间需使用半角空格或换行符来进行分隔。如下这种未加分隔的语句会发生错误,无法正常执行。

  1. ○ CREATE TABLE Product
  2. × CREATETABLE Product
  3. × CREATE TABLEProduct

但是不能使用全角空格作为单词的分隔符,否则会发生错误,出现无法预期的结果。

3、创建数据表

在学习针对表的查询,以及数据变更等SQL 语句之前,要先创建学习这些SQL 语句所需的数据库和表(PostgreSQL)。

(1) 数据库的创建(CREATE DATABASE语句)

前面提到,在创建表之前,一定要先创建用来存储表的数据库。运行CREATE DATABASE 语句就可以在RDBMS 上创建数据库了。CREATEDATABASE 语句的语法如下所示。

这里仅指定了使用该语法所需的最少命令,实际开发数据库时还需要指定各种其他命令。

语法1-1 创建数据库的CREATE DATABASE语句

CREATE DATABASE <数据库名称>;

这里将数据库命名为shop,然后执行代码1-1 中的SQL语句。

代码1-1 创建数据库shop的CREATE DATABASE语句

CREATE DATABASE shop;

数据库名称、表名以及列名都要使用半角字符(英文字母、数字、符号)。

(2) 表的创建(CREATE TABLE语句)

创建好数据库之后,利用 CREATE TABLE 语句在其中创建表。CREATE TABLE 语句的语法如下所示

语法1-2 创建表的CREATE TABLE语句

CREATE TABLE <表名><列名1> <数据类型> <该列所需约束><列名2> <数据类型> <该列所需约束><列名3> <数据类型> <该列所需约束><列名4> <数据类型> <该列所需约束>.
.
.
<该表的约束1><该表的约束2>,……);

该语法清楚地描述了要创建一个包含< 列名1>、< 列名2>、 ……的名称为< 表名> 的表。每一列的数据类型(后述)是必须要指定的,还要为需要的列设置约束(后述)。约束可以在定义列的时候进行设置,也可以在语句的末尾进行设置。

在数据库中创建表1-2 中的商品表(Product 表)的CREATE TABLE 语句,如代码1-2 所示。

代码1-2 创建Product表的CREATE TABLE语句

CREATE TABLE Product
(product_id CHAR(4) NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,
sale_price INTEGER ,
purchase_price INTEGER ,
regist_date DATE ,
PRIMARY KEY (product_id));

(3) 命名规则

一般用半角英文字母、数字、下划线(_)作为数据库、表和列的名称 。例如,不能将product_id 写成product-id,因为标准SQL 并不允许使用连字符作为列名等名称。$、#、? 这样的符号同样不能作为名称使用。
名称必须以半角英文字母开头 。以符号开头的名称并不多见,但有时会碰到类似 1product 或者 2009_sales 这样以数字开头的名称。虽然可以理解,但在标准SQL 中是被禁止的。用 product1 或者 sales_2009 这样的名称才符合规则。
最后,在同一个数据库中不能创建两个相同名称的表,在同一个表中也不能创建两个名称相同的列。如果出现这样的情况,RDBMS 会返回错误信息。

(4) 数据类型的指定

Product 表所包含的列,定义在 CREATE TABLE Product( ) 的括号中。列名右边的 INTEGER 或者 CHAR 等关键字,是用来声明该列的数据类型的,所有的列都必须指定数据类型。

数据类型表示数据的种类,包括数字型、字符型和日期型等。每一列都不能存储与该列数据类型不符的数据。声明为整数型的列中不能存储’abc’ 这样的字符串,声明为字符型的列中也不能存储1234 这样的数字。

数据类型的种类很多,各个 RDBMS 之间也存在很大差异。根据业务需要实际创建数据库时,一定要根据不同的 RDBMS 选用最恰当的数据类型。在学习 SQL 的时候,使用最基本的数据类型就足够了。下面介绍四种基本的数据类型。

  • INTEGER型
    用来指定存储整数的列的数据类型(数字型),不能存储小数。

  • CHAR型
    CHAR 是CHARACTER(字符)的缩写,是用来指定存储字符串的列的数据类型(字符型)。可以像CHAR(10) 或者CHAR(200) 这样,在括号中指定该列可以存储的字符串的长度(最大长度)。字符串超出最大长度的部分是无法输入到该列中的。RDBMS 不同,长度单位也不一样,既存在使用字符个数的情况,也存在使用字节长度的情况。
    字节是计算机内部的数据单位。一个字符通常需要1到3个字节来表示(根据字符的种类和表现方式有所不同)。
    字符串以定长字符串的形式存储在被指定为 CHAR 型的列中。所谓定长字符串,就是当列中存储的字符串长度达不到最大长度的时候,使用半角空格进行补足。例如,向 CHAR(8) 类型的列中输入’abc’的时候,会以 'abc '(abc 后面有5 个半角空格)的形式保存起来。
    此外,虽然 SQL 不区分英文字母的大小写,但是表中存储的字符串却是区分大小写的。也就是说,‘ABC’ 和 ‘abc’ 代表了两个不同意义的字符串。

  • VARCHAR型
    同 CHAR 类型一样,VARCHAR 型也是用来指定存储字符串的列的数据类型(字符串类型),也可以通过括号内的数字来指定字符串的长度(最大长度)。但该类型的列是以 可变长字符串 的形式来保存字符串的。定长字符串在字符数未达到最大长度时会用半角空格补足,但可变长字符串不同,即使字符数未达到最大长度,也不会用半角空格补足。例如,我们向 VARCHAR(8)类型的列中输入字符串 ‘abc’ 的时候,保存的就是字符串 ‘abc’。
    该类型的列中存储的字符串也和 CHAR 类型一样,是区分大小写的。
    特定的 SQLOracle 中使用 VARCHAR2 型(Oracle中也有 VARCHAR 这种数据类型,但并不推荐使用)。

  • DATE型
    用来指定存储日期(年月日)的列的数据类型(日期型)。
    特定的 SQL 除了年月日之外,Oracle 中使用的DATE型还包含时分秒。

(5) 约束的设置

约束是除了数据类型之外,对列中存储的数据进行限制或者追加条件的功能。Product 表中设置了两种约束。

Product 表的product_id 列、product_name 列和product_type 列的定义如下所示

product_id CHAR(4) NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,

数据类型的右侧设置了 NOT NULL 约束。NULL 是代表空白(无记录)的关键字。在 NULL 之前加上了表示否定的 NOT,就是给该列设置了不能输入空白,也就是必须输入数据的约束(如果什么都不输入就会出错)。

NULL 这个词是无或空的意思,NULL 是使用 SQL 时的常见关键字。这样一来,Product 表的product_id(商品编号)列、product_name(商品名称)列和 product_type(商品种类)列就都成了必须输入的项目。

另外,在创建 Product 表的 CREATE TABLE 语句的后面,还有下面这样的记述。

(6) PRIMARY KEY (product_id)

这是用来给 product_id 列设置主键约束的。所谓键,就是在指定特定数据时使用的列的组合。键种类多样,主键 (primary key) 就是可以特定一行数据的列 B。也就是说,如果把 product_id 列指定为主键,就可以通过该列取出特定的商品数据了。

反之,如果向 product_id 列中输入了重复数据,就无法取出唯一的特定数据了(因为无法确定唯一的一行数据)。这样就可以为某一列设置主键约束了。

(7) 表的删除(DROP TABLE语句)

此前介绍的都是关于 Product 表的内容的创建,接下来介绍一下删除表的方法。删除表的 SQL 语句 只需要一行 DROP TABLE 语句即可。

语法1-3 删除表时使用的DROP TABLE语句

DROP TABLE <表名>

如果想要删除 Product 表,参考代码1-3 的 SQL命令。

代码1-3 删除Product表

DROP TABLE Product;

DROP 在英语中是“丢掉”“舍弃”的意思。需要特别注意的是,删除的表是无法恢复的。即使是被误删的表,也无法恢复,只能重新创建,然后重新插入数据。

其实很多 RDBMS 都预留了恢复的功能,但还是要认为是无法恢复的。如果不小心删除了重要的业务表,特别是存储了大量数据的表,恢复起来费时费力,请务必注意!

(8) 表定义的更新(ALTER TABLE语句)

如果把表创建出来之后才发现少了几列,无需把表删除再重新创建,只需利用变更表定义的 ALTER TABLE 语句就可以了。ALTER 在英语中就是“改变”的意思。接下来介绍该语句通常的使用方法。

首先是添加列时使用的语法。

语法1-4 添加列的ALTER TABLE语句

ALTER TABLE <表名> ADD COLUMN <列的定义>

特定的 SQLOracle 和 SQL Server 中不用写 COLUMN。

ALTER TABLE <表名> ADD <列名>

另外,在 Oracle 中同时添加多列的时候,可以像下面这样使用括号。

ALTER TABLE <表名> ADD (<列名><列名>,……);

例如,利用代码1-4 中的语句在 Product 表中添加这样一列,product_name_pinyin(商品名称(拼音)),该列可以存储 100 位的可变长字符串。

代码1-4 添加一列可以存储100位的可变长字符串的product_name_pinyin列

DB2 PostgreSQL MySQL
ALTER TABLE Product ADD COLUMN product_name_pinyin VARCHAR(100);
Oracle
ALTER TABLE Product ADD (product_name_pinyin VARCHAR2(100));
SQL Server
ALTER TABLE Product ADD product_name_pinyin VARCHAR(100);

反之,删除表中某列使用的语法如下所示。

语法1-5 删除列的ALTER TABLE语句

ALTER TABLE <表名> DROP COLUMN <列名>

特定的 SQLOracle 中不用写 COLUMN。

ALTER TABLE <表名> DROP <列名>

另外,在 Oracle 中同时删除多列的时候,可以像下面这样使用括号来实现。

ALTER TABLE <表名> DROP (<列名><列名>,……);

例如,可以使用代码1-5 中的语句来删除之前添加的 product_name_pinyin 列。

代码1-5 删除product_name_pinyin列

SQL Server DB2 PostgreSQL MySQL
ALTER TABLE Product DROP COLUMN product_name_pinyin;
Oracle
ALTER TABLE Product DROP (product_name_pinyin);

ALTER TABLE 语句和 DROP TABLE 语句一样,执行之后无法恢复。误添的列可以通过 ALTER TABLE 语句删除,或者将表全部删除之后重新再创建。

(9) 向Product表中插入数据

在 Product 表中插入数据的 SQL 语句如代码1-6 所示。

代码1-6 向Product表中插入数据的SQL语句

SQL Server PostgreSQL
-- DML :插入数据
BEGIN TRANSACTION;—————————①
INSERT INTO Product VALUES ('0001', 'T恤衫', '衣服',1000, 500, '2009-09-20');
INSERT INTO Product VALUES ('0002', '打孔器', '办公用品',500, 320, '2009-09-11');
INSERT INTO Product VALUES ('0003', '运动T恤', '衣服',4000, 2800, NULL);
INSERT INTO Product VALUES ('0004', '菜刀', '厨房用具',3000, 2800, '2009-09-20');
INSERT INTO Product VALUES ('0005', '高压锅', '厨房用具',6800, 5000, '2009-01-15');
INSERT INTO Product VALUES ('0006', '叉子', '厨房用具',500, NULL, '2009-09-20');
INSERT INTO Product VALUES ('0007', '擦菜板', '厨房用具',880, 790, '2008-04-28');
INSERT INTO Product VALUES ('0008', '圆珠笔', '办公用品',100, NULL,'2009-11-11');
COMMIT;

特定的SQLDBMS 不同,代码1-6中的DML语句也略有不同。在MySQL 中运行时,需要把①中的 BEGIN TRANSACTION 改写成

START TRANSACTION;

在Oracle 和DB2中运行时,无需使用①中的 BEGIN TRANSACTION;(请予以删除)。

使用插入行的指令语句 INSERT,就可以把表1-2 中的数据都插入到表中了。开头的 BEGIN TRANSACTION 语句是开始插入行的指令语句,结尾的 COMMIT 语句是确定插入行的指令语句。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了SQL的基本语法规则。而《SQL基础教程》提供了大量的示例程序和详实的操作步骤说明,大家可以亲自动手解决具体的问题,切实提高自身的编程能力。

  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值