1 SQL 数据库和SQL
1 数据库和SQL
1-1 数据库是什么
将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合称为数据库(Database, DB)。
法则 |
|
用来管理数据库的计算机系统称为数据库管理系统(Database Management System, DBMS)。
为什么DBMS那么重要?文本文档和Excel工作表等与DBMS比较
无法多人共享数据;
无法提供操作大量数据所需的格式;
实现读写自动化需要编程技术能力;
无法应对突发事故;
DBMS可以克服这些不足,能够实现多个用户同时安全简单地操作大量数据(无需高超的编程技术就可以操作数据库)。这也是我们一定要使用DBMS的原因。
DBMS种类(数据的保存格式即数据库种类)
- 层次型数据库(Hierarchi Database, HDB)
最古老的数据库之一,它把数据通过层次结构(树形结构)的方式表现出来。(现在很少使用)
- 关系型数据库(Relational Database, RDB)
也称为关系数据库,是现在应用最广泛的数据库。关系型数据库1969年诞生,可谓历史悠久。和Excel工作表一样,它也采用行列二维表结构来管理数据,所以简单易懂。同时,它还使用专门的SQL(Structured Query Language, 结构化查询语言)语言对数据库进行操作。
这种类型的DBMS称为关系数据库管理系统(Relational Database Management System, RDBMS)。比较具有代表性的RDBMS有如下五种:
l Oracle Database : 甲骨文公司的RDBMS
l SQL Server : 微软公司的RDBMS
l DB2 : IBM公司的RDBMS
l PostgreSQL : 开源的RDBMS
l MySQL : 开源的RDBMS
- 面向对象数据库(Object Oriented Database, OODB)
编程语言当中有一种被称为面向对象的语言。该类数据库把数据以及对数据的操作集合起来以对象为单位进行管理,因此得名。面向对象数据库就是用来保存这些对象的数据库。
- XML数据库(XML Database, XMLDB)
最近几年,XML作为在网络上进行数据交互传输的形式逐渐普及起来。XML数据库可以对XML形式的大量数据进行高速处理。
- 键值存储系统(Key-Value Store, KVS)
这是一种单纯用来保存查询所使用的主键(Key)和值(Value)的数据库。具有编程语言经验的读者可以把它想象成关联数组或者是散列(hash)。
1-2 数据库的结构
使用RDBMS时,最常见的系统结构就是客户端/服务器(C/S类型)这种类型。
根据SQL语句的内容返回的数据,同样必须是二维表的形式,这也是关系数据库的特征之一。
表的列(垂直的方向)称为字段,它代表了保存在表中的数据项目。
表的行(水平的方向)称为记录,它相当于一条数据。
关系数据库必须以行为单位进行数据读写。
法则1-1 |
关系数据库以行为单位读写数据。 |
此处将行和列交汇的方格称为单元格,在一个单元格中自能输入一个数据。
法则1-2 |
一个单元格中只能输入一个数据。 |
1-3 SQL概要
国际标准化组织(ISO)为SQL制定了相应的标准,以此为基础的SQL称为标准SQL(相关信息请参考专栏—标准的SQL和特定的SQL)。
法则1-3 |
学会标准的SQL就可以在各种RDBMS中书写SQL语句了。 |
SQL用关键字、表名、列名等组合而成的一条语句(SQL语句)来描述操作的内容。
根据对RDBMS赋予的指令种类的不同,SQL语句可以分为以下三类:
- DDL(Data Definition Language, 数据定义语言)
用来创建或者删除存储数据用的数据库以及数据库中的表等对象。
CREATE : 创建数据库和表等对象
DROP : 删除数据库和表等对象
ALTER : 修改数据库和表等对象的结构
- DML(Data Manipulation Language, 数据操作语言)
用来查询或者变更表中的记录。
SELECT : 查询表中的数据
INSERT : 向表中插入新数据
UPDATE : 变更表中的数据
DELETE : 删除表中的数据
- DCL(Data Control Language, 数据控制语言)
用来确认或者取消对数据库中的数据进行的变更。除此之外,还可以对RDBMS的用户是否有权限操作数据库中的对象(数据库表等)进行设定。
COMMIT : 确认对数据库中的数据进行的变更
ROLLBACK : 取消对数据库中的数据进行的变更
GRANT : 赋予用户操作权限
REVOKE : 取消用户的操作权限
法则1-4 |
SQL根据功能不同可以分为三类,其中使用最多的是DML。 |
一条SQL语句可以描述一个数据库操作。在RDBMS当中,SQL语句也是逐一执行的。
法则1-5 |
SQL语句以分号(;)结尾。 |
法则1-6 |
关键字不区分大小写。 |
SQL语句常常需要直接书写字符串、日期或者数字。
在SQL语句中直接书写的字符串、日期(年-月-日、年月/日、‘26 Jan 2010’、‘10/01/26’、‘2010-01-26’)或者数字等称为常数。
法则1-7 |
字符串和日期常数需要使用单引号(’)括起来。 数字常数无需加注单引号(直接书写数字即可)。 |
SQL语句的单词之间需要使用半角空格或换行符来进行分隔。
法则1-8 |
单词之间需要使用半角空格或者换行进行分隔。 |
1-4 表的创建
数据库的创建 |
-- CREATE DATABASE <数据库名称>; CREATE DATABASE shop; |
表的创建 |
/** CREATE TABLE <表名> ( <列名1> <数据类型> <该列所需要的约束>, <列名2> <数据类型> <该列所需要的约束>, <该表的约束1>, <该表的约束2>, ......); */
CREATE TABLE `shohin` ( `shohin_id` char(4) NOT NULL, `shohin_mei` varchar(100) NOT NULL, `shohin_bunrui` varchar(32) NOT NULL, `hanbai_tanka` int(11) DEFAULT NULL, `shiire_tanka` int(11) DEFAULT NULL, `torokubi` date DEFAULT NULL, PRIMARY KEY (`shohin_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
我们只能使用半角英文字母、数字、下划线(_)作为数据库、表、和列的名称。
法则1-9 |
数据库名称、表名和列名等可以使用以下三种字符。 半角英文字母、半角数字、下划线(_) |
法则1-10 |
名称必须以半角英文字母作为开头。 |
在同一个数据库中不能创建两个相同名称的表,在同一个表中也不能创建两个名称相同的列。
法则1-11 |
名称不能重复。 |
数据类型表示数据的种类,包括数字型、字符型和日期型等。每一列都不能存储与该列数据类型不符的数据。数据库中每一列都不能存储与该列数据类型不符的数据。
INTEGER : 用来指定存储整数的列的数据类型(数字型),不能存储小数。
CHAR : CHAR是CHARACTER(字符)的简称,是用来指定存储字符串的列的数据类型(字符型)。
字符串以定长字符串的形式存储在被指定为CHAR型的列中。所谓定长字符串,就是单列中存储的字符串长度达不到最大长度的时候,使用半角空格进行补充。例如:CHAR(8)类型中输入’abc’的时候,会以‘abc ‘多出五个空格存储起来。
VARCHAR : 同CHAR类型一样,VAHRCHAR型也是用来指定存储字符串的列的数据类型(字符串类型)。也可以通过括号内的数字来指定字符串的长度(最大长度).但该类型的列是以可变长字符串的形式来保存字符串的。即不会补充空格存储。定长字符串在字符数未达到最大长度时会用半角空格补充,但是可变长字符串不同,即使字符数未达到最大长度,也不会用半角空格补充。
DATE: 用来指定存储日期(年月日)的列的数据类型(日期型)。
约束是除了数据类型之外,对列中存储的数据进行限制或者追加条件的功能。
数据类型的右侧设定了NOT NULL的约束。
主键的约束。
所谓的键值,就是在指定特定数据是使用的列的组合。键值种类多样,主键(primary key)就是可以特定一行数据的列。
1-5 表的删除和更新
表的删除 |
-- DROP TABLE <表名>; DROP TABLE shohin; |
法则1-12 |
删除了的表是无法恢复的。 在执行DROP TABLE 语句之前请务必仔细确认。 |
表定义的更新 |
-- ALTER TABLE <表名> ADD COLUMN <列的定义>; ALTER TABLE shohin ADD COLUMN shohin_mei_kana VARCHAR(100);
-- ALTER TABLE <表名> DROP COLUMN <列名>; ALTER TABLE shohin DROP COLUMN shohin_mei_kana; |
法则1-13 |
表定义变更(alter table)之后数据无法恢复,慎重使用 |
表中插入数据 |
-- DML :插入数据 START TRANSACTION; INSERT INTO shohin VALUES ('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20'); INSERT INTO shohin VALUES ('0002', '打孔器', '办公用品', 500, 300, '2009-09-11'); INSERT INTO shohin VALUES ('0003', '运动T恤', '衣服', 4000, 2800, NULL); INSERT INTO shohin VALUES ('0004', '菜刀', '厨房用具', 3000, 2800, '2009-09-20'); INSERT INTO shohin VALUES ('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15'); INSERT INTO shohin VALUES ('0006', '叉子', '厨房用具', 500, NULL, '2009-09-20'); INSERT INTO shohin VALUES ('0007', '擦菜饭', '厨房用具', 880, 790, '2008-04-28'); INSERT INTO shohin VALUES ('0008', '圆珠笔', '办公用品', 100, NULL, '2009-11-11'); COMMIT; |
表名变更 |
-- 变更表名 将A更名为B; 仅用于MySQL RENAME TABLE A TO B; |