AoboSir 博客

与15年前的我比,我现在是大人;与15年后的我比,我现在还是个婴儿

SQL 数据库 学习 017 查询-00 介绍 Scott 例子库


  • 我的电脑系统:Windows 10 64位
  • SQL Server 软件版本: SQL Server 2014 Express

我们要查数据,总先得有数据要查吧,所以我们需要先找一个例子库。Orale软件里面就有一个例子库,这个库很经典,就是:scott 库。

附加 scott

如何添加一个 scott 数据库 到服务器中,请参考这个网站


介绍 scott

要想查询一个表,第一件事情就必须十分了解一个库里面所有的表 和 表与表之间的关系。

这个 scott 库里面一共有三个表:

Alt text


先看看 emp 表(员工表

Alt text

员工表里面有8个属性:

EMPNO(员工编号)、ename(姓名)、job(职称)、mgr(上级编号)、hiredate(雇佣日期)、sal(工资)、comm(奖金)、deptno(部门编号)。

里面 job 属性里面的英文单词翻译:

  • CLERK :普通职员
  • SALESMAN :销售人员
  • MANAGER :经理
  • ANALYST :研究人员
  • PRESIDENT :总统

现在我们看看 dept 表 (部门表):

Alt text

部门表里面有3个属性:deptno(部门编号)、dname(部门名称)、loc(地址)。


在看看最后一个表:SALGRAGE 表。(这个表示的是工资的等级表。)

Alt text

SALGRADE 表里面有3个属性:GRADE(等级)、LOSAL(下限)、HISAL(上限)。


SQL 数据库 学习 016 如何附加数据库


  • 我的电脑系统:Windows 10 64位
  • SQL Server 软件版本: SQL Server 2014 Express

scott 例子库可以在下面的链接中下载: (百度云)

链接:http://pan.baidu.com/s/1sl9zbm1 密码:nyly

这个例子库可以通过 附加 的方式添加到 SQL Server 软件里面。(这个例子很经典。SQL Server软件 和 Orale 软件 都可以使用到这个例子库。)

添加 scott 库 到SQL Server 软件

Step 1 . 鼠标右键点击 数据库 -> 附加(A)…

Alt text

Step 2 .

Alt text

Alt text

Alt text

Alt text

如果你遇到下面的问题,请访问这个网站解决问题。

Alt text

Alt text

成功添加:

Alt text


搞定

SQL 数据库 解决问题:无法打开物理文件 "XXX.mdf"。操作系统错误 5:"5(拒绝访问。)"。 (Microsoft SQL Server,错误: 5120) --- 附加数据库时出错。有关详细信息,请单击“消息”列中的超链接。


  • 我的电脑系统:Windows 10 64位
  • SQL Server 软件版本: SQL Server 2014 Express

出现的问题

在你 附加 一个外部数据库到服务器上是,出现下面的错误:

Alt text | center

Alt text | center


解决办法

  1. 找到要附加的.mdf文件———>右键———>属性———>安全———>选择当前用户———>编辑———>完全控制。

    • Alt text
    • Alt text
  2. 对.log文件进行相同的处理。


搞定


参考网站:

http://blog.csdn.net/justdb/article/details/8457487

SQL 数据库 学习 015 开始学习查询 查询综述


  • 我的电脑系统:Windows 10 64位
  • SQL Server 软件版本: SQL Server 2014 Express

查询 是数据库里面最重要的知识点,而且知识点很多,下面我们将查询的知识点先列出来:

  1. scott 表介绍(例子表)
  2. 计算列
  3. distinct
  4. between
  5. in
  6. top
  7. null
  8. order by
  9. 模糊查询
  10. 聚合函数
  11. group by
  12. having
  13. 链接查询
    • 定义
    • 分类
      • 内连接
      • 外连接
      • 完全连接
      • 交叉连接
      • 字连接
      • 联合
  14. 嵌套查询(orale 中讲)

SQL 数据库 学习 014 外键的具体定义 设计外键要注意的问题


  • 我的电脑系统:Windows 10 64位
  • SQL Server 软件版本: SQL Server 2014 Express

外键的具体定义

如果一个表中的若干个字段是来自另外若干个表的主键或唯一键,则这若干个字段就是外键。(我们讲多对多的时候,一个表里面就有两个外键。)

设计外键要注意的问题

  • 外键通常是来自另外表的主键而不是唯一(unique)键,因为唯一键可能为null
  • 外键不一定是来自另外的表,也可能来自本表的主键
  • 含有外键的表叫外键表,外键字段来自的那一张表叫做主键表

问题:

Q: 先删除主键表还是先删除外键表?

A: 先删除外键表,再删主键表。如果先删除主键表,会报错,因为这会导致外键表中的数据引用失效。

SQL 数据库 学习 013 主键的具体定义 设计主键要注意的问题


  • 我的电脑系统:Windows 10 64位
  • SQL Server 软件版本: SQL Server 2014 Express

主键的具体定义

能够唯一标识一个事物的一个字段或者多个字段的组合,被称为主键


设计主键要注意的问题

  • 含有主键的表叫做主键表
  • 主键通常都是整数,不建议使用字符串为主键。(如果主键是用于集群式服务(指跨数据库服务,比如:跨行转账),才可以考虑用字符串当主键。)
  • 主键的值通常都不允许 修改,除非本记录被删除
  • 主键不要定义成id,而要定义成表名id 或者 表名_id
  • 要用代理主键,不要用业务主键
    • 任何一张表,强烈建议不要使用业务含义的字段充当主键,我们通常都是在表中单独添加一个整型的编号充当主键字段。

SQL 数据库 学习 012 数据库关系图


  • 我的电脑系统:Windows 10 64位
  • SQL Server 软件版本: SQL Server 2014 Express

我们现在写一个 多对多关系的表:(这段代码你可以在这篇博文里面看到它的代码解释。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
--班级表
create table banji
(
  banji_id int primary key,
  banji_num int not null,
  banji_name nvarchar(100)
)

--教师
create table jiaoshi
(
  jiaoshi_id int primary key,
  jiaoshi_name nvarchar(200)
)

--第三张表:用来模拟班级和教师的关系
create table banji_jiaoshi_mapping
(
  banji_id int constraint fk_banji_id foreign key references banji(bianji_id),
  jiaoshi_id int foreign key references jiaoshi(jiaoshi_id),
  kecheng nvarchar(20),
  constraint pk_banji_id_jiaoshi_id primary key (banji_id, jiaoshi_id, kecheng)
  
)

虽然,现在我们已经将表与表之间的关系都建好了。但是我现在怎么才能知道他们之间的关系到底有没有见好啊。 SQL Server 为我们提供了另外一个工具:数据库关系图

我们新建一个:

Alt text

Alt text

外键添加到多的一方。


SQL 数据库 学习 011 关系、一对一、一对多、多对多


  • 我的电脑系统:Windows 10 64位
  • SQL Server 软件版本: SQL Server 2014 Express

什么是关系

定义:

  • 表和表之间的联系。

实现方式:

  • 通过设置不同形式的外键来体现表和表的不同关系。

关系的分类(假设是A表和B表)

第一种分类: 一对一 (详述一对一关系及其实现)

(一对一,几乎不使用。所以,我们就一句话带过。)

一对一的实现:既可以把表A的主键充当表B的外键,也可以把表B的主键充当表A的外键。

一对多 和 多对多 才是我们学习的重点。

第二种分类:一对多 (详述一对多关系及其实现)

一对多事怎么实现的?

表A(一)与表B(多)(我们现在希望,表A中的一条记录对应表B中的多条记录)之间要是有关系,就必须要有外键。把表A的主键添加到表B里面,充当表B的外键。

一对多的实现:在多的一方的表里面,添加外键。

第三种分类:多对多 (详述多对多关系及其实现)

现实中,什么事物和什么事物之间是多对多的关系?

班级和老师的关系。(一个班级有很多老师上课,一个老师可以去很多班级上课。)

多对多其实就是:一对多 和 多对一 的一个组合。

多对多的实现:多对多 必须要通过单独的一张表来表示。

  • 班级是一张表
  • 教师是一张表
  • 班级和教师的关系也是一张表

用一个实例来解释 多对多。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
--班级表
create table banji
(
  banji_id int primary key,
  banji_num int not null,
  banji_name nvarchar(100)
)

--教师
create table jiaoshi
(
  jiaoshi_id int primary key,
  jiaoshi_name nvarchar(200)
)

--第三张表:用来模拟班级和教师的关系
create table banji_jiaoshi_mapping
(
  banji_id int constraint fk_banji_id foreign key references banji(bianji_id),
  jiaoshi_id int foreign key references jiaoshi(jiaoshi_id),
  kecheng nvarchar(20),
  constraint pk_banji_id_jiaoshi_id primary key (banji_id, jiaoshi_id, kecheng)
  
)

解释代码:

其中banji_id int constraint fk_banji_id foreign key references banji(bianji_id), 代码中的 fk_banji_id 是约束的名字,foreign key references banji(bianji_id) 指的是:当前这个表里面的 banji_id 属性是来自 banji 表的主键 banji_id,也就是说:当前表中的 banji_id 是一个外键(foreign key)。

其中jiaoshi_id int foreign key references jiaoshi(jiaoshi_id),里面,这里没有命名约束的名字,约束的名字可以省略不写,所以这里没有写也没有问题。同理上面那句代码。

其中constraint pk_banji_id_jiaoshi_id primary key (banji_id, jiaoshi_id, kecheng)中的 pk_banji_id_jiaoshi_id 这个是约束的名字。primary key (banji_id, jiaoshi_id, kecheng) 是设置jiaoshi_idbanji_idkecheng 三个属性的组合是一个主键primary key)。

现在执行,生成了3个表。

现在我们在这3个表里面插入数据。

banji

Alt text

jiaoshi

Alt text

banji_jiaoshi_mapping

Alt text

都不会有错误,说明多对多生成成功。

EDA Learning 001 (Windows系统 软件安装) Quartus II 9.0正式版下载、安装、破解详细图解


一共三步:下载、安装、破解。

一 . 下载

Quartus II 9.0正式版。下载地址:ftp://ftp.altera.com/outgoing/release/90_quartus_windows.exe

Quartus II 是Altera公司的综合性PLD/FPGA开发软件,原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware 支持Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。

Quartus_II_9.0_SP2破解器.exe、Quartus_II_9.0破解器.exe、Quartus_II_9.1破解器.exe

当你下载破解器软件的时候,电脑会判断这个文件是病毒,电脑会自动删除这个文件,导致你无法下载这个文件。 解决办法就是将杀毒软件和电脑自带的杀毒软件关闭,即可。

Windows 10 关闭自动杀毒:

Alt text

关闭下面这一项:

Alt text

二 . 安装

双击运行,先是解压:

Alt text

Alt text

Alt text

Alt text

安装到默认路径就可以:

Alt text

Alt text

安装:

Alt text

确定信息:

Alt text

正在安装:

Alt text

Alt text

Alt text

完成:

Alt text

让其自动关闭。

三 . 破解

双击启动:Quartus_II_9.0破解器.exe 。点击 应用补丁

Alt text

点击

Alt text

如果直接把该破解器Copy到C:\altera\90\quartus\bin下,就不会出现这个对话框,而是直接开始破解!

Alt text

破解后,生成一个 license.DAT 文件,保存它(license文件存放的路径名称不能包含汉字和空格,空格可以用下划线代替。)

Alt text

搞定: 点击 退出 即可。

Alt text

Alt text

记事本打开它:

Alt text

查看电脑的 IP 地址。在 DOS 窗口中执行 ipconfig /all 命令:

Alt text

license.dat 里的两个XXXXXXXXXXXX 用您的物理地址替换。保存文件。

Alt text


破解完成。

四 . 启动 软件

一共安装了两个 Quartus II 软件,一个32位的 一个是64位的。我们只能破解32位的,64位的那个就不要使用了。

双击 运行 32位的这个 Quartus II 软件:

Alt text

Alt text

Alt text

Alt text

Alt text

Alt text

大功告成

Alt text

Over

为了防止不合格的破解流行,影响客户的正常使用,我们在启动画面中加入了“Altera中国区代理――骏龙科技有限公司”的防伪字样,客户启动时可以看到这行汉字。

重新启动软件,你只要看到下面的启动画面,那么久说明破解已经成功的。

Alt text

只不过,每次启动的时候,都会出现这么这个窗口,没有关系,你只需要选择第3个选项:

Alt text

在点击 OK,就可以:

Alt text

Over

SQL 数据库 学习 010 表和约束的区别、check约束、default约束、unique约束、not Null约束


  • 我的电脑系统:Windows 10 64位
  • SQL Server 软件版本: SQL Server 2014 Express

表和约束的区别

  • 数据库是通过表来解决事物的存储问题的。
  • 数据库是用过约束来解决事物取值的有效性和合法性的问题。
  • 建表的过程就是指定事物属性及其事物属性各种约束的过程。

check 约束

意义:保证事物属性的取值在合法的范围之内。

我们先创建一个表:(建表之前,先确保选中了指定的库)

Alt text

点击 新建查询 按钮。输入下面的指令来新建一个带有check 约束的学生表:

1
2
3
4
5
create table student
(
  stu_id int primary key,
  stu_sal int check (stu_sal>=1000 and stu_sal<=8000)
)

现在,选中,然后点击执行。

现在刷新右侧栏test库的 ,就可以看到刚刚建的学生表:

Alt text

接下来是,向这个表里面插数据:

1
2
insert into student values (1, 1000)
insert into student values (2, 10000)

这就是所谓的第4代语言。全都是命令,你不需要知道它里面是如何实现的。这就是第4代编程语言。

现在student(2) 的工资已经超出了约束。如果你现在选中这两行命令。点击 执行,就会出现错误。

1
2
3
消息 547,级别 16,状态 0,第 8 
INSERT 语句与 CHECK 约束"CK__student__stu_sal__1A14E395"冲突。该冲突发生于数据库"test",表"dbo.student", column 'stu_sal'
语句已终止。

这就是 check 约束。


default约束

意义:保证事物的属性一定会有一个值。

我们还是写 学生表。我们先把上面新建的学生表先删除掉。

1
2
3
4
5
6
create table student
(
  stu_id int primary key,
  stu_sal int check (stu_sal>=1000 and stu_sal<=8000),
  stu_sex nchar(1) default ('男') --()可以省略。在数据库中字符串是必须用''括起来的
)

这里简单的解释一下:''"" 在数据库里面有什么区别?

A: '' 就是表示一个字符串;"" 就是表示一个数据的名字。(比如:为某一个事物去一个名字,用""。表的名字、约束的名字、列的名字、计算列的名字、临时表的名字。总之,只要是为一个事物取一个名字,就是:""。)

1
2
insert into student(stu_id, stu_sal) values (1, 1000)
insert into student values (2, 6000, '女')

选中这两行,点击 执行 按钮。

Alt text

insert into student values (3, 2000) 这样的命令是会报错的。因为表里面有3列值,你只输入了2列的数据。所以如果你想要让 stu_sex 使用默认值,必须要要这样写:insert into student(stu_id, stu_sal) values (1, 1000),指定你赋值的两列。


unique(唯一)约束

意义:它保证了事物的属性的取值不允许重复,但是允许为空。

它都唯一了,那它和主键还有什么区别啊?

unique(唯一)约束允许为空 是可以组合使用的。而 主键允许为空 是不能组合使用的。

不允许为空not null)都可以和unique(唯一)约束主键 组合使用。)

