余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

数据分析人必掌握的数据库语言——SQL指南第八期

xiyangw 2022-11-25 11:57 34 浏览 0 评论

本篇重点为大家讲解创建和操纵表、使用视图相关内容。


01 创建和操纵表


创建表

SQL不仅用于表数据操纵,而且还用来执行数据库和表的所有操作,包括表本身的创建和处理。

创建表的两种常用方法:

?交互式创建和管理数据库表的工具;

?用SQL语句操纵。

1、表创建基础

用程序创建表,可以使用SQL的CREATE TABLE语句。利用CREATE TABLE创建表,必须给出下列信息:

?在关键字CREATE TABLE之后给出新表的名字,;

?表列的名字和定义,用逗号分隔;

?有的DBMS还要求指定表的位置。

示例:
CREATE TABLE Products
(
  prod_id      CHAR(10)       NOT NULL,
  vend_id      CHAR(10)       NOT NULL,
  prod_name    CHAR(254)      NOT NULL,
  prod_price   DECIMAL(8,2)   NOT NULL,
  prod_desc    VARCHAR(1000)  NULL
)

分析:从上面的例子可以看到,表名紧跟CREATE TABLE关键字。实际的表定义(所有列)括在圆括号之中,各列之间用逗号分隔。

2、使用NULL值

NULL值就是没有值或缺值。允许NULL值的列也允许在插入行时不给出该列的值。不允许NULL值的列不接受没有列值的行,换句话说,在插入或更新行时,该列必须有值。

示例:
CREATE TABLE Orders
(
  order_num        INTEGER      NOT NULL,
  order_date       DATETIME     NOT NULL,
  cust_id          CHAR(10)     NOT NULL
)

分析:这条语句创建本书中所用的Orders表。包含三列:订单号、订单日期和顾客ID。这三列都需要,因此每一列的定义都含有关键字NOT NULL,这就会阻止插入没有值的列。如果插入没有值的列,将返回错误,且插入失败。

如何创建混合NULL和NOT NULL列的表,如下:

CREATE TABLE Vendors
(
  vend_id         CHAR(10)          NOT NULL,
  vend_name       CHAR(50)          NOT NULL,
  vend_address    CHAR(50)                  ,
  vend_city       CHAR(50)                  ,
  vend_state      CHAR(5)                   ,
  vend_zip        CHAR(10)                  ,
  vend_country    CHAR(50)
)

分析:这条语句使用的Vendors表。供应商ID和供应商名字列是必需的,因此指定为NOT NULL。其余五列全都允许NULL值,所以不指定NOT NULL。NULL为默认设置,如果不指定NOT NULL,就认为指定的是NULL。

3、指定默认值

SQL允许指定默认值,在插入行时如果不给出值,DBMS将自动采用默认值。默认值在CREATE TABLE语句的列定义中用关键字DEFAULT指定。

示例:
CREATE TABLE OrderItems
(
  order_num       INTEGER         NOT NULL,
  order_item      INTEGER         NOT NULL,
  prod_id         CHAR(10)        NOTNULL,
  quantity        INTEGER         NOT NULL DEFAULT 1,
  item_price      DECIMAL(8,2)    NOT NULL
)

分析:这条语句创建OrderItems表,包含构成订单的各项(订单本身存储在Orders表中)。quantity列为订单中每个物品的数量。在这个例子中,这一列的描述增加了DEFAULT 1,指示DBMS,如果不给出数量则使用数量1。

更新表

更新表可以使用ALTER TABLE语句,使用ALTER TABLE语句时需要注意以下几点:

?不要在表中包含数据时对其进行更新。在表的设计过程中应充分考虑未来可能的需求,避免今后对表的结构做大改动。

?所有的DBMS都允许给现有的表增加列,不过对所增加列的数据类型(以及NULL和DEFAULT的使用)有所限制。

?许多DBMS不允许删除或更改表中的列。

?多数DBMS允许重新命名表中的列。

?许多DBMS限制对已经填有数据的列进行更改,对未填有数据的列几乎没有限制。

使用ALTER TABLE更改表结构:

ALTER TABLE Vendors ADD vend_phone CHAR(20)

分析:这条语句给Vendors表增加一个名为vend_phone的列,其数据类型为CHAR。

更改或删除列、增加约束或增加键:

ALTER TABLE Vendors DROP COLUMN vend_phone

