SQL基础语句入门

SQL语句入门起因学校开设数据库相关的课程了,打算总结一篇关于基础SQL语句的文章 。
SQL介绍SQL最早版本是由IBM开发的,一直发展到至今 。
SQL语言有如下几个部分:

  • 数据定义语言DDL:提供定义关系模式、删除关系以及修改关系模式的命令
  • 数据操纵语言DML:提供从数据库中查询信息以及在数据库中插入元组、删除元组以及修改元组的能力
  • 完整性:SQL DDL包括定义完整性的约束命令
  • 视图定义:SQL DDL包括定义视图的命令
  • 事务控制:SQL包括定义事务的开始点和结束点命令
  • 嵌入式SQL和动态SQL:定义如何嵌入如C++等这样的编程语言
  • 授权:SQL DDL包括定义对关系和视图的访问权限的命令
SQL标准支持多种固有类型:
  • char(n) 具有用户指定长度为n的字符串
  • varchar(n) 最大长度为n的可变长字符串
  • int 整数
  • smallint 小正数(依赖于机器的整数类型的子集)
  • numeric(p,d) 指定精度的定点数 。此数字有p位(加上一个符号位)小数点右边有p位数中的d位数字
  • real 单精度
  • double 双精度
  • float(n) 精度至少为n的浮点数
SQL语句入门首先说明一下 , SQL语句后面的分号是可选的 。
创建关系CREATE TABLE student( Sname VARCHAR(20), Sid INT, PRIMARY KEY(Sid));上述语句会创建一个student的关系(表),它包含学生姓名和学生id号码 。其中,Sname学生姓名的最大长度不超过20个字符,Sid为整型,并且PRIMARY KEY(Sid)对关系进行了完整性约束,说明学号作为主键,也就是说同一个学生他的id号码是唯一的 。
SQL还支持许多完整性约束 , 例如外码与非空,下面仅对这两种进行介绍:
外码声明关系中的任意元组在属性上的取值必须对应于另外的某个关系的某元组在主码属性上的取值,其形式为foreign key(A,B,C)references X,其中A B C为属性,X为指定的关系
非空完整性约束表示某个属性的取值不能为空,其形式A INT not null表示类型为整型名为A的属性不能为空
下面我们创建一个与课程相关的表,要求主键(主码)为课程id且不为空 , 外码为上面student关系的学生姓名属性来做演示:
CREATE TABLE course( Cid INT NOT NULL, Sname VARCHAR(20), Cname VARCHAR(20), PRIMARY KEY(Cid), FOREIGN KEY(Sname) REFERENCES student);此时Sname的取值必须是student关系的Sname中的的一个取值 。
删除关系删除操作有两种:
下方这条语句会删除名为course的关系
DROP TABLE course;
DELETE FROM course;则会删除course关系中的所有元组(数据),但该关系保留
说白一点就是前者连表带数据一块删除,后者只剩一个空表
增加与删除属性有时候会向关系中添加一个新的属性,则需要用到以下语句
ALTER TABLE student ADD Sage INT;该语句向student中添加了一个名为Sage,类型为整型的属性 , 用于表示学生的年龄
在student中原有的元组在Sage的取值都将为空,即null(意思就是老数据原来没有年龄,现在新建了年龄这一列,之前的老数据该列上的取值都为空)
删除属性就很简单了,我们删除student关系中的Sage属性为例,语句如下
ALTER TABLE student DROP Sage;但是注意 , 很多数据库都不支持这一点,执行该语句可能会报错 。
查询SQL查询结构由三个子居构成selectfromwhere
查询以在from子句列出的关系作为输入,并在这些关系上进行whereselect子句中的指定运算,然后产生一个关系作为结果 。
为方便演示,先向student表中插入如下几条数据
INSERT INTO student VALUES('CairBin',1);INSERT INTO student VALUES('Bob',2);INSERT INTO student VALUES('Alice',3);INSERT INTO student VALUES('Alice',4);INSERT INTO course VALUES(4,'Alex','chemistry');INSERT INTO course VALUES(1,'CairBin','math');INSERT INTO course VALUES(2,'CairBin','chemistry');INSERT INTO course VALUES(3,'Alice','chemistry');单关系查询我们现在想要获取student关系中的所有学生的姓名,也就是Sname属性列下的所有数据,则可以使用如下语句
SELECT Sname FROM student;当然可以跟随多个属性 , 例如输出学生姓名和id
SELECT Sname,Sid FROM student;另外,在关系模型的形式化数学定义中,关系是一个集合,因此重复的元组不会出现在集合中 。但是对于实际操作来讲,去重是相当费时的,所以SQL允许在数据库关系和数据库表达式的结果中出现重复 。

推荐阅读