表里的项,如果不设置为 not null ,默认是:允许为空 的。

创建表:学生表2

1
2
3
4
5
6
7
create table student2
(
  stu_id int primary key,
  stu_sal int check (stu_sal>=1000 and stu_sal<=8000),
  stu_sex nchar(1) default ('男'), --()可以省略。在数据库中字符串是必须用''括起来的
  stu_name nvarchar(200) unique
)

我们执行下面的指令就会出错。因为 stu_name 项是有唯一约束的:

1
2
insert into student2 vaules (1, 2000, '男', '张三')
insert into student2 vaules (2, 4000, '男', '张三')

我们执行下面的命令不会出错:(因为:unique(唯一)约束允许为空 是可以组合使用的。)

1
insert into student2 values (3, 6000, '男', null)

如果我们执行下面的指令,就会出错:(因为,主键是不允许为空的。)

1
insert into student2 values (null, 6000, '女', '王麻子')

如果现在再插入一个为空的元组,就会出错:(错误时:重复)

(唯一约束不允许重复,但唯一约束允许为空,但是只允许其中有一列为空。)

1
insert into student2 values (4, 6000, '男', null)

Q: unique(唯一)约束 是否 允许多列为 ?

A:SQL Server 软件只允许一个 unique 列为空; Oracle 允许多个 unique 列为空。


