SQL查询语言基础

本文介绍了SQL数据定义的基础,包括关系集合的模式定义、基本的数据类型,如整型、字符串等,以及SQL查询的基本结构,如单关系查询和多关系查询,涵盖了创建表、完整性约束、插入、删除和修改操作,以及各种查询技巧和示例。适合初学者快速了解SQL核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL数据定义

数据库中的关系集合必须由数据定义语言(DDL)指定给系统。SQL的DDL不仅能够定义一组关系,还能够定义每个关系的信息,包括:

  • 每个关系的模式
  • 每个属性的取值类型
  • 完整性约束
  • 每个关系维护的索引集合
  • 每个关系的安全性和权限信息
  • 每个关系在磁盘上的物理存储结构

基本类型

  • cahr(n):固定长度字符串,用户指定长度n,全称character
  • varchar(n):可变长度的字符串,用户指定最大长度n,全称character varying
  • int:整数类型,取值-2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647),全称integer
  • smallint:取值-2^15 (-32,768) 到 2^15 – 1 (32,767) ,小整数类型
  • numeric(p,d):定点数,精度由用户指定。有p位数字(一位符号位),d位数字在小数点右边
  • real:浮点数
  • double precision:双精度浮点数
  • float(n):精度至少为n位的浮点数

  • 当比较两个char类型的值时长度不相同,会在比较之前自动在短值后面加上额外的空格保证长度一致

基本模式定义

定义SQL关系
用create table命令定义SQL关系

create table user
  (id int,
   name varchar(20) not null,
   password varchar(20),
   primary key(id));
   foreign key(name) reference service);

部分完整性约束:
primary key(A1,A2…):构成关系主码
foreign key(A1,A2…)reference tableB:构成关系外码
not null:该属性上不允许出现空值

插入语句
如果关系中一调新插入或修改的元组在任意一个主码属性上有空值,或与其他元组相同,则SQL会标记一个错误,并阻止更新。

insert into user values(12345678,'zhangsan','123456')

删除元组或关系
从user中删除所有元组delete from r;
从数据库中去掉一个关系drop table r;
两者并不相同,前者仅是删除所有元组,而关系表还在,只是为空

修改属性语句
为已有的关系增加属性
r是现有关系的名字,A是待添加属性的名字,D是待添加属性的域

alter table r add A D;

为已有的关系删除属性

alter table r drop A;

SQL查询的基本结构

查询的基本结构由:select、from、where组成

  • select子句用于列出查询结果中所需要的属性
  • from子句是一个查询求职中需要访问的关系列表
  • where子句是一个作用在from子句中关系的属性上的谓词

单关系查询

查找关系表中单个属性构成的关系select A from r;

  • distinct:去除重复
select distinct A from r;
  • all:显式指明不去除重复
select all A from r;
  • 运算符:select子句可带有+、-、*、/运算符的算术表达式,运算对象可以是常数或元组的属性
select A*1.1,B,C from r;//属性A会是原来的1.1倍
  • where:where子句允许使用逻辑连词and、or和not。逻辑连词的运算对象可以是包含比较运算符<、≤、>、≥、=和<>表达式
select A from r where B>100 and C=0;
  • 查询所有的信息
select * from c;
  • 查询满足条件的元组
    (1)比较:
select * from sc
where not grade>90;

(2)确定范围:betweennot between

select * from sc
where grade between 60 and 100;

select * from sc
where grade not between 60 and 100;

(3)确定集合innot in

select * from sc
where grade in (60,70,80,90,100);

select * from sc
where grade not in (60,70,80,90,100);

(4)字符匹配:
查找指定的属性列值与<匹配串>相匹配的元组,可以是一个完整的字符,也可以含有通配符%和_。
通配符%:代表任意≥0的长度
比如a%b:代表以a开头,以b结尾的任意长度的字符串
通配符_:代表任意单个字符
比如a%b:代表以a开头,以b结尾的任意长度为3的字符串

select * from s
where sname like '李%';

(5)涉及空值的查询is nullis not null

select sno,cno from sc
where grade is null;

(6)多重条件查询
用逻辑符号andor来联结多个查询条件,and的优先级高于or,可以用括号改变优先级

select * from sc
where grade >=60 and grade<=100;

(7)对查询结果排序
使用order by,升序:asc,降序:desc
排序值为空时asc:最后显示,desc:最先显示

select sno,grade from sc
where cno='003'
order by grade desc;

多关系查询

一个典型的SQL查询具有如下形式:
通常查询需要从多个关系中获取信息

select A1,A2,A3,...,An
from r1,r2,r3,...,rn
where P

通常来说,一个SQL查询的含义可以理解如下:

  1. from子句中列出的关系产生笛卡尔积
  2. 在步骤1的结果上应用where子句中指定的谓词
  3. 对于步骤2结果中的每个元组,输出select子句中指定的属性

示例
用instruct与department两个关系表中dept
_name的取值作为匹配关系,查询instruct表中name=与department表中buliding的信息。
属性name和building只存在于一个关系中,不需要加前缀,而dept_name存在于两个关系表中,所以需要加前缀。

select name,instructor.dept_name,building
from instruct,department
where instruct.dept_name = department.dept_name;

需要小心设置合适的where子句条件,如果在上述例子中省略where子句条件,就会输出笛卡尔积,那是一个巨大的关系,且失去了对应关系一般并无意义。

参考书目

数据库系统概念(第六版)
译者:杨冬青 / 李红燕 / 唐世渭
出版社:机械工业出版社

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值