复杂的表结构更改一般需要手动删除过程,它涉及以下步骤:

(1) 用新的列布局创建一个新表;

(2) 使用INSERT SELECT语句从旧表复制数据到新表。可以使用转换函数和计算字段;

(3) 检验包含所需数据的新表;

(4) 重命名旧表或删除;

(5) 用旧表原来的名字重命名新表;

(6) 根据需要,重新创建触发器、存储过程、索引和外键。

删除表

删除表使用DROP TABLE语句。

DROP TABLE CustCopy

分析:删除表没有确认步骤,也不能撤销,执行这条语句将永久删除该表。

重命名表

每个DBMS对表重命名的支持有所不同。对于这个操作,不存在严格的标准。DB2、MariaDB、MySQL、Oracle和Postgre SQL用户使用RENAME语句,SQL Server用户使用sp_rename存储过程,SQLite用户使用ALTER TABLE语句。


02 使用视图


视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询。下面我们来看一个例子:

SELECT cust_name, cust_contact
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.Cust_id
  AND OrderItems.Order_num =Orders.order_num
  AND prod_id = 'RGANO1'

分析:此查询用来检索订购了某种产品的顾客。任何需要这个数据的人都必须理解相关表的结构,知道如何创建查询和对表进行连接。检索其他产品的相同数据,必须修改最后的WHERE子句。

假如可以把整个查询包装成一个名为Product Customers的虚拟表,则可以如下轻松地检索出相同的数据:

SELECT cust_name, cust_contact
FROM ProductCustomers
WHERE prod_id = 'RGANO1' 

为什么使用视图

? 重用SQL语句。

? 简化复杂的SQL操作。

? 使用表的一部分而不是整个表。

? 保护数据。可以授予用户访问表的特定部分的权限,而不是整个表的访问权限。

? 更改数据格式和表示。可以对视图执行SELECT操作,过滤和排序数据,将视图连接到其他视图或表,甚至添加和更新数据。

视图的规则和限制

这些限制随不同的DBMS而不同,下面是关于视图创建和使用的一些最常见的规则和限制。

? 与表一样,视图必须唯一命名。

? 对于可以创建的视图数目没有限制。

? 创建视图,必须具有足够的访问权限。这些权限通常由数据库管理人员授予。

? 视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造视图。所允许的嵌套层数在不同的DBMS中有所不同。

? 许多DBMS禁止在视图查询中使用ORDER BY子句。

? 有些DBMS要求对返回的所有列进行命名,如果列是计算字段,则需要使用别名。

? 视图不能索引,也不能有关联的触发器或默认值。

? 有些DBMS把视图作为只读的查询,这表示可以从视图检索数据,但不能将数据写回底层表。


03 创建视图


视图用CREATE VIEW语句来创建。与CREATE TABLE一样,CREATE VIEW只能用于创建不存在的视图。

利用视图简化复杂的连接

一个最常见的视图应用是隐藏复杂的SQL,通常涉及连接。

示例:

CREATE VIEW ProductCustomers AS
SELECT cust_name, cust_contact, prod_id
FROM Customers, Orders, OrderItems
WHERE Customers.Cust_id = Orders.Cust_id
  AND OrderItems.order_num = Orders.order_num

分析:这条语句创建一个名为ProductCustomers的视图,它连接三个表,返回已订购了任意产品的所有顾客的列表。如果执行SELECT*FROM Product Customers,将列出订购了任意产品的顾客。

用视图重新格式化检索出的数据

视图的另一常见用途是重新格式化检索出的数据。

示例:
SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
       AS vend_title
FROM Vendors
ORDER BY vend_name

用视图过滤不想要的数据

视图对于应用普通的WHERE子句也很有用。可以定义CustomerEMailList视图,过滤没有电子邮件地址的顾客。

示例:
CREATE VIEW CustomerEMailList AS
SELECT cust_id, cust_name, cust_email
FROM Customers
WHERE cust_email IS NOT NULL

使用视图与计算字段重命名表

在简化计算字段的使用上,视图也特别有用。下面是一条SELECT语句,检索某个订单中的物品,计算每种物品的总价格。

SELECT prod_id,
       quantity, 
       item_price,
       quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008

要将其转换为一个视图,如下进行:

CREATE VIEW OrderItemsExpanded AS 
SELECT order_num,
       prod_id, 
       quantity, 
       item_price,
       quantity*item price AS expanded price