如何合理的利用主键和唯一约束建表

一个比较重要的问题: Q: 唯一约束 和 主键 有什么区别?如何辨别?如何合理的利用主键和唯一约束建表?

A:

我们上网的时候,经常要登录,有些网站使用用户名,有的还可以使用邮箱登录。邮箱或者用户名,是唯一的。但不能使用它来当主键,我们不能使用业务信息当主键,因为用户名和邮箱是可以修改的。主键永远不可以修改。因为主键不但是本表的主键,而可能是其他表的外键,如果主键改变了,那么其他表的外键也要修改。所以,这个唯一键和主键的第一个区别。

第二区别,主键一遍最好使用数字,不要使用字符串。使用数字为主键,查新速度非常快,相比使用字符串。所以不能使用有实际意义的字符串当主键。再说一次:不要使用业务逻辑(虽然它也是不允许重复的,比如用户名和邮箱)当主键,要使用没有实际意义的编号当主键。(如果数据量太大,可能主键里面还需要加一下字母。)

主键最好不直接录入,我们最好使用 identity 关键字,让其自动增长,自动生成主键。(不使用业务逻辑当主键,使用代理主键(就是编号)当主键)


什么是not null 约束 以及 其 not null 约束与 default 约束的异同

我认为 not null 就是一个约束。它要求用户必须得为该属性赋一个值,否则语法出错!

如果一个字段不写null ,也不写 not null ,则默认是 null ,即默认允许为空,用户可以不给该字段赋值。

如果用户没有为该字段赋值,则该字段的值默认是 null

要注意 nuldefault 的区别。

  • 相同点:都允许用户不赋值
  • 不同点:null 修饰的字段如果用户不赋值则默认是nulldefault 修饰的字段如果用户不赋值则默认是default 指定的那个值。