深入浅出SQL(2)-数据和表
该系列文章系个人读书笔记及总结性内容,任何组织和个人不得转载进行商业活动!
数据和表
理解数据库的一个典型场景就是通讯录,类似早期的电话本,每一页都按照相应的信息记录了联系人的情况,比如姓名,电话,住址等;
但如果需要管理大量的联系人信息,电话本就显得捉襟见肘了——所以,做个数据库吧;
我们需要使用数据库,但是在创建一个数据库前,我们还需要了解存储数据的类型以及把数据分类的方式;
“Greg“的电话本便签的一页信息记录了一个联系人的:
First Name:Hua;
Last Name:Qiang;
Birthday:1991-01-01;
Profession:Engineer;
Status:Single;
Location:China;
Email:aaa@qq.com;
Interests:pingpang;
Seeking:New Job;
从分类角度看数据:
将这些信息横向排列,看起来就行一个Excel;这些数据对应的就是 表table 中 列column 和 行row 应该呈现出来的信息;
什么是数据库:
首先需要知道的第一个SQL结构 其实是盛装所有表的数据库(database);
数据库是保存表和其他相关SQL结构的容器;
我们可以到数据库查询信息,这就是人称查询(query)的行为;
在流程图中,数据库都是以圆柱体表示的;
数据库剖析:
1.数据库是由表构成(还有一些其他的SQL结构),一个数据库可以有多张表;
2.表是在数据库中包含数据的结构,由列和行组成;
3.表的行 包含了表中某个对象的所有信息;
数据库内的信息组成了表;
所以构成一个数据库,我们需要:数据库名,数据库中各个表的名称,表中各个列的名称,表中各个行记录的信息;
值得注意的是:数据库和表的名称不一定要大写;
列:是存储在表中的一块数据;
行:是组成能够描述某个事物的列的集合;
表:列和行构成了表;
字段(field)也常用来代称列;
记录(record)与行也常交替使用;
一条记录包含了若干字段的值;把列和行组合起来就是你要的表;
对于之前的个人信息:每个信息种类变成类,每一张通讯录页签这是一条记录;
接下来,我们需要把上边理解的内容在数据库中进行实践;
接受命令:
首先我们需要启动我们安装的SQL关系型数据库管理系统(relational database management system,RDBMS)——我么使用MySQL;
使用前我们需要先进行安装:参考《深入浅出SQL(3)-在Mac OS X上安装MySQL》;
参照上述文章,通过终端连接MySQL;
mssql> 命令提示符之后可以输入SQL命令;
第一步:创建用来装表的数据库
1)创建一个名为grep_list的数据库;
2)使用命令:CREATE DATABASE grep_list;
3)SQL中的数据库和表的名称里不可出现空格,所以最好以下划线取代空格的方式进行命名;
4)现在需要告诉RDBMS使用刚刚创建的数据库;
5)使用命令:USE grep_list; 表示接下来我们做的每件事都是在grep_list数据库中进行的;
创建数据库:
使用数据库:
这里没有蠢问题:
1.SQL语言要求所有的表都需要放在数据库里;这样SQL能控制多位用户同时访问表的行为,能够授予或撤销对整个数据库的访问权;
2.SQL本身并不区分大小写,命令不大写也行,但命令大写是良好的SQL编程习惯;
3.每个命令的最后都有一个分号(;),用于表示命令的结束;
4.命令大写和下划线有助于编写SQL程序,虽然SQL不需要它们;
设定表:CREATE TABLE 语句
1)创建一个表来存储’甜甜圈’及其类型;
2)在命令行窗口中输入命令,之后按下enter让SQL RDBMS执行此命令;
表:甜甜圈
doughnut_list
创建表命令:
在MySQL中,为了区分命令和普通字符,MySQL引入了反引号(注意不是单引号),用在名称的两侧;
不写的话 也可以执行,但这是一个好的习惯:
我们观察下这个命令:
1)在小括号中,指明了每一列的名称及 数据类型(datatype);
2)逗号用于区分新增的列;
3)这里我们需要知道的是:VARCHAR是可变动字符的意思,用于保存以文本格式存储的信息;
4)“(6)”是指这段文字的长度最多只能有6个字符;
所以,在设计创建表的时候,我们需要确定每列的正确数据类型和长度;
我们以通讯录的表来举例看看,有关数据类型的内容:
表:通讯录
my_contacts
在创建表的时候,我们可以一次输入一行,就像上面的格式,或写成非常长的一行;
值得注意的是:last_name VARCHAR(3)和last_name VARCHAR(30)是两个完全不同的列;
画外音:如何show指定语句是否成功?
SHOW还可以用于显示更多信息:
我们继续数据类型:我们已经看到了VARCHAR和DATE类型,事实上,其他类的数据,例如数字,还需要其他的数据类型;
认识一下其他数据类型:
我们着重列出一些最有用的数据类型,他们的工作就是存储你的数据但不会破坏数据;
CHAR:character,它很严谨,负责的数据必须是预先设定好的长度;
VARCHAR:存储文本数据,最大长度可达255个字符,他很灵活,可以配合我们的数据长度进行调整;
DEC:Decimal的缩写,他会提供数值空间,直到装满为止;
DATETIME/TIMESTAMP:负责记录日期和时间;
INT:整数,并且可以处理负数;
BLOB:存储大量文本数据;
DATE:记录日期,不插手Time的事情;
我们可以查看MySQL支持的数据类型 及 具体数据类型的详细信息:
数据类型举例:
price 5678.12 DEC(6,2)
这里的两个数字表示数据库希望的浮点数格式,前者代表总位数、后者是小数点的位数;
gender F/M CHAR(1)
存储预设长度为1的字符;
这里没有蠢问题:
1.CHAR和VARCHAR只会占用特定空间爱你,不会多于256个字符;
BLOB则需要很大的空间,随着数据库的增长,占用存储空间就是冒着耗尽硬盘空间的风险;
另外,有些重要的字符串运算无法操作BLOB类型的数据,只能用于VARCHAR或CHAR;
2.为表的每列选择最合适的数据类型可以为表瘦身,还可以使数据库操作更为快捷;
3.TIMESTAMP通常用于记录“当下”这个时刻;DATETIME更适合存储将来的时间;
接下来回顾下,到目前为止我们做的:
1.在创建表前先把数据分类;
2.使用CREATE DATABASE语句来创建存储所有表的数据库;
3.使用USE database语句进入数据库,然后创建表;
4.所有表都以CREATE TABLE语句创建,句中包含列名及其数据类型;
5.一些常用的数据类型有CHAR VARCHAR BLOB INT DEC DATE DATETIME,每种数据类型的存储规则都不一样;
检查刚刚创建的表:使用DESC命令
数据库中不可以重建已经存在的表或数据库;
频繁的写SQL语句,一个好的文本编辑软件会更合适,后续我们会介绍;
我们可以将写好的语句复制并粘贴到SQL控制台,进行执行;
有创建表的操作,我们也可以删除表,而且更简单;
使用命令:DROP TABLE table;
无论表里有无数据,DROP TABLE都会执行,务必小心使用;一旦删除表,里面的数据也就烟消云散了;
DROP TABLE会删除你的表和表里面的所有数据;
删除表及表中所有数据:
删除之后 还可以重新建:
已经创建好了表,我们需要把我们的通讯录数据添加进表了;
为了把数据添加进表里,你需要INSERT 语句;
INSERT语句格式:
INSERT INTO table ( columns, column1, … ) VALUES ( ‘values’,1,… );
我们分析下:
1)从关键字INSERT INTO开始;
2)包含列名的小括号中的列名,以逗号分隔;
3)另一个关键字VALUES开始,接下来是各列的值;
4)值得列表也是以逗号分隔;
5)输入的文本数据需要加上单引号;
6)第二组括号中的值必须和列名的顺序相同;
把数据添加进表中:
INSERT INTO my_contacts
(last_name,first_name,emal,gender,birthdy,profession,location,status,seeking)
VALUES
('Anderson','Jilian','aaa@qq.com','F','1991-01-01','Technical Writer','Palo Alto,CA','Single','Kayaking,Reptiles’);
注意列和values的序列需要一一对应;
接续》》》》》:
我们先回顾下当前的数据库中的表结构;然后继续开启今天的学习记录;
新建一张表 记录甜甜圈的订购记录:doughnut_purchases
SQL语句:
create table doughnut_purchases
(
donut_type varchar(20),
dozens int,
topping varchar(20),
price dec(4,2)
);
插入一条订购记录:
SQL语句:
insert into doughnut_purchases
(donut_type,dozens,topping,price)
values
('jelly',2,'sprinkles',33.50);
从上两条示例可以看出:
INSERT语句中的CHAR VARCHAR DATE BLOB的值需要加上单引号,DEC INT的数值则不需要;
INSERT语句的变形:
1)可以改变列的顺序:只要数据值的顺序也一起调整;
2)省略列名:INSERT INTO table VALUES (’values’, …);
列名可以省略,但数据值必须全部填入,而且必须与当初创建表时的列顺序完全相同;
3)省略部分列:需要明确指出数据值对应的列名;
向my_contacts表插入不完整值的记录:
INSERT INTO my_contacts
(first_name,emal,profession,location)
VALUES
('Pat','aaa@qq.com','Technical Writer','Palo Alto,CA');
以SELECT语句窥探表:
DESC只能查看表的结构,对于表中的数据,我们需要SELECT语句;
使用select *查看表中所有数据:
1)命令SELECT * FROM table;
2)*表示选择所有内容;
select* from my_contacts;
我们看到:NULL会出现在没有被赋值的列中;
NULL解读:
1)NULL不等于0,也不等于另外一个NULL,事实上,两个NULL根本不能放在一起比较;
2)值可以是NULL,但他不会等于NULL,因为NULL代表未定义的值;
3)在创建表的时候设置好不要NULL出现的列,就不会显示了;
只需要在创建表的数据类型之后加上NOT NULL就可以了;
用DEFAULT填补空白:
1)如果某些列通常有某个特定值,我们就可以把特定值指派为DEFAULT默认值;
2)跟在DEFAULT关键字后的值会在每次新增记录的时候自动插入表中——只要没有另外指派其他值;
3)需要注意的是默认值的类型必须和类型相同;
新建表doughnut_list,进行not null 以及default设置;
此表之前已经存在,drop table doughnut_list;重新建:
create table doughnut_list
(
doughnut_name varchar(10) not null,
doughnut_type varchar(6) not null,
doughnut_cost dec(3,2) not null default 1.00
);
接下来可以插入若干条数据进行测试:
insert into doughnut_list
(doughnut_name,doughnut_type,doughnut_cost)
values
('Blooberry','filled',2.00);
insert into doughnut_list
(doughnut_name,doughnut_type)
values
('Cinnamondo','ring');
总结:
本章介绍了 如何创建数据库和表;如何在表中插入最常见的数据类型,同时保证需要值的列有值;
1.CREATE DATABASE database;设置装表的数据库;
2.USE database;进入数据库;
3.CREATE TABLE table (column names, …);其中列名和列的数据类型通过分析得出;
4.NULL和NOT NULL:知道哪些列不应该接收NULL值,才能帮助你搜索和整理数据;
5.DEFAULT用于指定某列的默认值,在输入一条记录但没有为某列赋值的时候;
6.使用DESC语句查看表结构;
7.DROP TABLE语句 用于丢弃表;
8.为表插入数据时,可以使用任何一种INSERT语句;
9.NULL是未定义的值,不等于零,也不等于空值;值可以是NULL,但绝非等于NULL;
10.可以修改列为不接受NULL值,在创建表的时候使用关键字NOT NULL;
11.创建表时使用DEFAULT,可于日后输入缺乏部分数据的记录时自动填入默认值;