版本声明:本文为作者原创文章,转载请注明出处! http://blog.csdn.net/AndroidXiXi
本文根据《SQL基础教程第二版》(作者:[日本]MICK)的部分内容实践、整理得出,旨在对所学知识进行梳理
全面系统学习请参考原著书籍http://product.dangdang.com/25094702.html
SQL概述
书中要学习的SQL(Structured Query Language,结构化查询语言)是用来操作关系型数据库的语言,国际化标准组织(ISO)为SQL制定了相关的标准,以此为基准的SQL被称为标准SQL。虽然有时需要根据不同的RDBMS来编写特定的SQL语句,但是大同小异,学会标准的SQL语句就可以在各种RDBMS中书写SQL语句了
SQL语句及其种类
SQL语句用关键字、表名、列名等组合而成的一条语句来描述操作的内容
关键字:指那些含义或者使用方法已经事先被定义好的英语单词
根据RDBMS赋予的指令种类的不同,SQL语句可以分为:
- DDL
DDL(Data Definition Language,数据定义语言)用来创建或者删除存储数据用的数据库以及数据库中的表等对象,包含以下几种:
CREATE:创建数据库以及表等对象
DROP:删除数据库和表等对象
ALTER:修改数据库和表等对象的结构 - DML
DML(Data Manipulation Language,数据操纵语言)用来查询或者变更表中的记录,包含以下几种:
SELECT:查询表中的数据
INSERT:向表中插入新数据
UPDATE:更新表中的数据
DELETE:删除表中的数据 - DCL
DCL(Data Control Language,数据控制语言)用来确认或者取消对数据库中的数据进行的变更,还可以对RDBMS的用户是否有权限操作数据库中的对象(数据库表等)进行设定,包含以下几种:
COMMIT:确认对数据库中的数据进行的变更
ROLLBACK:取消对数据库中的数据进行的变更
GRANT:赋予用户操作权限
REVOKE:取消用户的操作权限
SQL的基本书写规则
- SQL语句要以分号(;)结尾
在RDBMS中,SQL语句是逐条执行的,一条SQL语句可以描述一个数据库操作 - SQL语句不区分大小写
SQL不区分关键字的大小写,SELECT、select都可以,但是为了区分SQL语句的其他部分,以及养成良好的代码编写习惯,可以采用以下的书写规则:
– 关键字大写
– 表名的首字母大写
– 其余部分小写
但是想要操作数据库中的数据需要区分大小写,例如字符串数据’Computer’、’COMPUTER’、’computer’三者是不一样的 - 常数的书写方式是固定的
常数:在SQL语句中直接书写的字符串、日期或者数字称为常数
字符串和日期常数需要使用单引号( ’ )括起来,如’abc’,’2017-11-21’
数字常数无须加注单引号,直接书写数字即可 - 单词需要用半角空格或者换行来分隔
SQL语句的单词之间需使用半角空格或换行符来进行分隔,但是不能使用全角空格作为单词的分隔符,否则会发生错误,请注意当前输入法的状态
接下来开始SQL语句书写的学习
环境的搭建
书中作者推荐、使用的是PostgreSQL,笔者实践使用的是MySQL,安装相关环境可以通过互联网搜索下载资源和安装方法。笔者认为,SQL的学习需要对各种情况动手实践,方能加深对SQL的理解,建议将书中的相关Demo、练习题反复实践、温习
命名规则
在书写SQL之前可以先约定相关命名规则
- 只能使用半角英文字母、数字、下划线(_)作为数据库、表、列的名称,例如标准SQL不允许使用连字符,例如列名不能写成product-id
- 名称必须以半角英文字母作为开头
- 在同一个数据库中不能创建两个相同名称的表,在同一个表中不能创建两个相同名称的列
数据库的创建(CREATE DATABASE 语句)
数据存储于数据库中,首先要进行对数据库的创建,执行CREATE DATABASE语句就可以在RDBMS上创建数据库了,如下:
-- 创建数据库的语法
CREATE DATABASE <数据库名称>;
-- 创建数据库shop
CREATE DATABASE shop;
表的创建
执行CREATE TABLE语句可以在数据库中创建表,如下:
-- 创建表的语法
-- 每一列的数据类型是必须的,有时也需要为列设置约束条件
CREATE TABLE <表名> <列名1> <数据类型> <该列所需约束>, <列名2> <数据类型> <该列所需约束>, <列名3> <数据类型> <该列所需约束>, . . . <该表的约束1>,<该表的约束2>...);
-- 创建Product表
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) );
数据类型的指定
列名右边的INTEGER、CHAR等关键字,用来声明该列的数据类型,所有的列都必须指定数据类型
数据类型表示数据的种类,包括数字型、字符型和日期型等等,每一列不能存储与该列数据类型不符的数据,常见的几种基本数据类型:
- INTEGER型
用来指定存储整数的列的数据类型(数字型),不能存储小数 - CHAR型
– CHAR是CHARACTER(字符)的缩写,是用来指定存储字符串的列的数据类型(字符类型)。括号中指定该列可以存储的字符串的最大长度,字符串超出最大长度的部分是无法输入到该列中的。
– 字符串是以定长字符串的形式存储在被指定为CHAR型的列中,当列中存储的字符串长度达不到最大长度的时候,使用半角空格进行补足。例如,想CHAR(8)的列中输入’abc’时,数据库会以’abc ‘(abc之后五个半角空格)的形式保存起来。
– 数据区分大小写 - VARCHAR型
– 和CHAR类型一样,VARCHAR型也是用来指定存储字符串的列的数据类型(字符串类型),也可以通过在括号中指定字符串的最大长度。
– 和CHAR不同的是,VARCHAR是以可变长字符串的形式来保存字符串的,当字符数未达到最大长度的时候,并不会用半角空格补足。
– 和CHAR一样,数据区分大小写 - DATE型
用来指定存储日期(年月日)的列的数据类型(日期型)
约束的设置
product_id CHAR(4) NOT NULL,
约束是除了数据类型之外,对列中存储的数据进行限制或者追加条件的功能,例如上个SQL语句示例中的“NOT NULL”,称为“NOT NULL约束”。NULL是代表空白(无记录)的关键字,在NULL之前加上了表示否定的NOT,就是给该列设置了不能输入空白,也就是必须输入数据的约束
PRIMARY KEY (product_id)
上例中“PRIMARY_KEY”用来指定主键约束
键:在指定特定数据时使用的列的组合。
主键:可以特定一行数据的列,相当于一行数据的唯一标识
表的删除(DROP TABLE语句)
可以使用DROP TABLE语句删除指定名称的表
# 删除表语法
DROP TABLE <表名>;
# 删除Product表
DROP TABLE Product;
特别注意:删除的表是无法恢复,现实中可能会引发灾难,数据无价,三思而行
表定义的更新(ALTER TABLE 语句)
表的结构是可以改变的,通过ALTER TABLE 语句变更表的定义,这样就不用删除表,重新创建,很方便
可以通过ALTER TABLE ADD为表增加一个列
#ALTER TABLE ADD 语法 ALTER TABLE <表名> ADD COLUMN <列的定义>;
#MySQL向表中添加一个列
ALTER TABLE Product ADD product_test VARCHAR(100);
ALTER TABLE Product ADD COLUMN product_test VARCHAR(100);
#MySQL添加多个列
ALTER TABLE Product ADD( product_testA INTEGER, product_testB CHAR(100), product_testC DATE );
可以用ALTER TABLE DROP删除指定列
#ALTER TABLE DROP 语法 ALTER TABLE <表名> DROP COLUMN <列名>;
#MySQL从表中删除一个列
ALTER TABLE Product DROP product_test;
ALTER TABLE Product DROP product_testA;
ALTER TABLE Product DROP product_testB;
ALTER TABLE Product DROP product_testC;
#按照上面添加多列的方式推测删除多列的方法
#但是MySQL无法运行,原因未知
#ALTER TABLE Product DROP ( # product_testA, # product_testB, # product_testC #);
注意,通过ALTER TABLE对表定义的变更后是无法恢复的
ALTER TABLE操作的对象是表的列名(字段名),如果表名穿件出现问题,就需要使用RENAME来变更表名
# MySQL语法
sp_rename 'Poduct' 'Product';
可以使用INSERT向表中插入一些数据
#向表中插入数据
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');