FROM OrderItems

检索订单20008的详细内容,如下进行:

SELECT *
FROM OrderItemsExpanded 
WHERE order_num = 20008

视图非常容易创建,而且很好使用。正确使用,视图可极大地简化复杂数据的处理。

以上就是今天分享的全部内容,下期为大家带来SQL练习相关内容,我们下期见!

整理不易,点赞、收藏帮忙点一下!

相关推荐

辞旧迎新,新手使用Containerd时的几点须知

相信大家在2020年岁末都被Kubernetes即将抛弃Docker的消息刷屏了。事实上作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使...

分布式日志系统ELK+skywalking分布式链路完整搭建流程

开头在分布式系统中,日志跟踪是一件很令程序员头疼的问题,在遇到生产问题时,如果是多节点需要打开多节点服务器去跟踪问题,如果下游也是多节点且调用多个服务,那就更麻烦,再者,如果没有分布式链路,在生产日志...

Linux用户和用户组管理

1、用户账户概述-AAA介绍AAA指的是Authentication、Authorization、Accounting,即认证、授权和审计。?认证:验证用户是否可以获得权限,是3A的第一步,即验证身份...

linux查看最后N条日志

其实很简单,只需要用到tail这个命令tail-100catalina.out输入以上命令,就能列出catalina.out的最后100行。...

解决linux系统日志时间错误的问题

今天发现一台虚拟机下的系统日志:/var/log/messages,文件时间戳不对,跟正常时间差了12个小时。按网上说的执行了servicersyslogrestart重启syslog服务,还是不...

全程软件测试(六十二):软件测试工作如何运用Linux—读书笔记

从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事,工作时需要用到,面试时会被问到,简历中需要写到。对于软件测试人员来说,不需要你多么熟练使用Linux所有命令,也不需要你对Linux...

Linux运维之为Nginx添加错误日志(error_log)配置

Nginx错误日志信息介绍配置记录Nginx的错误信息是调试Nginx服务的重要手段,属于核心功能模块(nginx_core_module)的参数,该参数名字为error_log,可以放在不同的虚机主...

Linux使用swatchdog实时监控日志文件的变化

1.前言本教程主要讲解在Linux系统中如何使用swatchdog实时监控日志文件的变化。swatchdog(SimpleWATCHDOG)是一个简单的Perl脚本,用于监视类Unix系统(比如...

syslog服务详解

背景:需求来自于一个客户想将服务器的日志转发到自己的日志服务器上,所以希望我们能提供这个转发的功能,同时还要满足syslog协议。1什么是syslog服务1.1syslog标准协议如下图这里的fa...

linux日志文件的管理、备份及日志服务器的搭建

日志文件存放目录:/var/log[root@xinglog]#cd/var/log[root@xinglog]#lsmessages:系统日志secure:登录日志———————————...

运维之日志管理简介

日志简介在运维过程中,日志是必不可少的东西,通过日志可以快速发现问题所在。日志分类日志分类,对不同的日志进行不同维度的分析。操作系统日志操作系统是基础,应用都是在其之上;操作系统日志的分析,可以反馈出...

Apache Log4j 爆核弹级漏洞,Spring Boot 默认日志框架就能完美躲过

这两天沸沸扬扬的Log4j2漏洞门事件炒得热火朝天:突发!ApacheLog4j2报核弹级漏洞。。赶紧修复!!|Java技术栈|Java|SpringBoot|Spring...

Linux服务器存在大量log日志,如何快速定位错误?

来源:blog.csdn.net/nan1996jiang/articlep/details/109550303针对大量log日志快速定位错误地方tail/head简单命令使用:附加针对大量log日志...

Linux中查看日志文件的正确姿势,求你别tail走天下了!

作为一个后端开发工程师,在Linux中查看查看文件内容是基本操作了。尤其是通常要分析日志文件排查问题,那么我们应该如何正确打开日志文件呢?对于我这种小菜鸡来说,第一反应就是cat,tail,vi(或...

分享几款常用的付费日志系统,献给迷茫的你!

概述在前一篇文章中,我们分享了几款免费的日志服务器。他们各有各的特点,但是大家有不同的需求,有时免费的服务器不能满足大家的需要,下面推荐几款付费的日志服务器。1.Nagios日志服务器Nagio...

取消回复欢迎 发表评论: