精华内容
下载资源
问答
  • MySQL是当今最流行的开源数据库之一。 它在商业和开源双重许可模式下可用。 MySQL找到了从嵌入式设备到集群企业环境的各种应用程序。 POWER5™处理器是IBMPPC®AS架构(2.02版)的最新64位实现。 它与所有PPC和PPC...

    gp数据库创建数据库

    MySQL是当今最流行的开源数据库之一。 它在商业和开源双重许可模式下可用。 MySQL找到了从嵌入式设备到集群企业环境的各种应用程序。

    POWER5™处理器是IBMPPC®AS架构(2.02版)的最新64位实现。 它与所有PPC和PPC AS应用程序级别代码二进制兼容。 POWER5芯片设计用于高达2.0 GHz的极高频率操作。 Power Architecture支持64位和32位寻址。 早期的实现使用32位子集,并且仅支持32位应用程序。 自1995年以来,64位处理器就实现了完整的体系结构,从而使二进制应用程序与现有的32位应用程序完全兼容,并支持新的64位应用程序。 在IBM®eServer™iSeries™,pSeries®,OpenPower™和BladeCenter™JS20服务器以及Apple的G5硬件中都可以找到64位POWER和PPC芯片。

    POWER5体系结构是POWER4体系结构的增强,但是保持了二进制和结构兼容性。 相同的管道结构使针对POWER4的编译器优化可以在基于POWER5处理器的系统上同样出色地工作。 POWER5的主要功能包括微分区和同步多线程。

    Linux已在商业和技术计算环境中占有重要地位,并Swift获得了各种企业的认可。 IBM Linux技术中心(LTC)是当今世界上用于企业Linux开发的首要组织,它们主要致力于开发,支持和增强Power Architecture上所有主要的Linux发行版。 独立软件供应商(ISV)和客户可以利用此支持,再加上来自开源社区的传统支持,为开发人员提供前所未有的网络支持。

    MySQL和相关组件

    传统上,MySQL已包含在所有主要的Linux发行版中。 主流的Linux on POWER发行版,例如Red Hat Enterprise Linux和SUSE LINUX Enterprise Server,也不例外。

    尽管MySQL和MySQL的产品包装和版本在Linux发行版之间有所不同,但希望看到以下内容:

    • 数据库服务器
    • 数据库客户端
    • 流行的编程语言(例如Java,C / C ++,Python,Perl,PHP等)的接口和扩展
    • 各种产品和开发API的库,模块和插件
    • 与MySQL相关的其他工具

    对于产品的详细列表和说明,请参考MySQL的主要枢纽,MySQL.com,下面列出相关主题 。 MySQL.com网站是MySQL信息和产品下载(包括Linux on POWER的下载)的主要来源。 可以从该站点下载适用于Linux on POWER的MySQL和相关产品的最新编译版本以及源代码。

    MySQL数据库有多种修饰。 有些可以在商业和开源双重许可下获得,而有些只能在商业许可下才能获得。 有关更多信息,请参考MySQL数据库服务器页面。 (请参阅相关主题 。)

    操作系统和硬件

    本文主要涉及针对POWER硬件的两个IBM支持的Linux on POWER发行版:

    • 红帽企业Linux
    • SUSE LINUX企业服务器

    适用于Linux on POWER的MySQL还可以在其他Linux发行版上运行,例如Yellow Dog Linux,Y-HPC,Debian,以及许多其他在IBM和Apple生产的POWER和PPC硬件上运行的版本。

    在Linux on POWER上安装MySQL

    在Linux on POWER上安装MySQL与在其他任何体系结构的Linux OS上安装MySQL没什么不同。

    如果您使用Linux on POWER发行版中包含的MySQL软件包,则安装MySQL与从发行版介质中安装所需的rpm软件包一样容易。 MySQL.com网站还以Linux社区普遍接受的压缩格式提供了Linux on POWER和PPC的下载。

    MySQL本身的源代码和许多工具都是在开放源代码许可下公开提供的,可以使用GNU编译器集合(GCC)在Linux on POWER上轻松编译。

    MySQL管理工具

    有几种MySQL管理工具,它们使用直观的图形用户界面来简化MySQL数据库的管理。

    MySQL管理员

    MySQL Administrator允许您配置,备份/还原和控制数据库以及MySQL服务器环境。 图1显示了在Linux on POWER的SLES 9上运行的MySQL Administrator的屏幕截图,显示了我们将在下一部分中创建的数据库结构。

    图1. MySQL Administrator窗口
    MySQL管理员窗口

    可以从源代码在Linux on POWER上编译MySQL Administrator。 有关MySQL Administrator的更多信息,请参见MySQL Administrator页面。 (请参阅相关主题 。)

    MySQL查询浏览器

    MySQL查询浏览器是一种易于使用的图形工具,用于在MySQL中创建,执行和优化SQL查询。 图2显示了在Linux on POWER的SLES 9上运行的MySQL Query Browser窗口的屏幕截图。

    图2. MySQL查询浏览器
    MySQL查询浏览器

    与MySQL Administrator类似,MySQL Query Browser的源代码可用,并且可以在Linux on POWER上进行编译。 有关MySQL查询浏览器的更多信息,请参考MySQL查询浏览器页面。 (请参阅相关主题 。)

    phpMyAdmin

    另一个MySQL管理和控制工具是phpMyAdmin。 该工具完全用PHP编写,可在具有以下可用组件的任何Linux发行版上使用:

    • PHP运行时环境
    • 带有PHP模块的Apache Web服务器
    • PHP-MySQL模块

    默认情况下,Linux on POWER发行版附带这些组件。 配置很简单,并在phpMyAdmin随附的文档中进行了详细说明。 图3显示了在Linux on POWER的SLES 9上运行的phpMyAdmin的屏幕截图。

    图3. phpMyAdmin
    phpMyAdmin

    有关更多信息并下载phpMyAdmin,请访问phpMyAdmin网站。 (请参阅相关主题 。)

    迁移MySQL

    当使用上述管理工具时,迁移MySQL数据库非常简单,因为MySQL数据库表结构保存在可以备份并复制到其他系统的文件中。 有关更多信息,请参考MySQL文档。

    创建MySQL数据库

    本文的这一部分检查了一个简单的数据库设计,以介绍一些关键的MySQL概念以及您可以在MySQL中执行的一些基本任务

    数据库设计

    本示例探索一个简化的数据库,该数据库跟踪IT专家承包公司的日常活动。 图4展示了一个实体关系图(ERD),它为您提供了公司简化的数据要求和操作的宏观视图。

    图4. IT专家签约公司数据库
    IT专家承包公司数据库

    该公司将IT专家与不同客户的项目签约,并根据既定的小时费率向客户收取所提供服务的费用。 JOB表跟踪客户每小时收取的服务费,费率取决于工作类型。 EMPLOYEE表跟踪员工信息,包括员工担任的职位,该信息被保留为JOB表中条目的外键。 JOB表与EMPLOYEE表具有1:M的可选关系。 一个职位可以不设人员而存在。 另一方面,要求员工仅担任一个主要职位。

    PROJECT表保存有关该公司参与的项目的数据。 一个项目必须完全由公司的一名员工来管理。 员工可以管理多个项目。 但是,并非每个员工都可以管理一个项目。

    每位员工都会收到一份订单表格,他们每天记录在一个客户的特定项目上工作多少小时,每小时多少费率以及向客户收取的总金额。

    可以一次将一个雇员分配到多个项目,也可以一次不分配。 一个项目可以有很多员工在工作,或者根本没有。 通过复合实体ORDERFORM实现此M:N关系。

    数据库中的所有表都被规范化为第三范式(3NF),因此我们可以基于上述ERD开始创建数据库结构。

    创建数据库

    首先,您需要启动MySQL客户端并登录MySQL:

    shell> mysql -h host -u user -p
    Enter password: ********

    成功登录并获得MySQL命令行界面提示后,可以开始创建数据库,如下所示:

    mysql> CREATE DATABASE CONTRACTING;
    Query OK, 1 row affected (0.00 sec)

    要验证是否已创建CONTRACTING数据库,请执行以下命令并接收以下输出:

    mysql> SHOW DATABASES;
    +-------------+
    | Database    |
    +-------------+
    | CONTRACTING |
    | mysql       |
    | test        |
    +-------------+
    3 rows in set (0.00 sec)

    请注意,SQL代码和MySQL内部命令的大写字母是可选的,但是数据库,表和列的名称区分大小写。 例如,名为“ TEST”的数据库与名为“ test”的数据库不同。

    现在,您需要更改为新创建的数据库:

    mysql> USE CONTRACTING
    Database changed

    此时,您准备开始在数据库中创建表。 您可以从JOB表开始,如下所示:

    mysql> CREATE TABLE JOB (
        -> JOB_CODE INTEGER NOT NULL UNIQUE,
        -> JOB_NAME LONG VARCHAR NOT NULL,
        -> JOB_HOUR_CHRG DECIMAL(10,2) NOT NULL,
        -> PRIMARY KEY (JOB_CODE)) ENGINE=InnoDB;
    Query OK, 0 rows affected (0.03 sec)

    将JOB表的类型指定为InnoDB以强制引用完整性。 查看创建的表的参数,如下所示:

    mysql> describe JOB;
    +---------------+---------------+------+-----+---------+-------+
    | Field         | Type          | Null | Key | Default | Extra |
    +---------------+---------------+------+-----+---------+-------+
    | JOB_CODE      | int(11)       |      | PRI | 0       |       |
    | JOB_NAME      | mediumtext    |      |     |         |       |
    | JOB_HOUR_CHRG | decimal(10,2) |      |     | 0.00    |       |
    +---------------+---------------+------+-----+---------+-------+
    3 rows in set (0.00 sec)

    其余的表以类似的方式创建。 MySQL允许您以非交互式批处理模式执行语句。 您可以将我们所有创建数据库SQL代码放入一个文本文件,然后从那里执行它。 以下是此类文件的示例:

    -- Creating the database
    CREATE DATABASE CONTRACTING;
    
    -- Changing into the CONTRACTING database
    USE CONTRACTING;
    
    -- Creating table JOB
    CREATE TABLE JOB (
            JOB_CODE INTEGER NOT NULL UNIQUE,
            JOB_NAME LONG VARCHAR NOT NULL,
            JOB_HOUR_CHRG DECIMAL(10,2) NOT NULL,
            PRIMARY KEY (JOB_CODE)) ENGINE=InnoDB;
    
    -- Creating table EMPLOYEE
    CREATE TABLE EMPLOYEE (
            EMP_SSN CHAR(9) NOT NULL UNIQUE,
            EMP_LNAME VARCHAR(50) NOT NULL,
            EMP_FNAME VARCHAR(50) NOT NULL,
            JOB_CODE INTEGER NOT NULL,
            PRIMARY KEY (EMP_SSN),
            FOREIGN KEY (JOB_CODE) REFERENCES JOB(JOB_CODE)
            ON UPDATE CASCADE
            ON DELETE RESTRICT) ENGINE=InnoDB;
    
    -- Creating table PROJECT
    CREATE TABLE PROJECT (
            PRJ_NUM INTEGER NOT NULL UNIQUE,
            PRJ_NAME VARCHAR(50) NOT NULL,
            EMP_SSN CHAR(9) NOT NULL,
            PRIMARY KEY (PRJ_NUM),
            FOREIGN KEY (EMP_SSN) REFERENCES EMPLOYEE(EMP_SSN)
            ON UPDATE CASCADE
            ON DELETE RESTRICT) ENGINE=InnoDB;
    
    -- Creating table ORDERFORM
    CREATE TABLE ORDERFORM (
            ORD_NUM INTEGER NOT NULL UNIQUE,
            ORD_DATE DATE NOT NULL,
            ORD_HOURS SMALLINT NOT NULL,
            ORD_CHRG_HOUR DECIMAL(10,2) NOT NULL,
            ORD_CHARGE DECIMAL(10,2) NOT NULL,
            PRJ_NUM INTEGER NOT NULL,
            EMP_SSN CHAR(9) NOT NULL,
            PRIMARY KEY (ORD_NUM),
            FOREIGN KEY (EMP_SSN) REFERENCES EMPLOYEE(EMP_SSN)
            ON UPDATE CASCADE
            ON DELETE RESTRICT,
            FOREIGN KEY (PRJ_NUM) REFERENCES PROJECT(PRJ_NUM)
            ON UPDATE CASCADE
            ON DELETE RESTRICT) ENGINE=InnoDB;

    请注意创建表的顺序。 被引用的表必须在被引用的表之前创建。 如果您没有将表类型指定为InnoDB,那么顺序就不重要了。 但是,参照完整性不会被强制执行。

    有关MySQL参考完整性的更多信息,请参见MySQL产品文档中有关外键约束的部分。

    要从上述文件执行SQL语句,您只需在命令行上将其传递给mysql即可从文件中读取,如下所示:

    mysql -u username < filename

    有关在批处理模式下使用MySQL的更多信息,请参见MySQL产品文档。

    要查看您创建的表结构,请输入以下命令:

    mysql> SHOW TABLES;
    +-----------------------+
    | Tables_in_CONTRACTING |
    +-----------------------+
    | EMPLOYEE              |
    | JOB                   |
    | ORDERFORM             |
    | PROJECT               |
    +-----------------------+
    4 rows in set (0.00 sec)
    
    mysql> DESCRIBE JOB;
    +---------------+---------------+------+-----+---------+-------+
    | Field         | Type          | Null | Key | Default | Extra |
    +---------------+---------------+------+-----+---------+-------+
    | JOB_CODE      | int(11)       |      | PRI | 0       |       |
    | JOB_NAME      | mediumtext    |      |     |         |       |
    | JOB_HOUR_CHRG | decimal(10,2) |      |     | 0.00    |       |
    +---------------+---------------+------+-----+---------+-------+
    3 rows in set (0.00 sec)
    
    mysql> DESCRIBE EMPLOYEE;
    +-----------+-------------+------+-----+---------+-------+
    | Field     | Type        | Null | Key | Default | Extra |
    +-----------+-------------+------+-----+---------+-------+
    | EMP_SSN   | varchar(9)  |      | PRI |         |       |
    | EMP_LNAME | varchar(50) |      |     |         |       |
    | EMP_FNAME | varchar(50) |      |     |         |       |
    | JOB_CODE  | int(11)     |      | MUL | 0       |       |
    +-----------+-------------+------+-----+---------+-------+
    4 rows in set (0.00 sec)
    
    mysql> DESCRIBE PROJECT;
    +----------+-------------+------+-----+---------+-------+
    | Field    | Type        | Null | Key | Default | Extra |
    +----------+-------------+------+-----+---------+-------+
    | PRJ_NUM  | int(11)     |      | PRI | 0       |       |
    | PRJ_NAME | varchar(50) |      |     |         |       |
    | EMP_SSN  | varchar(9)  |      | MUL |         |       |
    +----------+-------------+------+-----+---------+-------+
    3 rows in set (0.01 sec)
    
    mysql> DESCRIBE ORDERFORM;
    +---------------+---------------+------+-----+------------+-------+
    | Field         | Type          | Null | Key | Default    | Extra |
    +---------------+---------------+------+-----+------------+-------+
    | ORD_NUM       | int(11)       |      | PRI | 0          |       |
    | ORD_DATE      | date          |      |     | 0000-00-00 |       |
    | ORD_HOURS     | smallint(6)   |      |     | 0          |       |
    | ORD_CHRG_HOUR | decimal(10,2) |      |     | 0.00       |       |
    | ORD_CHARGE    | decimal(10,2) |      |     | 0.00       |       |
    | PRJ_NUM       | int(11)       |      | MUL | 0          |       |
    | EMP_SSN       | char(9)       |      | MUL |            |       |
    +---------------+---------------+------+-----+------------+-------+
    7 rows in set (0.00 sec)

    请注意,在EMPLOYEE表中,属性EMP_SSN类型从CHAR(9)转换为VARCHAR(9) 。 如果表具有VARCHAR类型的列,则同一表中所有大于CHAR(3)CHAR类型都将转换为VARCHAR类型。 当一个表中包含CHARVARCHAR类型时,此转换可提高性能。

    输入数据并验证参照完整性

    至此,您已经完成了在数据库中创建表的工作,可以开始用数据填充表了。 您可以使用INSERT语句或通过制表符分隔的文本文件将数据加载到表中来执行此操作。

    INSERT INTO JOB (JOB_CODE, JOB_NAME, JOB_HOUR_CHRG) 
    VALUES (200, 'Application Designer', 38.50);

    要查看在JOB表中进行了什么输入,请输入以下内容:

    mysql> SELECT * FROM JOB;
    +----------+----------------------+---------------+
    | JOB_CODE | JOB_NAME             | JOB_HOUR_CHRG |
    +----------+----------------------+---------------+
    |      200 | Application Designer |         38.50 |
    +----------+----------------------+---------------+
    1 row in set (0.00 sec)

    要从文本文件填充数据库中的表,需要创建一个制表符分隔文件。 以下示例文件可用于加载JOB表:

    200     Application Programmer  35.48
    201     Database Administrator  38.50
    202     Technical Support       27.00
    203     Database Designer       49.99

    要从此文件加载数据,您需要执行类似于以下命令:

    mysql> LOAD DATA LOCAL INFILE "job_data_load.txt" INTO TABLE JOB;
    Query OK, 4 rows affected (0.00 sec)
    Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

    请注意,如果文本文件不在启动mysql客户端的目录中,则需要指定该文件的绝对路径。 可以从LOAD DATA语句中的默认值更改列值分隔符。 有关从文本文件加载数据的更多信息,请参考MySQL产品文档。

    要验证结果,请打印出作业表中的所有行,如下所示:

    mysql> SELECT * FROM JOB;
    +----------+------------------------+---------------+
    | JOB_CODE | JOB_NAME               | JOB_HOUR_CHRG |
    +----------+------------------------+---------------+
    |      200 | Application Programmer |         35.48 |
    |      201 | Database Administrator |         38.50 |
    |      202 | Technical Support      |         27.00 |
    |      203 | Database Designer      |         49.99 |
    +----------+------------------------+---------------+
    4 rows in set (0.00 sec)

    以相同的方式,您可以填充其余表,请记住,由于您使用的是InnoDB表类型,因此必须执行参照完整性,因此必须在参照表之前填充被参照表。

    假设您使用以下数据填充了EMPLOYEE表:

    mysql> SELECT * FROM EMPLOYEE;
    +-----------+-----------+-----------+----------+
    | EMP_SSN   | EMP_LNAME | EMP_FNAME | JOB_CODE |
    +-----------+-----------+-----------+----------+
    | 600000001 | Smith     | John      |      201 |
    | 600000002 | Johnson   | James     |      200 |
    | 600000003 | Jones     | Anne      |      203 |
    +-----------+-----------+-----------+----------+
    3 rows in set (0.00 sec)

    例如,您指定的外键约束不应允许您删除JOB_CODE等于203的JOB表中的条目,因为有一个雇员Anne Jones,其雇员在EMPLOYEE表中的条目具有此工作代码。

    mysql> DELETE FROM JOB WHERE JOB_CODE=203;
    ERROR 1217 (23000): Cannot delete or update a parent row: a foreign 
    key constraint fails

    如您所见,引用完整性规则不允许您删除其他表中正在引用的条目。 但是,如果对JOB表中的JOB_CODE进行更新,则此更新必须传播到引用表,如下所示:

    mysql> UPDATE JOB SET JOB_CODE=207 WHERE JOB_CODE=203;
    Query OK, 1 row affected (0.02 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> SELECT * FROM JOB;
    +----------+------------------------+---------------+
    | JOB_CODE | JOB_NAME               | JOB_HOUR_CHRG |
    +----------+------------------------+---------------+
    |      200 | Application Programmer |         35.48 |
    |      201 | Database Administrator |         38.50 |
    |      202 | Technical Support      |         27.00 |
    |      207 | Database Designer      |         49.99 |
    +----------+------------------------+---------------+
    4 rows in set (0.00 sec)
    
    mysql> SELECT * FROM EMPLOYEE;
    +-----------+-----------+-----------+----------+
    | EMP_SSN   | EMP_LNAME | EMP_FNAME | JOB_CODE |
    +-----------+-----------+-----------+----------+
    | 600000001 | Smith     | John      |      201 |
    | 600000002 | Johnson   | James     |      200 |
    | 600000003 | Jones     | Anne      |      207 |
    +-----------+-----------+-----------+----------+
    3 rows in set (0.00 sec)

    为MySQL开发

    由于MySQL的流行,有大量的开发社区使用大多数主要编程语言编写MySQL应用程序。 在Linux(包括Linux on POWER)上,有许多API允许您编写应用程序以与MySQL,PHP,Java,C,C ++,Perl,Python和Ruby等编程语言进行通信。 在本系列的第2部分中 ,了解有关在Linux on Power上开发MySQL的更多信息。

    摘要

    MySQL被公认为当今性能最好的开源企业级Linux关系数据库服务器之一。 IBM 64位POWER平台通过提供卓越的性能,可靠性和高可用性来满足当今客户的所有需求。 MySQL RDBMS的强大功能与能够微分区,动态启用和禁用SMT的基于IBM POWER处理器的服务器的结合,提供了市场上最强大的Linux数据库服务器平台之一。


    翻译自: https://www.ibm.com/developerworks/systems/library/es-mysqlp1/index.html

    gp数据库创建数据库

    展开全文
  • 数据库学习】数据库总结

    万次阅读 多人点赞 2018-07-26 13:26:41
    1,数据库 1)概念 数据库是长期存储在计算机内、有组织的、可共享的大量数据的集合。 常见数据库管理系统有:Access、mysql、sql server 2)特点 ①数据库数据特点 永久存储、有组织...

    1,概念

    1)数据库

    数据库是长期存储在计算机内、有组织的、可共享的大量数据的集合。
    数据库中存储的是数据及数据之间的关系。

    正常情况读写文件系统比数据库快一到两个数据级;
    数据库的查询,大量并发的时候可能最浪费时间的是connect和close。
    数据库的优势是体现的大量数据的查询、统计以及并发读写,不是在速度上。

    2)数据库数据特点

    永久存储、有组织、可共享。
    (数据的最小存取单位是数据项)

    3)数据库系统的特点

    ①数据结构化

    ②数据的共享性,冗余度,易扩充

    ③数据独立性高

    数据独立性包括:物理独立性和逻辑独立性
    a)物理独立性(外模式\模式映像):
    用户程序不需要了解,应用程序要处理的只是数据的逻辑结构,这样当数据的物理存储改变了,应用程序不用改变。
    b)逻辑独立性(模式\内模式映像):
    逻辑独立性是指用户的应用程序与数据库的逻辑结构是相互独立的,即,当数据的逻辑结构改变时,用户程序也可以不变。
    逻辑数据独立性(logical data independence)是指概念模式改变,外模式和应用程序不变。在逻辑数据独立性里,数据的逻辑结构发生改变或存储关系的选择发生改变时用户不会受到影响。改变概念模式,例如增加和删除实体、增加和删除属性、增加和删除联系,不需要改变现有的外模式或重写应用程序。在DBMS中只需要修改视图的定义和映像来支持逻辑数据独立性。对用户来说,不再关心所做的修改是非常重要的。换句话说,模式经过逻辑重构之后,根据外模式构建的应用程序还是和从前一样工作。

    4)概念模型(E-R模型)

    ①概念

    概念模型的一种表示方法:实体联系方法,用E-R方法(E-R模型)来描述。
    概念模型是用于信息世界的建模,是一种信息模型,与具体的DBMS无关。且能满足用户对数据的处理要求,易于修改。
    概念模型与具体数据模型无关且容易向数据库模型转化。

    实体:举行表示
    属性:椭圆表示,并用直线与实体连接
    联系:菱形表示,用直线与实体连接,同时在边上标上联系的类型(1:1,1:n,m:n)。
    

    一个联系转化为一个关系模式,与该联系相连的各实体的码以及联系的属性转化为关系的属性,该关系的码则有三种情况:
    若联系为1:1,则每个实体的码均是该关系的后选码。
    若联系为1:n,则关系的码为n端实体的码。
    若联系为m:n,则关系的码为诸实体码的组合。

    数据库模式定义语言DDL(Data Definition Language):是用于描述数据库中要存储的现实世界实体的语言。一个数据库模式包含该数据库中所有实体的描述定义。这些定义包括结构定义、操作方法定义等。

    数据库逻辑设计: 将概念设计所得到的概念模型转换为某一具体的数据模型(层次、网状、关系、面向对象).

    5)关系完整性

    在关系模型中,关系完整性主要是指以下三方面:

    实体完整性

    所谓的实体完整性就是指关系(所谓的关系就是表)的主码不能取空值;
    比如学生表的主码通常是取学号为主码

    参照完整性

    是指参照关系中每个元素的外码要么为空(NULL),要么等于被参照关系中某个元素的主码;
    参照关系也称为外键表,被参照关系也称为主键表。

    用户定义的完整性

    指对关系中每个属性的取值作一个限制(或称为约束)的具体定义。比如 性别属性只能取”男“或”女“,再就是年龄的取值范围,可以取值0-130 ,但不能取负数,因为年龄不可能是负数。

    6)关系数据库规范化

    目地:使结构更合理,消除存储异常,使数据冗余尽量小,便于插入、删除和更新。
    原则:遵从概念单一化“一事一地”原则,即一个关系模式描述一个实体或实体间的一种联系。
    规范的实质:概念的单一化。
    规范化的方法:将关系模式投影分解成两个或两个以上的关系模式。

    2,依赖和范式

    1)依赖

    ①部分函数依赖

    设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。

        举个例子:通过AB能得出C,通过A也能得出C,通过B也能得出C,那么说C部分依赖于AB。
    

    ②完全函数依赖

    设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。

        举个例子:通过AB能得出C,但是AB单独得不出C,那么说C完全依赖于AB.
    

    ③传递函数依赖

    设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。

        举个例子:通过A得到B,通过B得到C,但是C得不到B,B得不到A,那么成C传递依赖于A
    

    ④多值依赖

    设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值有一组Y的值,这组值仅仅决定于x值而与z值无关。

    举例:
    有这样一个关系 <仓库管理员,仓库号,库存产品号> ,假设一个产品只能放到一个仓库中,但是一个仓库可以有若干管理员,那么对应于一个 <仓库管理员,库存产品号>有一个仓库号,而实际上,这个仓库号只与库存产品号有关,与管理员无关,就说这是多值依赖。

    2)范式

    各个范式联系:
    5NF⊂4NF⊂BCNF⊂3NF⊂2NF⊂1NF

    ①1NF(满足最低要求的范式:字段不可再分,原子性)

    如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。
    自我理解1NF就是无重复的列。
    如:(X1,X2)→X3,X2→X3 其中x3对x2部分依赖
    如:(X1,X2)→X3,X2→X4 其中有非主属性X4部分依赖于候选键{X1,X2},所以这个关系模式不为第二范式;又因为范式之间的关系满足1NF⊇2NF⊇3NF ⊇ BCNF,所以是第一范式。

    ②2NF(消除部分子函数依赖:一个表只能说明一个事物)

    若R∈1NF,且每一个非主属性完全函数依赖于码,则R∈2NF。
    即要求数据库表中的每个实例或行必须可以被唯一地区分。

    ③3NF(消除传递依赖,即消除非主属性对键的传递依赖:每列都与主键有直接关系,不存在传递依赖。任何非主属性不依赖于其它非主属性。)

    若R∈3NF,则每一个非主属性既不部分依赖于码,也不传递依赖于码。
    自我理解是:表中所有的数据元素不但要能唯一地被主键所标识,而且他们之间还必须相互独立,不存在其他的函数关系。

    ④BCNF(修正第三范式、扩充第三范式 消除主属性对键的传递依赖)

    所有非主属性对每一个码都是完全函数依赖;
    所有主属性对每一个不包含它的码,也是完全函数依赖;
    没有任何属性完全函数依赖于非码的任何一组属性。

    ⑤4NF

    关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X->->Y(Y∉X),X都含有码,则称R<U,F>∈4NF

    3,数据库平台

    数据库管理系统(DBMS):是系统软件,是数据库系统的核心。
    常见数据库管理系统有:Access、mysql、sql server

    4,数据库语句

    SQL 语言是非过程化的语言,易学习。
    SQL语言具有两种使用方式:一种是在终端交互方式下使用,称为交互式SQL; 另一种是嵌入在高级语言的程序中使用,称为嵌入式SQL,而这些高级语言可以是C、PASCAL、COBOL等,称为宿主语言。

    1)基本对象

    关系数据库系统支持 三级模式结构,其概念模式、外模式和内模式中的基本对象有表、视图和索引。
    三级模式结构有效地组织、管理数据,提高了数据库的逻辑独立性和物理独立性。使数据库达到了数据独立性。

    ①模式(schema,逻辑模式)

    A.概念

    是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。是数据库系统模式结构的中间层,即不涉及数据的物理存储细节和硬件环境,也与具体的应用程序、开发工具及高级设计语言无关。
    模式是数据库数据在逻辑级上的视图,一个数据库只有一个模式。

    也用于区分一个 大项目中的各个小项目,这样若有相同名字的表的话, 不同模式不会发生冲突。相当于编程时的命名空间。
    如:
    一个公司的系统,分2个子系统,分别为财务系统和人力资源系统.
    这2个子系统, 共用一个数据库。
    那么 财务系统的表, 可以放在财务的模式(schema).
    人力资源系统的表,放在人力资源系统的模式里面。
    这2个子系统,能够互相访问对方的表。
    但是又不因为 表重名 的问题,影响对方。

    B.访问

    访问具体的一个表,可以由 4个部分组成
    分别为 服务器名, 数据库名,模式名,表名。

    对于访问本地的数据库:
    不指定模式名的话, 数据库默认使用dbo模式。
    (DBO是每个数据库的默认用户,具有所有者权限,即DbOwner )
    pg不指定模式的话默认使用public模式。

    C.操作

    --创建
    CREATE SCHEMA schema_name;
    

    ②外模式(子模式,用户模式)

    是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
    外模式通常是模式的子集,一个数据库可以有多个外模式,但一个应用程序只能有一个外模式。
    外模式是保证数据库安全性的一个有力措施:用户只能访问外模式的数据,其余数据不可见。

    ③内模式(存储模式)

    一个数据库只有一个内模式。
    内模式是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式。

    数据库管理系统在三级模式之间提供了两层映像:
    外模式/模式映像(保证数据的逻辑独立性)
    模式/内模式映像(保证了物理独立性)

    ④表

    表分为临时表和永久表。

    临时表

    临时表存储在tempdb中(如下),当不再使用时会自动删除。

    IF OBJECT_ID('tempdb..#ownerAnnouce') IS NOT NULL
    

    根据进程独立,只有进程的拥有者有表的访问权限,其它用户不能访问该表;
    不同的用户进程,创建的临时表虽然“名字”相同,但是这些表之间相互并不存在任何关系;在SQLSERVER中,通过特别的命名机制保证临时表的进程独立性。

    临时表有两种类型:本地和全局。

    A.本地临时表

    名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。

    B.全局临时表

    名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。

    临时表优点

    真正的临时表利用了数据库临时表空间,由数据库系统自动进行维护,因此节省了表空间。并且由于临时表空间一般利用虚拟内存,大大减少了硬盘的I/O次数,因此也提高了系统效率。

    临时表的创建

    A. create table #临时表名
    B.select * into #临时表名 from 表名(永久表或临时表)

    ⑤视图

    A.概念

    视图是一张虚拟表,视图的字段是自定义的,视图只支持查询,查询数据来源于实体表。

    一般视图是只读的,在pg中通过添加规则可以进行视图的更新。从pg9.1开始,用户可以通过INSTEAD OF的触发器来实现视图更新。

    B.优缺点

    • 优点
      视图可以将多个复杂关联表提取信息,方便查询,但不能优化查询速度(调用视图查询时才进行动态检索数据)。
      即,如果你认为一个sql查询非常慢,为了优化它的速度把它建立成视图,这是不可取的,视图是每次调用的时候生成,并不是数据源变化就刷新数据,并不能提高检索效率。
    • 缺点
      视图就是临时表,即调即用,如果数据源没有任何变化,在反复调用中,临时表会缓存到内存中(SHOW STATUS LIKE ‘Qcache%’;),视图中不能创建索引,但视图可以基于索引生成 。

    C.场景

    1. 重用SQL语句;
    2. 简化复杂SQL操作(生成视图),重用查询且不需要知道基本查询细节。
    3. 保护数据。用户有表的部分权限。
    4. 更改数据格式和表示。视图可返回与底层表不同的表示和格式。

    D.操作

    --创建视图
    CREATE OR REPLACE VIEW view_name(studentName, studentAge)  --(studentName, studentAge) 可以去掉,加上是重命名列名
    AS 
    SELECT user_info.name, user_info.age from user_info;
    
    --删除视图
    DROP VIEW view_name;
    

    ⑥实体视图

    相对于普通的视图来说,实体化视图的不同之处在于实体化视图管理存储数据,占据数据库的物理空间。

    实体化视图的结果会保存在一个普通的数据表中,在对实体化视图进行查询的时候不再会对创建实体化视图的基表进行查询,而是直接查询实体化视图对应的结果表,然后通过定期的刷新机制来更新实体化视图表中的数据。

    demo

    -- 创建物化视图
    CREATE MATERIALIZED VIEW MAX_ID_MVIEW 
    AS
      SELECT PART_ID, MAX(ID)  MAX_ID
      FROM PART_DETAIL GROUP BY PART_ID;
      
    -- 如果刷新时不带CONCURRENTLY则无需创建唯一索引
    CREATE UNIQUE INDEX IDX_MAX_ID ON MAX_ID_MVIEW(PART_ID);
    
    -- 利用watch命令每120s刷新一次物化视图
    REFRESH MATERIALIZED VIEW CONCURRENTLY MAX_ID_MVIEW; \watch 120
    

    作用

    1. 减轻网络负担:通过实体化视图将数据从一个数据库分发到多个不同的数据库上,通过对多个数据库访问来减轻对单个数据库的网络负担。
    2. 搭建分发环境:通过从一个中央数据库将数据分发到多个节点数据库,达到分发数据的目的。
    3. 复制数据子集:实体化视图可以进行行级/列级的筛选,这样可以复制需要的那一部分数据。
    4. 实体化视图是用于汇总,预计算,复制或分发数据的对象, 在大型的数据库中使用它可以提高涉及到的SUM,COUNT,AVG,MIN,MAX等的表的查询的速度。
    5. 物化视图的快速刷新采用了增量的机制,在刷新时,只针对基表上发生变化的数据进行刷新。因此快速刷新是物化视图刷新方式的首选。

    ⑦索引

    为了改变数据库的性能和可访问性所增加的一组辅助性数据。
    详细介绍见下文。

    2)数据结构创建及修改

    1>数据库操作

    --查看数据库
    show databases;
    --建库
    create database children;
    --删库
    drop database children;
    --调用数据库
    use children;
    

    2>表操作

    --pg建表
    CREATE TABLE if not exists public.stu_info(   --创建public模式下的表
        FOREIGN KEY (ID) REFERENCES people_info (ID),  --单个外键,一般情况下不建议增加这种强约束
        id int8 PRIMARY KEY,    --系统会自动为主键创建一个隐含的索引  primary key(Sno,Cno)组合主键
        address VARCHAR (255) UNIQUE NOT NULL,
        birthday TIMESTAMP NOT NULL,  
        age int default 15,  --默认值,影响后续插入值。但对旧数据没有影响。
       CONSTRAINT student2_pkey PRIMARY KEY (id),
       CONSTRAINT ck_age CHECK(age<18), --检查约束,约束某些字段需要满足的要求。NULL被认为满足条件。
       CONSTRAINT uk_tbl_unique_a_b unique(id ,address) --唯一约束。唯一键中可以写入任意多个NULL!即可以存在多组 1,null  
    )
    WITH (
      OIDS=FALSE
    );
    ALTER TABLE myschema.tb_test
      OWNER TO postgres;
    
    --重命名表
    alter table tableName RENAME TO newName;--pg
    

    i>指定默认值

    一般用于数据预置或create_time、update_time的自动录入。各个DBMS获得系统日期如下:

    DBMS函数/变量
    AccessNOW()
    DB2CURRENT_DATE
    MySQLCURRENT_DATE()
    OracleSYSDATE
    PostgreSQLCURRENT_DATE
    SQL ServerGETDATE()
    SQLitedate(‘now’)
    --修改默认值
    alter table tableName alter column age set DEFAULT 15;--pg
    --删除默认值
    alter table tableName alter column age drop DEFAULT 15;--pg
    

    ii>表约束

    表约束有:主键、外键、检查约束、唯一约束、非NULL约束。

    --添加主键(有些DBMS不允许在建表之后修改主键)
    ALTER TABLE tableName ADD PRIMARY KEY(fieldName) ; --fieldName在库中不能有重复数据
    --增加约束
    alter table tableName add check (age<16);--pg 增加检查约束,约束名为:tableName_age_check
    alter table tableName add constraint uk_tbl_unique_a_b unique (a,b);--pg 增加唯一约束
    alter table tableName alter column fieldName set NOT NULL;--pg 增加非空约束
    --删除约束
    alter table tableName drop constraint constraintName;--pg 根据约束名删除检查约束、唯一约束
    alter table tableName alter column fieldName drop NOT NULL;--pg 删除非空约束(非空约束没有约束名)
    

    iii>修改表字段

    --增加列\添加一个字段
    alter table tableName add column columnName varchar(30) default 'a' not null; --column 可加可不加
    --删除列(会连同字段上的约束一并删除)
    alter table tableName drop column columnName; --column 可加可不加
    --修改列名:
    alter table tableName rename column fieldName TO fieldNameNew;--pg、oracle中
    exec sp_rename '[表名].[列名]‘,’[表名].[新列名]'--在sqlserver
    ALTER TABLE 表名 CHANGE 列名 新列名 列类型--mysql
    
    --修改字段类型或长度:
    alter table tableName modify column 字段名 类型;
    alter table tableName alter column fieldName TYPE text;--pg修改字段数据类型。仅在当前数据都可以隐式转换为新类型时才可以执行成功
    --将NAME最大列宽增加到10个字符
    ALTER TABLE CARD ALTER COLUMN NAME varchar(10) 
    
    

    3)数据查询

    数据库处理一个查询的步骤:
    客户端连接->查询缓存->解析器->预处理器->查询优化器->查询执行引擎->数据

    1. 客户端发送一条查询给服务器;
    2. 服务器先会检查查询缓存query cache,如果命中了缓存,则立即返回存储在缓存中的结果。否则进入下一阶段;
    3. 服务器端进行SQL解析parsing、预处理transition,再由优化器optimization生成对应的执行计划;
    4. 根据优化器生成的执行计划,调用存储引擎的API来执行分布distribution查询;
    5. 将结果返回给客户端。
    

    1>简单查询

    select * from student;
    select 1+2; #当表达式与表列无关时,在pg和mysql中不适用“from tableName”
    

    拼接查询:
    Access和 SQL Server使用 + 号。DB2、Oracle、PostgreSQL、SQLite和Open Office Base 使用 ||。

    select label || '_' || id from user_info;  --结果:abc_1
    

    2>条件查询

    功能表达举例备注
    等于=
    不等于<>!=
    空值is null,is not nullselect * from student where class is not null;
    确定集合,ininnot inselect * from student where age not in(21,23);在sql标准中仅支持100个以内的占位符作为查询参数。根据数据库不同,对in的参数和长度有不同的限制,否则会直接报错。
    确定范围between and , not between and
    模糊查询like ,not likeselect * from student where name like '%丽%';’ %代表任意长度(可为0)的字符串;_(下划线):代表任意单个字符。(汉字代表2个字符,所以一个汉字用两个下划线);\为转义字符

    select出的别名是否可以作为where查询条件?不能,因为执行计划中where在selectz之前。如:select label a from asset_field where a = '分类'

    3>排序查询

    非排序查询的数据顺序:pg默认返回数据的顺序是插入表的数据顺序。

    # 单个排序:
    select name,age from student order by age desc; # 默认为asc:升序排列。desc:降序排序。
    
    #多重排序:
    order by 字段5,字段6 asc  //先按字段5排序,再按字段6排序
    

    4>case when then查询

    --简单case函数
    case sex
      when '1' then '男'
      when '2' then '女’
      else '其他' end
    --case搜索函数
    case when sex = '1' then ''
         when sex = '2' then ''
         else '其他' end  
    

    应用:

    select (case sex
    		  when '1' then '男'
    		  when '2' then '女’
    		  else '其他' end)sex from student where class = 11;
    

    5>where、group by、having

    大部分的where都可以背having代替,不同的是where过滤行,而having过滤分组,用在group by之后。(where在分组前过滤,having在分组后过滤)

    select class,avg(age) as age from student 
    group by class 
    having avg(age)>23 /*要求平均年龄大于23*/
    

    where肯定在group by 之前
    where后的条件表达式里不允许使用聚合函数,而having可以。

    6> 函数

    聚合函数

    avg平均数,同min(age)、max(age)、sum(age)

    select avg(age)  as age from student group by class order by age desc; 
    

    count

    select count(class)from student;
    /*数量 因为使用了92标准,所以null不计入count*/
    count(*) 跟count(1) 的结果一样,返回记录的总行数,都包括对NULL 的统计,
    count(column) 是不包括NULL 的统计。
    

    distinct

    select distinct(class)from student;/*去重复,出现所有不同的内容*/
    select count(distinct(class)) from student;
    

    其它

    LEFT(“123456789”,LEN(“数据库”))/*分两步运算,第一步是运算LEN函数,结果是3。第二步针对123456789这个字符从左边开始连续取三个数*/
    
    select top 100 * from student where no=11;/*显示前100行*/
    select isnull(name,'无') as name,age,class from student;/*isnull之后就无列名了 用as给列重命名*/
    select name,age,class,'the name is' + name as introduce from student;/*用加号形成一个自定义列*/
    

    7>SQL-92 规则

    是数据库的一个标准。以下代码 写在存储过程前面,表示遵从SQL-92 规则。
    SQL-92 标准要求在对空值进行等于 (=) 或不等于 (<) 比较时取值为 FALSE。

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    

    SET ANSI_NULLS ON
    即使 column_name 中包含空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。
    即使 column_name 中包含非空值,使用 WHERE column_name < NULL 的 SELECT 语句仍会返回零行。

    SET QUOTED_IDENTIFIER ON
    为ON:标识符可以由双引号分隔,而文字必须由单引号分隔。
    为OFF:标识符不可加引号。

    8>多层查询 EXISTS

    如果内层查询语句查询到符合条件的记录,就返回一个真值(true),否则,将返回
    一个假值(false)。

    SELECT * FROM employee
    WHERE EXISTS
    (SELECT d_name FROM department WHERE d_id=1003);
    

    同理还有:NOT EXISTS。

    9>关联查询、联结(JOIN)表

    关系数据库设计中表的设计是把信息分解成多个表,一类数据一个表,各表通过某些共同的值相互关联。
    一般情况下我们不建议建立外键这种强关联的关联信息。

    可伸缩(scale)
    能够适应不断增加的工作量而不失败。关系数据库的可伸缩性远远优于非关系数据库。

    注意:

    1. 联结的表越多效率越低。
    2. SQL本身不限制联结表的数目,但DBMS有最大数目限制。
    3. 一般情况下,联结查询比子查询快,实际应用中应该尝试两种方法看哪种快。
    JSON类型说明备注
    JOIN如果表中有至少一个匹配,则返回行INNER已省略。外联结比内联结返回的行数多(还包括没有关联的行)
    LEFT JOIN即使右表中没有匹配,也从左表返回所有的行OUTER已省略
    RIGHT JOIN即使左表中没有匹配,也从右表返回所有的行OUTER已省略
    FULL JOIN只要其中一个表中存在匹配,就返回行OUTER已省略

    luo_persons表:

    id_plast_namefirst_nameaddresscity

    luo_orders表:

    id_oorder_noid_p

    要求输出:谁订购了产品,并且他们订购了什么产品?

    ①联表查询(等值联结,equijoin)

    SELECT
    	a.last_name, a.first_name, b.order_no
    FROM
    	luo_persons a,
    	luo_orders b 
    WHERE
    	a.id_p = b.id_p	
    

    ②join查询(内联结,inner join, 推荐)

    /*(推荐)等值联结明确指定联结类型可转换为inner join

    SELECT
    	last_name,
    	first_name,
    	order_no 
    FROM
    	luo_persons
    	INNER JOIN luo_orders ON luo_persons.id_p = luo_orders.id_p
    

    ③union查询(复合查询、并查询)

    UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

    注意:

    1. UNION 内部的 SELECT 语句必须拥有相同数量的列、表达式或聚集函数。列也必须拥有相似的数据类型(可以不完全相同,但是可以互相转换)。同时,每条 SELECT 语句中的列的顺序必须相同。
    2. 默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
    3. UNION能组合的最大语句数目限制需要查询具体的DBMS文档。
    	select id_p from luo_persons 
    	union 
    	SELECT id_p from luo_orders
    

    某些DBMS中还支持其它类型的UNION:

    1. EXCEPT(或MINUS):检索在第一个表中存在而在第二个表中不存在的行;
    2. INTERSECT:检索两个表中都存在的行。

    4)数据更新

    ①数据插入

    i> insert

    insert into tableName(no,name) values'1','kate');
    --按表中列的顺序,但如果表结构发生了变化那么对应 sql也要改。不推荐
    insert into product values('001','001','N','N');
    

    有自增长主键(id)的插入:
    i>可以把id的值设置为null或者0,这样mysql会自己做处理
    ii>手动指定需要插入的列,不插入这一个字段的数据!

    ii> insert select

    将select结果插入表中,一般用于可重复执行的sql。
    注:
    1.insert select语句中,如果select返回多行,那么会insert多行数据。

    INSERT INTO "public"."vendors"("vend_name", "vend_id") select 'vend_name1', 1 
    WHERE NOT EXISTS (select 1  FROM "public"."vendors" WHERE vend_id = 1);
    

    iii> select into

    1. SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
    2. SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。
    3. select into 可以从多个表中检索数据,但只能插入到一个表中。

    函数里面,把一个查询出来的值存入临时变量:

    SELECT LastName,FirstName
    INTO _lName,_fName  FROM Persons
    

    也可以存入临时表中:

    SELECT *
    INTO Persons_backup
    FROM Persons
    

    ②数据修改

    update tableName set name = 'Tom' where name='kate';
    update tableName set age = age + 1;
    

    5)数据删除

    删除表中几行:

    DELETE FROM Person WHERE LastName = 'Wilson' 
    

    删除表中所有行,保留表、不释放空间。所删除的每行记录都会进日志,可以回滚。

    DELETE FROM table_name
    

    删除表:删除内容和定义,释放空间

    drop table user;    
    DROP TABLE IF EXISTS "public"."role_relation"; 可重复执行sql
    

    删除表中所有数据,保留表、同时释放空间(速度比delete快,但是无法撤回,日志里面只记录页释放):

    truncate table book;
    

    truncate是DDL语句(Data Definition,数据定义语句),相当于用重新定义一个新表的方法把原表的内容直接丢弃了,所以执行起来很快。delete语句是DML语句(Data Manipulation,数据操作语句),把数据一条一条的删除,所以删除多行数据执行较慢。

    6)其他注意

    ①加中括号

    列名、表名、存储过程名、函数名等都可以按需要加中括号。防止某些关键字在应用中引起歧义。

    select [select] from 表名;
    

    7)数据库授权

    ①授权GRANT

        GRANT <权限>
        ON <对象类型>  <对象名>
        TO <用户>
        [WITH GRANT OPTION]  // 如果指定了WITH GRANT OPTION子句,则获得某种权限的用户还可以把这种权限再授予其他用户,允许用户传递权限,但是不允许循环授权。
    

    举例:

    例1:把查询Student表的权限授给用户U1
    GRANT SELECT
    ON TABLE Student
    TO U1;
    
    例2:把全部操作权限授予用户U2和U3
    GRANT ALL PRIVILEGES
    ON TABLE Student,Course
    TO U2,U3;
    
    例3:把查询权限授予所有用户
    GRANT SELECT
    ON TABLE SC
    TO PUBLIC;
    

    ③权限的收回 REVOKE

    REVOKE <权限>
    ON <对象类型>  <对象名>
    FROM <用户>
    

    举例:

    例6:收回所有用户对表sc的查询权限
    REVOKE SELECT
    ON TABLE SC
    FROM PUBLIC;
    

    ③对用户模式的授权

    由DBA(数据库管理员,Database Administrator,简称DBA)在创建用户时实现。

    CREATE USER <username>
    [WITH] [DBA|RESOURCE|CONNECT]
    

    只有系统的超级用户才有权创建一个新的数据库用户
    新创建的用户有三种权限:DB,|RESOURCE,CONNECT

    ④数据库角色创建及授权

    CREATE ROLE <角色名>
    

    给角色授权:

    GRANT <权限>
    ON <对象类型>  对象名
    TO <角色>
    

    将一个角色授予其他的角色或用户

    GRANT <角色1>
    TO <角色3>
    [WITH ADMIN OPTION]//如果指定了WITH ADMIN OPTION 子句,则获得某种权限的角色或用户还可以把这种权限再授予其他角色
    

    角色权限的收回

    REVOKE <权限>
    ON <对象类型>  <对象名>
    FROM <角色>
    

    ⑤DENY 拒绝账户访问

    在安全系统中创建一项,以拒绝给当前数据库内的安全帐户授予权限并防止安全帐户通过其组或角色成员资格继承权限。

    DENY { ALL | statement [ ,...n ] }
    TO security_account [ ,...n ]
    

    和授权区别:
    不授权是没有权限,但是如果这个用户属于某个角色,这个角色有了权限,那么这个用户可以从角色继承这个权限。如果选择了deny,即使这个用户属于某个具有权限的角色,他也没有权限。

    8)数据类型

    ①uniqueidentifier

    可存储16字节的二进制值,其作用与全局唯一标记符(GUID)一样。GUID是唯一的二进制数:世界上的任何两台计算机都不会生成重复的GUID值。GUID主要用于在用于多个节点,多台计算机的网络中,分配必须具有唯一性的标识符。

    9)函数

    ①OBJECT_ID

    A. 返回指定对象的对象 ID

    USE master;
    GO
    SELECT OBJECT_ID(N'AdventureWorks.Production.WorkOrder') AS 'Object ID';
    GO
    

    B. 验证对象是否存在

    USE AdventureWorks;
    GO
    IF OBJECT_ID (N'dbo.AWBuildVersion', N'U') IS NOT NULL
    DROP TABLE dbo.AWBuildVersion;
    GO
    

    N是显式的将非unicode字符转成unicode字符,它来自 SQL-92 标准中的 National(Unicode)数据类型,用于扩展和标准化,在这里可以不用,写作object_id(PerPersonData)。

    10)SQL中的借书经典案例

    ①问题描述

    本题用到下面三个关系表:
    CARD 借书卡。 CNO 卡号,NAME 姓名,CLASS 班级
    BOOKS 图书。 BNO 书号,BNAME 书名, AUTHOR 作者,PRICE 单价,QUANTITY 库存册数
    BORROW 借书记录。 CNO 借书卡号,BNO 书号,RDATE 还书日期

    备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。

    要求1. 写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束。

    CREATE TABLE BORROW(
        CNO int FOREIGN KEY REFERENCES CARD(CNO),
        BNO int FOREIGN KEY REFERENCES BOOKS(BNO),
        RDATE datetime,
        PRIMARY KEY(CNO,BNO)) 
    

    要求2. 找出借书超过5本的读者,输出借书卡号及所借图书册数。

    SELECT CNO,借图书册数=COUNT(*)
    FROM BORROW
    GROUP BY CNO
    HAVING COUNT(*)>5
    

    要求3. 查询借阅了"水浒"一书的读者,输出姓名及班级

    CARD 借书卡。 CNO 卡号,NAME 姓名,CLASS 班级
    BOOKS 图书。 BNO 书号,BNAME 书名, AUTHOR 作者,PRICE 单价,QUANTITY 库存册数
    BORROW 借书记录。 CNO 借书卡号,BNO 书号,RDATE 还书日期

    SELECT * FROM CARD c
    WHERE EXISTS(
        SELECT * FROM BORROW a,BOOKS b 
        WHERE a.BNO=b.BNO
            AND b.BNAME=N'水浒'
            AND a.CNO=c.CNO) 
    

    要求4. 查询过期未还图书,输出借阅者(卡号)、书号及还书日期。

    SELECT * FROM BORROW 
    WHERE RDATE<GETDATE() 
    

    要求5. 查询书名包括"网络"关键词的图书,输出书号、书名、作者。

    SELECT BNO,BNAME,AUTHOR FROM BOOKS
    WHERE BNAME LIKE N'%网络%' 
    

    N’string’ 表示string是个Unicode字符串

    要求6. 查询现有图书中价格最高的图书,输出书名及作者。

    SELECT BNO,BNAME,AUTHOR FROM BOOKS
    WHERE PRICE=(
        SELECT MAX(PRICE) FROM BOOKS) 
    

    要求7. 查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出。

    SELECT a.CNO
    FROM BORROW a,BOOKS b
    WHERE a.BNO=b.BNO AND b.BNAME=N'计算方法'
        AND NOT EXISTS(
            SELECT * FROM BORROW aa,BOOKS bb
            WHERE aa.BNO=bb.BNO
                AND bb.BNAME=N'计算方法习题集'
                AND aa.CNO=a.CNO)
    ORDER BY a.CNO DESC 
    

    要求8. 将"C01"班同学所借图书的还期都延长一周。

    UPDATE b SET RDATE=DATEADD(Day,7,b.RDATE)
    FROM CARD a,BORROW b
    WHERE a.CNO=b.CNO
        AND a.CLASS=N'C01' 
    
    DATEADD(datepart,number,date)  
    date 参数是合法的日期表达式。number 是您希望添加的间隔数;对于未来的时间,此数是正数,对于过去的时间,此数是负数。
    

    要求9. 从BOOKS表中删除当前无人借阅的图书记录。

    DELETE FROM BOOKS a
    WHERE NOT EXISTS(
        SELECT * FROM BORROW
        WHERE BNO=a.BNO) 
    

    要求11.在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是"数据库技术及应用",就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)。

    CREATE TRIGGER TR_SAVE ON BORROW
    FOR INSERT,UPDATE
    AS
    IF @@ROWCOUNT>0
    INSERT BORROW_SAVE SELECT i.*
    FROM INSERTED i,BOOKS b
    WHERE i.BNO=b.BNO
        AND b.BNAME=N'数据库技术及应用' 
    

    要求13.查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出。

    SELECT a.CNO
    FROM BORROW a,BOOKS b
    WHERE a.BNO=b.BNO
        AND b.BNAME IN(N'计算方法',N'组合数学')
    GROUP BY a.CNO
    HAVING COUNT(*)=2
    ORDER BY a.CNO DESC
    

    5,索引

    6,关系运算

    1)集合运算符

    并(∪)、差(-)、交(∩)、笛卡尔积(×)

    笛卡尔积(直积):表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。
    例如,A={a,b}, B={0,1,2},则
    A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}
    

    2)专门的关系运算符

    ①选择(限制、σ)

    在关系R中选择满足给定条件的诸元组。

    ②投影(π)

    关系R上的投影是从R中选择出若干属性列组成新的关系。
    这里写图片描述
    投影之后可既改变行,又改变元组的数量。

    ③连接(θ连接、⋈)

    从两个关系的笛卡尔积中选取属性间满足一定条件的元组。(连接由乘积(笛卡尔积)、选择、投影组成)
    分为等值连接(=)、自然连接(要求比较的分量是相同的属性组,并在结果中把重复的属性列去掉)。
    这里写图片描述

    ④除运算(➗)

    RS÷S的意义就是:“在R和S的联系RS中,找出与S中所有的元组有关系的R元组”。

    3)算术比较符

    4)逻辑运算符

    非与或

    7,数据库完整性

    1)实体完整性

    主键唯一且不为空。

    2)参照完整性

    不允许修改外码
    级连操作:当删除或修改被参照表时,同时删除或修改参照表中的不一致元祖。

    3)用户定义的完整性

    4)触发器(Trigger)

    是用户定义在关系表上的一类由事件驱动的特殊过程。一旦定义,任何用户对标的增删改操作均由服务器自动激活相应触发器,在DBMS核心层进行集中的完整性控制。

    8,存储过程(Stored Procedure)

    1)概念

    存储过程是一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

    2)优点

    ①执行效率高

    存储过程因为SQL 语句已经预编译过了,因此运行的速度比较快。

    ②降低了客户机和服务器之间的通信

    存储过程在服务器端运行,减少客户端的压力。
    减少网络流量,客户端调用存储过程只需要传存储过程名和相关参数即可,与传输SQL 语句相比自然数据量少了很多。

    ③方便实施企业规则(提高了可维护性、安全性)

    可以把企业规则的运算程序写成存储过程放入数据库服务器中,由RDBMS管理,既有利于集中控制,又能够方便地进行维护。
    当用户规则发生变化时,只要修改存储过程,无须修改其他应用程序。

    允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次,类似方法的复用。
    增强了使用的安全性,充分利用系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。程序员直接调用存储过程,根本不知道表结构是什么,有什么字段,没有直接暴露表名以及字段名给程序员。

    ④安全性高

    可设定只有某些用户才具有对指定存储过程的使用权。

    3)缺点

    调试麻烦(至少没有像开发程序那样容易),可移植性不灵活(因为存储过程是依赖于具体的数据库)。

    4)场景

    当一个事务涉及到多个SQL语句时或者涉及到对多个表的操作时就要考虑用存储过程;
    当在一个事务的完成需要很复杂的商业逻辑时(比如,对多个数据的操作,对多个状态的判断更改等)要考虑;还有就是比较复杂的统计和汇总也要考虑,但是过多的使用存储过程会降低系统的移植性。

    sql尽量放在存储过程中。
    面对大量数据,用orcle比sql server稳定。

    5)代码

    ①创建

    use test1
    set ansi_nulls on
    go
    set quoted_identifier on
    go
    create procedure procedure_student
    	-- add the parameters for the stored procedure here
    	@gradeid int,
    	@gradename varchar(10) --传入的参数
    as
    begin
    	--计算内容
    end
    go
    

    ②执行

    exec dbo.procedure_student 1,'g'
    

    9,数据库恢复技术

    1)事务

    10,并发控制

    为了保证事务的隔离性和一致性,DBMS需要对并发操作进行正确调度。

    1)并发操作带来的数据不一致性

    ①更新丢失

    ②读“脏”数据

    事务T1修改数据,T2读取数据,T1由于某种原因被撤销,则数据修改回原值,但T2读取的数据是之前修改的数据,即脏数据、不正确的数据。

    ③不可重复读

    事务T1读数据后,T2修改了数据,T1无法再现上一次读取的结果。

    ④幻读

    事务T1读数据后,T2新增或者删除了数据,T1无法再现上一次读取的结果。

    2)并发控制技术

    悲观锁:封锁
    乐观锁:版本号、时间戳

    3)封锁分类(悲观锁)

    ①共享锁(S锁、读锁)

    (读取)操作创建的锁。其他用户可以并发读取数据,但任何事物都不能获取数据上的排它锁,直到已释放所有共享锁。
    若事务T对数据对象A加上S锁,则事务T只能读A;其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

    ②排它锁(X锁、写锁,eXclusive lock)

    若事物T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。它防止任何其它事务获取资源上的锁,直到在事务的末尾将资源上的原始锁释放为止。

    ③更新锁(U锁)

    用来预定要对此页施加X锁,它允许其他事务读,但不允许再施加U锁或X锁;当被读取的页将要被更新时,则升级为X锁;U锁一直到事务结束时才能被释放。

    4)封锁问题

    ①活锁

    i>饥饿

    考虑一台打印机分配的例子,当有多个进程需要打印文件时,系统按照短文件优先的策略排序,该策略具有平均等待时间短的优点,似乎非常合理,但当短文件打印任务源源不断时,长文件的打印任务将被无限期地推迟,导致饥饿以至饿死。

    ii>活锁概念

    与饥饿相关的另外一个概念称为活锁,在忙式等待条件下发生的饥饿,称为活锁。

    a)忙式等待:不进入等待状态的等待。
    b)阻塞式等待:进程得不到共享资源时将进入阻塞状态,让出CPU 给其他进程使用。
    c)忙等待和阻塞式等待的相同之处:
    在于进程都不具备继续向前推进的条件,不同之处在于处于忙等待的进程不主动放弃CPU,尽管CPU 可能被剥夺,因而是低效的;而处于阻塞状态的进程主动放弃CPU ,因而是高效的。

    iii>举例

    事务T1请求封锁R,T2请求封锁R,T3请求封锁R……
    T1释放R之后,系统批准了T3的请求,然后是T4……请求,T2可能永远等待下去。(在整个过程中,事务T2 在不断的重复尝试获取锁R)。

    iv>与死锁区别

    活锁的时候,进程是不会阻塞的,这会导致耗尽CPU 资源,这是与死锁最明显的区别。
    处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有一定几率解开,而死锁是无法解开的。

    v>避免方式

    采用先来先服务策略。

    ②死锁

    i>概念

    是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去,此时称系统处于死锁状态或系统产生了死锁。

    ii>举例

    T1请求封锁R1,T2请求封锁R2,然后T1又请求封锁R2,T1一直等待T2释放R2,此时,T2请求封锁R1,T2将一直等待T1释放R1。

    iii>死锁原因

    在数据库中,产生死锁的原因主要是:
    两个或多个事务都已封锁了一些数据对象,然后又都请求其他事务已封锁的数据对象,从而出现死等待。

    产生死锁的四个必要条件:
    (1) 互斥条件:一个资源每次只能被一个进程使用。
    (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
    (3) 不可剥夺条件: 进程已获得的资源,在末使用完之前,不能强行剥夺。
    (4) 环路等待条件: 若干进程之间形成一种头尾相接的循环等待资源关系。
    只要系统发生了死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死
    锁。

    iv>死锁预防

    预防死锁的发生只需破坏死锁产生的四个必要条件之一即可。

    1. 破坏互斥条件
      如果允许系统资源都能共享使用,则系统不会进入死锁状态。但有些资源根本不能同时访问,如打印机等临界资源只能互斥使用。所以,破坏互斥条件而预防死锁的方法不太可行,而且在有的场合应该保护这种互斥性。
    2. 破坏不剥夺条件
      当一个已保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。这意味着,一个进程已占有的资源会被暂时释放,或者说是被剥夺了,或从而破坏了不可剥夺条件。
      该策略实现起来比较复杂,释放已获得的资源可能造成前一阶段工作的失效,反复地申请和释放资源会增加系统开销,降低系统吞吐量。这种方法常用于状态易于保存和恢复的资源,如CPU 的寄存器及内存资源,一般不能用于打印机之类的资源。
    3. 破坏请求和保持条件
      釆用预先静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不把它投入运行。一旦投入运行后,这些资源就一直归它所有,也不再提出其他资源请求,这样就可以保证系统不会发生死锁。
      这种方式实现简单,但缺点也显而易见,系统资源被严重浪费,其中有些资源可能仅在运行初期或运行快结束时才使用,甚至根本不使用。而且还会导致“饥饿”现象,当由于个别资源长期被其他进程占用时,将致使等待该资源的进程迟迟不能开始运行。
    4. 破坏环路等待条件
      为了破坏循环等待条件,可釆用顺序资源分配法。首先给系统中的资源编号,规定每个进程,必须按编号递增的顺序请求资源,同类资源一次申请完。也就是说,只要进程提出申请分配资源Ri,则该进程在以后的资源申请中,只能申请编号大于Ri 的资源。
      这种方法存在的问题是,编号必须相对稳定,这就限制了新类型设备的增加;尽管在为资源编号时已考虑到大多数作业实际使用这些资源的顺序,但也经常会发生作业使甩资源的顺序与系统规定顺序不同的情况,造成资源的浪费;此外,这种按规定次序申请资源的方法,也必然会给用户的编程带来麻烦。

    都不好用,一般采用死锁的诊断和解除。

    v>死锁的诊断和解除

    a)超时法
    如果一个事务等待时间超时,则认为发生死锁。(可能误判)
    b)事务等待图法
    事务等待图是一个有向图,反映了事务的等待情况。如果图中出现回路,就表示出现了死锁。

    处理方案是:选择一个处理代价最小的事务,将其撤销并释放所有锁。
    a) 从死锁进程处剥夺资源
    b) 终止部分或全部进程

    5) 两段锁协议(Two-Phase Locking――2PL)

    两段锁协议规定所有的事务应遵守的规则:
    ① 在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁。
    ② 在释放一个封锁之后,事务不再申请和获得其它任何封锁。
    即事务的执行分为两个阶段:
    第一阶段是获得封锁的阶段,称为扩展阶段。
    第二阶段是释放封锁的阶段,称为收缩阶段。

    定理:若所有事务均遵守两段锁协议,则这些事务的所有交叉调度都是可串行化的。
    对于遵守两段协议的事务,其交叉并发操作的执行结果一定是正确的。值得注意的是,上述定理是充分条件,不是必要条件。一个可串行化的并发调度的所有事务并不一定都符合两段锁协议,存在不全是2PL的事务的可串行化的并发调度。
    同时我们必须指出,遵循两段锁协议的事务有可能发生死锁。

    此时事务T1 、T2同时处于扩展阶段,两个事务都坚持请求加锁对方已经占有的数据,导致死锁。
    为此,又有了一次封锁法。一次封锁法要求事务必须一次性将所有要使用的数据全部加锁,否则就不能继续执行。因此,一次封锁法遵守两段锁协议,但两段锁并不要求事务必须一次性将所有要使用的数据全部加锁,这一点与一次性封锁不同,这就是遵守两段锁协议仍可能发生死锁的原因所在。

    11,常见图

    DFD 数据流图(Data Flow Diagram):
    这里写图片描述
    ER图 实体-联系图(Entity-Relationship Diagram)
    这里写图片描述

    12,数据库连接:JDBC与JdbcTemplate

    13,数据库安全

    1)SQL注入

    ①概念

    在SQL 语句在拼接的情况下,用户输入为一部分sql语句。

    ②解决方法

    i> 对特殊字符进行过滤、转义或者使用预编译的sql 语句绑定变量

    SQL执行时,2种方式:
    ①字符串处理(拼接),然后执行SQL
    用户输入的时候,可以通过输入sql语句来进行SQL注入。
    ②传参,执行SQL -->交给SQL引擎**(推荐)**
    用prepareStatement,参数用set 方法进行填装。

    String sql= "insert into userlogin values(?,?)";
    PreparedStatement ps=conn.prepareStatement(sql);
    for(int i=1;i<100;i++){
    ps.setInt(1, i);
    ps.setInt(2, 8888);
    ps.executeUpdate();
    ps.close();
    conn.close();
    

    ii> 当sql 语句运行出错时,不要把数据库返回的错误信息全部显示给用户,以防止泄漏服务器和数据库相关信息

    iii>检查变量的数据类型和格式

    只要是有固定格式的变量,在SQL 语句执行前,应该严格按照固定格式去检查,确保变量是我们预想的格式,这样很大程度上可以避免SQL 注入攻击。
    例如:对于where id={$id}这种形式,数据库里所有的id 都是数字,那么就应该在SQL 被执行前,检查确保变量id 是int 类型。

    iv>所有的SQL 语句都封装在存储过程中

    所有的SQL 语句都封装在存储过程中,这样不但可以避免SQL 注入,还能提高一些性能。

    14,分布式数据库

    1)概念

    分布式数据库是一个物理上分散的而逻辑上集中的数据集。
    它有三大特点: 数据分布性 逻辑关联性 站点自治性

    2)五个基本原则

    ①资源的重复性
    指分布式系统中硬件,软件以及数据的冗余配置。
    ②物理上的分布性
    从硬件,软件以及数据上看都是相互独立地分布。
    ③高层操作系统(或者分布式操作系统)
    高层操作系统负责对分布性的资源进行统一的控制,它使一个简单的硬件堆积转变为一个统一协调的工作系统。
    ④系统的透明性
    透明性是分布式系统的灵魂,实现不同层次的透明性是分布式系统必须解决的关键问题之一。
    ⑤协作的自治性
    每一节点都是一个完整的处理系统,同时又是合作的。 简而言之:分布式系统是一个多节点的,处理或数据分布的,在统一下提高综合处理能力的协作体。

    3)待解决问题

    不完整系统状态信息
    时间延迟
    通信的代价
    负载均衡

    4)分类(从控制方式角度)

    ①紧耦合式DDBMS

    全局控制信息放在一个称为中心站点的站点上。所有的全局访问都必须通过中心站点来确定远程数据片的位置。
    优点:容易实现数据的一致性和完整性。
    缺点:易产生访问瓶颈,系统效率不高,可靠性较差。

    ②联邦式DDBMS

    每个站点都包含全局控制信息的一个副本,都可以接受全局访问。任何对远程数据的请求,都可以通过广播方式传播到其他节点。
    优点:具有较好的可靠性和可用性,并行性好,更容易适应旧有的系统集成和异构分布式数据库系统的建立。
    缺点:保持数据的一致性很困难,实现难度大。

    ③组合式DDBMS

    是上述方案的折衷,它把站点分为两类,一类具有全局控制信息,称为主节点,可以接受全局任务,另一类没有全局信息,只能为主节点提供数据服务。
    优点:灵活性较好,易于实现层次控制结构。
    缺点:设计复杂。

    5)分布透明性

    即在分布式数据库系统中用户不必关心数据的分布情况。分为三个层次:

    ①分片透明性

    它是分布式数据库系统的最高透明性层次,它向用户完全屏蔽了DDB的分片信息。这样的透明性保持了高水平的数据独立性。

    ②位置透明性

    用户的应用程序不需要关心数据分片的具体存储站点,当数据库的数据片的存储站点发生改变时,只需改变对应的GRS/NRS映射就可以保持全局表示模式不发生改变

    ③数据模型透明性

    它向用户屏蔽的只是本站点的具体数据库存储及其管理情况。 在异构的情况下,这种透明性避免了用户对不同数据模型的转换的实现。
    本地透明性是3种透明方式中最低的。

    6)数据分割方法

    ①水平分割

    把全局关系的元组分割成一些子集,这些子集被称为数据分片或段(Fragment)。
    水平分割可以通过关系运算“选择”来定义。

    水平分片是对全局关系执行“选择”操作,把具有相同性质的元组进行分组,构成若干个不相交的子集.水平分片的方法可归为初级分片和导出分片两类。

    ②垂直分割

    把全局关系按照属性组(纵向)分隔成一些数据分片或段。
    垂直分割可以通过关系运算“投影”来定义。

    ③混合分割

    可把水平分割和垂直分割这两种方法结合起来使用,产生混合式数据分片。

    ④数据分片应遵循的原则

    若R={R1,R2,…,Rn}满足:
    1)完整性(completeness)条件:
    如果分片 a∈R,则必有a∈Ri,i=l,2,…,n
    2)可重构(reconstructed)条件:
    R=∪ Ri,(水平分片)或R=∞Ri,(垂直分片)
    3)不相交(disjoint)条件:
    Ri∩ Rj=φ,i≠j,I,j:=1,2,…,,n(水平 分片)
    Ri∩Rj=主键属性,I,j=1,2,…,n(垂直分片)

    7)分布式数据库和集中式区别

    分布式(distributed)是指在多台不同的服务器中部署不同的服务模块,通过远程调用协同工作,对外提供服务。
    集群(cluster)是指在多台不同的服务器中部署相同应用或服务模块,构成一个集群,通过负载均衡设备对外提供服务。

    15,数据库优化

    1)优化SQL 语句

    ①explain

    通过explain(查询优化神器)用来查看SQL 语句的执行效果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。
    通常我们可以对比较复杂的尤其是涉及到多表的SELECT 语句,把关键字EXPLAIN 加到前面,查看执行计划。例如:explain select * from news;

    explain语法:

    explain select … from … [where ...] 
    

    ② 用具体的字段列表代替“*

    任何地方都不要使用select * from t ,不要返回用不到的任何字段。

    ③ 不在索引列做运算或者使用函数

    ④ 查询尽可能使用limit 减少返回的行数,减少数据传输时间和带宽浪费。

    2)优化表的数据类型

    ① 使用procedure analyse()函数对表进行分析

    该函数可以对表中列的数据类型提出优化建议。能小就用小。表数据类型第一个原则是:使用能正确的表示和存储数据的最短类型。这样可以减少对磁盘空间、内存、cpu 缓存的使用。
    使用方法:select * from 表名procedure analyse();

    ② 对表进行拆分

    通过拆分表可以提高表的访问效率。有2 种拆分方法:
    1.垂直拆分
    把主键和一些列放在一个表中,然后把主键和另外的列放在另一个表中。如果一个表中某些列常用,而另外一些不常用,则可以采用垂直拆分。
    2.水平拆分
    根据一列或者多列数据的值把数据行放到二个独立的表中。

    ③ 使用中间表来提高查询速度

    创建中间表,表结构和源表结构完全相同,转移要统计的数据到中间表,然后在中间表上进行统计,得出想要的结果。

    3)硬件优化

    ①CPU 的优化

    选择多核和主频高的CPU。

    ②内存的优化

    使用更大的内存。将尽量多的内存分配给MYSQL 做缓存。

    ③磁盘I/O 的优化

    i>使用磁盘阵列

    RAID 0 没有数据冗余,没有数据校验的磁盘陈列。实现RAID 0至少需要两块以上的硬盘,它将两块以上的硬盘合并成一块,数据连续地分割在每块盘上。
    RAID1 是将一个两块硬盘所构成RAID 磁盘阵列,其容量仅等于一块硬盘的容量,因为另一块只是当作数据“镜像”。
    使用RAID-0+1 磁盘阵列。RAID 0+1 是RAID 0 和RAID 1 的组合形式。它在提供与RAID 1 一样的数据安全保障的同时,也提供了与RAID 0 近似的存储性能。

    ii>调整磁盘调度算法

    选择合适的磁盘调度算法,可以减少磁盘的寻道时间。

    4)MySQL 自身的优化

    对MySQL 自身的优化主要是对其配置文件my.cnf 中的各项参数进行优化调整。如指定MySQL 查询缓冲区的大小,指定MySQL 允许的最大连接进程数等。

    5)应用优化

    ①使用数据库连接池

    ②使用查询缓存

    它的作用是存储select 查询的文本及其相应结果。如果随后收到一个相同的查询,服务器会从查询缓存中直接得到查询结果。查询缓存适用的对象是更新不频繁的表,当表中数据更改后,查询缓存中的相关条目就会被清空。

    6)大访问量的优化

    ①使用优化查询的方法

    (见上面)

    ②主从复制,读写分离

    i>主从复制(master,slave):

    通过配置两台(或多台)数据库的主从关系,可以将一台数据库服务器的数据更新同步到另一台服务器上。网站可以利用数据库的这一功能,实现数据库的读写分离,从而改善数据库的负载压力。一个系统的读操作远远多于写操作,因此写操作发向master,读操作发向slaves 进行操作(简单的轮循算法来决定使用哪个slave)。
    利用数据库的读写分离,Web 服务器在写数据的时候,访问主数据库(Master),主数据库通过主从复制机制将数据更新同步到从数据库(Slave),这样当Web 服务器读数据的时候,就可以通过从数据库获得数据。这一方案使得在大量读操作的Web 应用可以轻松地读取数据,而主数据库也只会承受少量的写入操作,还可以实现数据热备份,可谓是一举两得的方案。
    这里写图片描述

    负载均衡(Load Balance,简称LB)

    7)数据库分表、分区、分库

    分表见上面描述。
    分区就是把一张表的数据分成多个区块,这些区块可以在一个磁盘上,也可以在不同的磁盘上,分区后,表面上还是一张表,但数据散列在多个位置,这样一来,多块硬盘同时处理不同的请求,从而提高磁盘I/O 读写性能,实现比较简单。包括水平分区和垂直分区。
    分库是根据业务不同把相关的表切分到不同的数据库中,比如web、bbs、blog 等库。

    17,应用

    1)服务器与服务器之间传输文件夹下的文件,一个文件夹下有10 个文件,另一个文件夹下有100 个文件,两个文件夹大小相等,问,哪个传输更快?

    10 个文件更快。
    1)建立连接数更少,建立连接的开销比传输文件的开销大。
    2)文件写入磁盘,要计算文件的起始位置,文件数目少的话,这个开销就小了

    展开全文
  • 数据库面试题

    千次阅读 多人点赞 2018-05-24 10:46:20
    数据库面试题 1.什么是存储过程?用什么来调用? 存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯...

     

    数据库面试题

    1.什么是存储过程?用什么来调用?

    存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。

    调用:   1)可以用一个命令对象来调用存储过程。

    2)可以供外部程序调用,比如:java程序。

     

    2.存储过程的优缺点?

    优点:

    1)存储过程是预编译过的,执行效率高。

    2)存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。

    3)安全性高,执行存储过程需要有一定权限的用户。

    4)存储过程可以重复使用,可减少数据库开发人员的工作量。

    缺点:移植性差

     

    3.存储过程与函数的区别

    存储过程

    函数

    用于在数据库中完成特定的操作或者任务(如插入、删除等)

    用于特定的数据(如选择)

    程序头部声明用procedure

    程序头部声明用function

    程序头部声明时不需描述返回类型

    程序头部声明时要描述返回类型,而且PL/SQL块中至少要包括一个有效的return语句

    可以使用in/out/in out 三种模式的参数

    可以使用in/out/in out 三种模式的参数

    可作为一个独立的PL/SQL语句来执行

    不能独立执行,必须作为表达式的一部分调用

    可以通过out/in out 返回零个或多个值

    通过return语句返回一个值,且改值要与声明部分一致,也可以是通过out类型的参数带出的变量

    SQL语句(DML SELECT)中不可调用存储过程

    SQL语句(DML SELECT)中可以调用函数

    4.索引的作用?和它的优点缺点是什么?

    索引就一种特殊的查询表,数据库的搜索可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。

     

    5.视图的优缺点

    优点:   1)对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。

    2)用户通过简单的查询可以从复杂查询中得到结果。

    3)维护数据的独立性,试图可从多个表检索数据。

    4)对于相同的数据可产生不同的视图。

    缺点:性能:查询视图时,必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,那么就无法更改数据

    6.在数据库中查询语句速度很慢,如何优化?

    1.建索引

    2.减少表之间的关联

    3.优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面

    4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据 5.尽量用PreparedStatement来查询,不要用Statement

     

    7.Oracle和Mysql的区别?

    1)库函数不同。

    2Oracle是用表空间来管理的,Mysql不是。

    3)显示当前所有的表、用户、改变连接用户、显示当前连接用户、执行外部脚本的语句的不同。

    4)分页查询时候时候,mysqllimit oraclerownum

    mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15 //为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1 mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last. //如果只给定一个参数,它表示返回最大的记录行数目: mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行 //换句话说,LIMIT n 等价于 LIMIT 0,n

    5sql的语法的不同。

     

    8.oracle分页查询语句

    使用rownum,两种如下:

    第一种: select * from (selectt.*,rownum row_num from mytable t) b where b.row_num between 1 and 10

    第二种: select * from (select a.*, rownum rn from mytable a where rownum <= 10 ) where rn >= 1 使用rowid如下: select * from scott.emp where rowid in (select rd from(select rowid as rd ,rownum as rn from scott.emp ) where rn<=6 and rn>3)

     

    9.从数据库中随机取50条

    select * from (select * from t_example orderby dbms_random.random) where rownum <= 50

     

    10.表和视图的关系

    视图其实就是一条查询sql语句,用于显示一个或多个表或其他视图中的相关数据。表就是关系数据库中实际存储数据用的。

     

    11.oracle获取系统时间

    select to_char(sysdate, 'yyyy-MM-ddHH24:mi:ss') from dual;

     

    12.什么是事物,事物的特性是什么

    事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。

    事务性质:

    原子性:原子性。即不可分割性,事务要么全部被执行,要么就全部不被执行。

                 一致性:事务的执行使得数据库从一种正确状态转换成另一种正确状态

                 隔离性:在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务

    持久性:事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有其他故障,事务的处理结果也会得到保存。

     

     

    13.什么是死锁,死锁如何处理:

    事务循环等待数据锁,则会死锁。

    死锁处理:预防死锁协议,死锁恢复机制

     

    14.存储过程有什么优点

    1.存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快。

    2. 可保证数据的安全性和完整性。通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。

    3.可以降低网络的通信量。存储过程主要是在服务器上运行,减少对客户机的压力。

    4:存储过程可以接受参数、输出参数、返回单个或多个结果集以及返回值。可以向程序返回错误原因

    5:存储过程可以包含程序流、逻辑以及对数据库的查询。同时可以实体封装和隐藏了数据逻辑。  

    15.内联接,外联接区别?

    内连接是保证两个表中所有的行都要满足连接条件,而外连接则不然。

    在外连接中,某些不满条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另一个表的行。分左连接、右连接、全连接三种

    16.什么是内存泄漏?

    一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。

    17.什么叫视图?游标是什么?

    视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

          游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

     

    18.使用索引查询一定能提高查询的性能吗?为什么

    通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价.

    索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O. 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGESCAN)适用于两种情况:

    基于一个范围的检索,一般查询返回结果集小于表中记录数的30%

    基于非唯一性索引的检索

     

    19.简单说一说drop、delete与truncate的区别

    SQL中的dropdeletetruncate都表示删除,但是三者有一些差别

    deletetruncate只删除表的数据不删除表的结构

    速度,一般来说: drop> truncate >delete 

    delete语句是dml,这个操作会放到rollback segement,事务提交之后才生效;

    如果有相应的trigger,执行的时候将被触发. truncate,dropddl, 操作立即生效,原数据不放到rollback segment,不能回滚. 操作不触发trigger. 

    20.drop、delete与truncate分别在什么场景之下使用?

    不再需要一张表的时候,用drop

    想删除部分数据行时候,用delete,并且带上where子句

    保留表而删除所有数据的时候用truncate

    21. 说一说三个范式。

    第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。

    第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。

    第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A B C"的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:关键字段非关键字段 x 非关键字段y

     

     

    展开全文
  • MySQL是一个小巧的多用户、多线程SQL数据库服务器。MySQ是以客户机/服务器结构来实现的,它由一个服务器守护进程和客户...二、创建数据库(两种方式:使用MySQL命令行管理工具、使用Navicat for MySQL) 三、在Pyth...

           MySQL是一个小巧的多用户、多线程SQL数据库服务器。MySQ是以客户机/服务器结构来实现的,它由一个服务器守护进程和客户程序组成。在Python中,可以使用pymysql模块连接到数据库,对MySQL数据库进行操作。

    本文内容:

    一、安装MySQL(安装过程)

    二、创建数据库(两种方式:使用MySQL命令行管理工具、使用Navicat for MySQL)

    三、在Python中使用MySQL数据库(安装pymysql、撰写代码)


    一、安装MySQL

    step1:进入MySQL官方网站下载Windows版本的安装程序(mysql-5.5.62-win32.msi),下载后点击程序进行安装

    下载地址:https://dev.mysql.com/downloads/mysql/5.5.html#downloads

           

    step2:点击Next --》接受勾上--》点击Next--》选择自定义安装

          

    step3:更改路径--》安装--》完成   (安装完成,接下来进入设置界面)

         

     

    step4:点击NEXT--》选择Standard Configuration--》选中Include Bin...(将MySQL添加到PATH环境变量中)

         

     

    step5:设置密码(123456),该密码将在连接数据库时使用

         

    二、创建数据库

    1、使用MySQL命令行管理工具

    step1、打开MySQL命令管理工具

         

    step2、 运行程序后,输入密码(123456),按下回车后将出现如下界面

         

    step3、输入以下命令,创建一个名为pydata的数据库

        

    step4、输入以下命令,使用刚刚创建的数据库

        

    step5、输入以下命令,在该数据库下创建名为people的表,表中包含name、age、sex

       

    step6、输入以下命令,向表中添加数据

       

    step7、输入以下命令,查看所建的表中内容

       

     

    2、使用Navicat for MySQL

            Navicat for MySQL 使用了极好的图形用户界面(GUI),可以用一种安全和更为容易的方式快速和容易地创建、组织、存取和共享信息。 用户可完全控制 MySQL 数据库和显示不同的管理资料,包括一个多功能的图形化管理用户和访问权限的管理工具,方便将数据从一个数据库转移到另一个数据库中,进行档案备份。 Navicat for MySQL支持 Unicode,以及本地或远程 MySQL 服务器多连线,用户可浏览数据库、建立和删除数据库、编辑数据、建立或执行 SQL queries、管理用户权限(安全设定)、将数据库备份/复原、汇入/汇出数据(支援 CSV, TXT, DBF 和 XML 档案种类)等。软件与任何 MySQL 5.0.x 伺服器版本兼容,支援 Triggers,以及 BINARY VARBINARY/BIT 数据种类等的规范。使用方法如下:

    step1、点击连接,选择MySQL

                

    step2、填写连接名、密码后点击确认

               

    step3、接下入就可以查看刚刚使用命令行创建的数据库了

              

    三、在Python中使用MySQL数据库

    PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。

    1、在PyCharm中安装pymysql流程如下:

    step1、点击File-->选择Setting for New...

                      

    step2、点击Project Interpreter-->选择使用的工程-->点击右上方的“+”

                     

    step3、在搜索框中搜索PyMySQL--->点击Install Package

                    

    2、撰写代码:

    Connection:创建了Python客户端与数据库之间的网络通路。

    参数如下:

    Connection支持的方法:

    Cursor:游标对象,用于执行查询和获取结果

    支持的方法如下:

    import pymysql
    
    db = pymysql.connect(host="localhost",      # 连接到数据库,服务器为本机
                         user="root",           # 用户名
                         passwd="123456",       # 密码
                         db="pydata")           # 数据库名
    cursor = db.cursor()                        # 获得数据库游标
    r = cursor.execute('select * from people')  # 执行SQL语句,获取记录
    data = cursor.fetchall()     # 获取数据
    
    print(data)  # 输出数据
    
    cursor.close()               # 关闭游标
    db.close()                   # 关闭数据库连接
    

    执行结果如下:

     

     

    展开全文
  • Oracle数据库错误代码大全总结

    千次阅读 2018-09-03 14:03:38
    ORACLE数据库错误代码大全总结 ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: ...
  • 数据库试题解答说明书-2-1-3 《银行信贷管理系统》客户管理模块例题解析,创建数据库与建表、简单的查询语句的讲解与注释,包括数据操作的语句与截图。
  • 在长时间使用 Google 和必应进行搜索并测试各种想法后,我创建了下列代码片段,用于列出目标数据库中的所有存储过程和函数: "List Stored Procedures" : {   "prefix" : "sqlListStoredProcedures" ,   ...
  • **使用python语言创建数据库并且向里面插入信息**一、Navicat的准备二、Python代码创建和插入数据表三、返回查看Navicat四、拓展--运用面向对象程序设计方法 一、Navicat的准备 1、先建立navicat与本地mysql服务器的...
  • 用SQL语句创建数据库和表

    万次阅读 2016-06-10 20:32:14
    --------创建数据库 ----use master ----GO ----IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = 'test1') ----DROP DATABASE test1 ----GO ----CREATE DATABASE test1 ------创建教师表 --...
  • 1.首先打开【navicat】,在菜单栏中选择【文件】-->...4.首先创建数据库,命令为:CREATE DATABASE ; 5.然后右击刚才创建的连接,选择【刷新】,就可以看到我们刚刚创建的数据库;(有时候需要重启navicat软件才
  • 创建银行数据库(database 第5版)

    千次阅读 2019-05-31 21:11:24
    建立表的代码(1)建立数据库(2)表branch(3)表account(4)customer表(5)depositor表(6)loan表(7)borrower表 一、建立数据库 1.六个表的内容 第2章2-3 branch表 第2章图2-1 account表 第2章图2-4 ...
  • 如何用一行C++代码读写数据库

    万次阅读 2017-08-01 16:48:42
    这篇文章要表达的并非数据库相关的知识,而是如何使用DBIOWrapper。 DBIOWrapper是一个工作在Windows下、对ODBC式数据访问进行了小型... 文章标题中《如何用一行C++代码读写数据库》是伪命题,要操作数据库我们通常
  • 什么是数据库

    万次阅读 多人点赞 2018-07-27 16:16:03
    生活中常用数据库 数据库,对于初学者来说会有一定迷惑。到底什么是数据库呢?我们可以从其名字来说,数据库的意思是数据的集合,如果这样来理解的话,在电脑上我们把照片放到同一个文件夹下,那么这个文件夹就是一...
  • MySQL创建数据库 easyShopping,包括area表、goods表、customer表、orders表、ordersdetall表、test表 商品表表结构: 字段名 说 明 类 型 长 度 约 束 ...
  • 本教程演示如何在 T-SQL 编辑器中创建数据库对象的主要功能。 您可以在本教學課程中,了解如何使用 Azure 数据 Studio 來完成下列工作: 搜索数据库对象 编辑表数据 使用代码段快速编写 T-SQL 使用查看数据库对象...
  • 创建银行数据库bankDB

    千次阅读 2017-04-03 16:05:28
    1、创建数据库(1  2 2 ) 1-1 创建文件夹用以存放数据库 1-2 创建建库bankDB 2、创建数据库 2-1、创建用户信息表userInfo 字段名称 数据类型 ...
  • 数据库程序设计-视图的创建及查询

    千次阅读 2020-05-06 18:16:22
    数据库程序设计-视图的创建及查询 使用create view语句就可以创建视图了,具体语句如下: create view viewname as select * from Tab_EdsProd(Tab_EdsProd是表的名字)where (后面可以接一线限制的条件)。 ...
  • 大型财物管理数据库设计完整版,含代码! 用户发展战略 项目整体目标 财务管理的任务 会计学的理论基础 基础资料维护 财务管理系统E-R图 实例功能 创建数据库 程序运行结果 ……
  • 1、 一般架构说明 图1 架构层次图 ... 一般应用系统数据库访问模块可大致分为两层,一层是对数据库连接、连接池和结果集等直接对数据库的操作的封装,由于libmysql提供的库函数是...如果是C/S结构的系统,客户
  • java代码实现对数据库的备份操作

    千次阅读 2017-11-10 14:32:24
    本周客户提了一个数据库实时备份的功能,看到网上的资料不是很详细,而且也比较麻烦,就把自己的实现方法分享一下。因为目前项目用的是SSM,就想到了写一个用于备份的存储过程,然后后台通过sql调用执行,把指定的...
  • 由于我们的UDB数据源是独占型的,很多客户喜欢将数据存放到数据库型数据源中,方便更新数据,也方便其他工作人员及时查看和修改数据,省去了拷贝数据的繁琐。本文主要介绍在SuperMap iDesktop中如何创建Oracle数据型...
  • 数据库 表格创建和管理

    千次阅读 2015-11-17 20:29:00
    数据库管理系统(Database Management System)简称DBMS;数据库管理员(Database Administration)简称DBA,功能是确保DBMS的正常高效运行;数据库分体验版(一般只安装库文件和服务)和正式版(授权使用);在正式...
  • 数据库和表

    千次阅读 2021-04-19 14:08:09
    文章目录前言一、实验目的与要求:二、实验...创建数据库和表:2、向数据表fruits、customers、orderitems和suppliers、orders中插入给定的如下数据3. 向数据表customers和suppliers中分别插入两条记录,新记录custome
  • customerID int identity(1,1) primary key,--客户编号 customerName varchar(5) not null,--客户姓名 PID varchar(20) not null,--身份证号 telephone varchar(20) not null, --联系电话 address varchar...
  • 利用T—SQL创建数据库

    千次阅读 2010-08-29 16:54:00
    考虑到各种数据库的版本的兼容性,行之有效的办法就是编写比较通用的SQL语句,包括创建数据库,数据表,添加约束,插入测试数据等。编写完毕后,存入*.sql文件中,最后复制到客户的计算机中,并执行*.sql文件中的SQL...
  •  数据库访问几乎每一个稍微成型的程序都要用到的知识,怎么高效的访问数据库也是我们学习的一个重点,今天的任务就是总结java访问数据库的方法和有关API,java访问数据库主要用的方法是JDBC,它是java语言中用来规范...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     //给客户发一个感谢消息,消息驱动Bean必须实现两个接口MessageDrivenBean和MessageListener  在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息...
  • java创建MySQL数据库连接池

    千次阅读 2018-07-31 10:05:30
    注意,java接口是在win7下,MySQL是在RHEL下。 原理: 进程池的定义: 1、首先定义了一个...//存放连接池中数据库连接的向量。 2、connections=new Vector();connections.addElement(new PooledConnection(...
  • 显示职业号=005的教师所服务的客户的姓名,客户编号,电话;显示所有老师的姓名,工资,地址;在建立好的数据表中实现记录和约束条件的增加和删除和修改;update 语句;;创建存储过程统计指定日期范围内时间总和;...
  • 使用 JDBC 创建数据库对象

    千次阅读 2004-08-06 18:22:00
    如果我们能够以某种方式编写不依赖于特定厂商的数据库代码,并且能够不改变自己的调用程序即可从这些数据库中得到相同的结果,那将是一件很好的事。如果我们可以仅为所有这些数据库编写一些封装,使它们具有相似的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 194,933
精华内容 77,973
关键字:

创建数据库客户代码