目录

  • 一、数据库概要
  • 1.1、发展历史
  • 1.1.1、人工处理阶段
  • 1.1.2、文件系统
  • 1.1.3、数据库管理系统
  • 1.2、常见数据库技术品牌、服务与架构
  • 1.3、数据库分类
  • 1.3.1、关系型数据库
  • 1.3.2、非关系型数据库
  • 1.4、数据库规范化
  • 1.4.1. 什么是范式
  • 1.4.2. 三大范式
  • 1.4.3. 范式与效率
  • 二、MySQL介绍
  • 2.1、MySQL概要
  • 2.2、系统特性
  • 2.3、存储引擎
  • 三、快速安装运行MySQL数据库
  • 3.1、使用绿色版
    • 3.1.1、设置mysql远程访问
    • 3.1.2、修改mysql用户密码
    • 3.1.2、安装服务
  • 3.2、使用安装版
  • 四、使用GUI操作MySQL
  • 4.1、关系型数据库的典型概念
  • 4.2、登录数据库
  • 4.3、创建数据库
  • 4.4、创建表
  • 4.5、管理数据
    • 4.5.1、添加数据
    • 4.5.2、删除数据
    • 4.5.3、修改表结构
    • 4.5.4、外键
    • 4.5.5、唯一键
  • 4.6、上机练习
  • 五、使用SQL访问MySQL数据库
  • 5.0、定义学生表Stu、商品类型与商品表
    • 5.0.1、新建数据库
    • 5.0.2、新建表
    • 5.0.3、新建查询
  • 5.1、增加数据
  • 5.2、查询数据
    • 5.2.1、表达式与条件查询
    • 5.2.2、聚合函数
  • 5.3、删除数据
  • 5.4、更新数据
  • 5.5、修改表
    • 5.5.1、添加列
    • 5.5.2、修改列
    • 5.5.3、删除列
    • 5.5.4、重命名表
    • 5.5.5、删除表
    • 5.5.6、删除数据库
    • 5.5.7、一千行MySQL笔记
    • 5.5.8、常用的SQL
  • 5.6、MySQL与SQLServer的区别
    • 5.6.1、区别一
    • 5.6.2、区别二
  • 六、使用JDBC访问MySQL
  • 6.1、下载驱动
  • 6.2、JDBC访问MySQL
  • 七、下载程序、帮助、视频
  • 八、作业
  • 8.1、使用javascript实现身份证校验与信息提取。
  • 8.2、SQL强化练习,请点击进入


随着移动互联网的结束与人工智能的到来大数据变成越来越重要,下一个成功者应该是拥有海量数据的,数据与数据库你应该知道。


一、数据库概要

数据库(Database)是存储与管理数据的软件系统,就像一个存入数据的物流仓库。

在商业领域,信息就意味着商机,取得信息的一个非常重要的途径就是对数据进行分析处理,这就催生了各种专业的数据管理软件,数据库就是其中的一种。当然,数据库管理系统也不是一下子就建立起来,它也是经过了不断的丰富和发展,才有了今天的模样。

mysql中从dual查询24小时_数据库


1.1、发展历史


1.1.1、人工处理阶段

在20世纪50年代中期以前的计算机诞生初期,其处理能力很有限,只能够完成一些简单的运算,数据处理能力也很有限,这使得当时的计算机只能够用于科学和工程计算。计算机上没有专用的管理数据的软件,数据由计算机或处理它的程序自行携带。当数据的存储格式、读写路径或方法发生变化的时候,其处理程序也必须要做出相应的改变以保持程序的正确性。


1.1.2、文件系统

20世纪50年代后期到60年代中期,随着硬件和软件技术的发展,计算机不仅用于科学计算,还大量用于商业管理中。在这一时期,数据和程序在存储位置上已经完全分开,数据被单独组织成文件保存到外部存储设备上,这样数据文件就可以为多个不同的程序在不同的时间所使用。
虽然程序和数据在存储位置上分开了,而且操作系统也可以帮助我们对完成了数据的存储位置和存取路径的管理,但是程序设计仍然受到数据存储格式和方法的影响,不能够完全独立于数据,而且数据的冗余较大。


1.1.3、数据库管理系统

从20世纪70年代以来,计算机软硬件技术取得了飞跃式的发展,这一时期最主要的发展就是产生了真正意义上的数据库管理系统,它使得应用程序和数据之间真正的实现的接口统一、数据共享等,这样应用程序都可以按照统一的方式直接操作数据,也就是应用程序和数据都具有了高度的独立性。

mysql中从dual查询24小时_mysql中从dual查询24小时_02


1.2、常见数据库技术品牌、服务与架构

 发展了这么多年市场上出现了许多的数据库系统,最强的个人认为是Oracle,当然还有许多如:DB2、Microsoft SQL Server、MySQL、SyBase等,下图列出常见数据库技术品牌、服务与架构。

mysql中从dual查询24小时_MySQL_03


1.3、数据库分类

数据库通常分为层次式数据库、网络式数据库和关系式数据库三种。

而不同的数据库是按不同的数据结构来联系和组织的。

而在当今的互联网中,最常见的数据库模型主要是两种,即关系型数据库和非关系型数据库。


1.3.1、关系型数据库

当前在成熟应用且服务与各种系统的主力数据库还是关系型数据库。

mysql中从dual查询24小时_MySQL_04

代表:Oracle、SQL Server、MySQL


1.3.2、非关系型数据库

随着时代的进步与发展的需要,非关系型数据库应运而生。

代表:Redis、Mongodb

NoSQL数据库在存储速度与灵活性方面有优势,也常用于缓存。


1.4、数据库规范化

经过一系列的步骤,我们现在终于将客户的需求转换为数据表并确立这些表之间的关系,那么是否我们现在就可以在开发中使用呢?答案否定的,为什么呢!同一个项目,很多人参与了需求的分析,数据库的设计,不同的人具有不同的想法,不同的部门具有不同的业务需求,我们以此设计的数据库将不可避免的包含大量相同的数据,在结构上也有可能产生冲突,在开发中造成不便。


1.4.1. 什么是范式

要设计规范化的数据库,就要求我们根据数据库设计范式――也就是数据库设计的规范原则来做。范式可以指导我们更好地设计数据库的表结构,减少冗余的数据,借此可以提高数据库的存储效率,数据完整性和可扩展性。

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。


1.4.2. 三大范式

第一范式(1NF)

所谓第一范式(1NF)是指在关系模型中,对列添加的一个规范要求,所有的列都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域。

例如:表1-1中,其中”工程地址”列还可以细分为省份,城市等。在国外,更多的程序把”姓名”列也分成2列,即”姓”和“名”。

虽然第一范式要求各列要保存原子性,不能再分,但是这种要求和我们的需求是相关联的,如上表中我们对”工程地址”没有省份,城市这样方面的查询和应用需求,则不需拆分,”姓名”列也是同样如此。

表1-1   原始表

工程号

工程名称

工程地址

员工编号

员工名称

薪资待遇

职务

P001

港珠澳大桥

广东珠海

E0001

Jack

6000/月

工人

P001

港珠澳大桥

广东珠海

E0002

Join

7800/月

工人

P001

港珠澳大桥

广东珠海

E0003

Apple

8000/月

高级技工

P002

南海航天

海南三亚

E0001

Jack

5000/月

工人

第二范式(2NF)

在1NF的基础上,非Key属性必须完全依赖于主键。第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。

第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。

例如:表1-1中,一个表描述了工程信息,员工信息等。这样就造成了大量数据的重复。按照第二范式,我们可以将表1-1拆分成表1-2和表1-3:

l  工程信息表:(工程编号,工程名称,工程地址):

表1-2   工程信息表

工程编号

工程名称

工程地址

P001

港珠澳大桥

广东珠海

P002

南海航天

海南三亚

l  员工信息表(员工编号,员工名称,职务,薪资水平):

表1-3   员工信息表

员工编号

员工姓名

职务

薪资水平

E0001

Jack

工人

3000/月

E0002

Join

工人

3000/月

E0003

Apple

高级技工

6000/月

这样,表1-1就变成了两张表,每个表只描述一件事,清晰明了。

第三范式(3NF)

第三范式是在第二范式基础上,更进一层,第三范式的目标就是确保表中各列与主键列直接相关,而不是间接相关。即各列与主键列都是一种直接依赖关系,则满足第三范式。

第三范式要求各列与主键列直接相关,我们可以这样理解,假设张三是李四的兵,王五则是张三的兵,这时王五是不是李四的兵呢?从这个关系中我们可以看出,王五也是李四的兵,因为王五依赖于张三,而张三是李四的兵,所以王五也是。这中间就存在一种间接依赖的关系而非我们第三范式中强调的直接依赖。

现在我们来看看在第二范式的讲解中,我们将表1-1拆分成了两张表。这两个表是否符合第三范式呢。在员工信息表中包含:”员工编号”、”员工名称”、”职务”、”薪资水平”,而我们知道,薪资水平是有职务决定,这里”薪资水平”通过”职务”与员工相关,则不符合第三范式。我们需要将员工信息表进一步拆分,如下:

l  员工信息表:员工编号,员工名称,职务

l  职务表:职务编号,职务名称,薪资水平

现在我们已经了解了数据库规范化设计的三大范式,下面我们再来看看对表1-1优化后的数据表:

员工信息表(Employee)

员工编号

员工姓名

职务编号

E0001

Jack

1

E0002

Join

1

E0003

Apple

2

工程信息表(ProjectInfo)

工程编号

工程名称

工程地址

P001

港珠澳大桥

广东珠海

P002

南海航天

海南三亚

职务表(Duty)

职务编号

职务名称

工资待遇

1

工人

3000/月

2

高级技工

6000/月

工程参与人员记录表(Project_ Employee_info)

编号

工程编号

人员编号

1

P001

E0001

2

P001

E0002

3

P002

E0003

通过对比我们发现,表多了,关系复杂了,查询数据变的麻烦了,编程中的难度也提高了,但是各个表中内容更清晰了,重复的数据少了,更新和维护变的更容易了,哪么如何平衡这种矛盾呢?


1.4.3. 范式与效率

在我们设计数据库时,设计人员、客户、开发人员通常对数据库的设计有一定的矛盾,客户更喜欢方便,清晰的结果,开发人员也希望数据库关系比较简单,降低开发难度,而设计人员则需要应用三大范式对数据库进行严格规范化,减少数据冗余,提高数据库可维护性和扩展性。由此可以看出,为了满足三大范式,我们数据库设计将会与客户、开发人员产生分歧,所以在实际的数据库设计中,我们不能一味的追求规范化,既要考虑三大范式,减少数据冗余和各种数据库操作异常,又要充分考虑到数据库的性能问题,允许适当的数据库冗余。


二、MySQL介绍


2.1、MySQL概要

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

mysql中从dual查询24小时_数据_05


MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。

MySQL官网:https://www.mysql.com/

MySQL下载:https://www.mysql.com/downloads/


2.2、系统特性

1.使用 C和 C++编写,并使用了多种编译器进行测试,保证了源代码的可移植性。

2.支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统。

3.为多种编程语言提供了 API。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby,.NET和 Tcl 等。

4.支持多线程,充分利用 CPU 资源。

5.优化的 SQL查询算法,有效地提高查询速度。

6.既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中。

7.提供多语言支持,常见的编码如中文的 GB 2312、BIG5,日文的 Shift_JIS等都可以用作数据表名和数据列名。

8.提供 TCP/IP、ODBC 和 JDBC等多种数据库连接途径。

9.提供用于管理、检查、优化数据库操作的管理工具。

10.支持大型的数据库。可以处理拥有上千万条记录的大型数据库。

11.支持多种存储引擎。

12.MySQL 是开源的,所以你不需要支付额外的费用。

13.MySQL 使用标准的 SQL数据语言形式。

14.MySQL 对 PHP 有很好的支持,PHP是目前最流行的 Web 开发语言。

15.MySQL是可以定制的,采用了 GPL协议,你可以修改源码来开发自己的 MySQL 系统。

16.在线 DDL/更改功能,数据架构支持动态应用程序和开发人员灵活性(5.6新增)

17.复制全局事务标识,可支持自我修复式集群(5.6新增)

18.复制无崩溃从机,可提高可用性(5.6新增)

19.复制多线程从机,可提高性能(5.6新增)

20.3倍更快的性能(5.7新增)

21.新的优化器(5.7新增)

22.原生JSON支持(5.7新增)

23.多源复制(5.7新增)

24.GIS的空间扩展(5.7新增)


2.3、存储引擎

MySQL数据库根据应用的需要准备了不同的引擎,不同的引擎侧重点不一样,区别如下:

MyISAM MySQL 5.0 之前的默认数据库引擎,最为常用。拥有较高的插入,查询速度,但不支持事务

InnoDB 事务型数据库的首选引擎,支持ACID事务,支持行级锁定, MySQL 5.5 起成为默认数据库引擎

BDB源 自 Berkeley DB,事务型数据库的另一种选择,支持Commit 和Rollback 等其他事务特性

Memory 所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在 MySQL 重新启动时丢失

Merge 将一定数量的 MyISAM 表联合而成一个整体,在超大规模数据存储时很有用\

Archive 非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive 拥有高效的插入速度,但其对查询的支持相对较差

Federated 将不同的 MySQL 服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用

Cluster/NDB 高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用

CSV 逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个 .csv 文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV 存储引擎不支持索引。

BlackHole 黑洞引擎,写入的任何数据都会消失,一般用于记录 binlog 做复制的中继

EXAMPLE 存储引擎是一个不做任何事情的存根引擎。它的目的是作为 MySQL 源代码中的一个例子,用来演示如何开始编写一个新存储引擎。同样,它的主要兴趣是对开发者。EXAMPLE 存储引擎不支持编索引。

另外,MySQL 的存储引擎接口定义良好。有兴趣的开发者可以通过阅读文档编写自己的存储引擎。

mysql中从dual查询24小时_MySQL_06


三、快速安装运行MySQL数据库

MySQL以前一直是开源免费的,被Oracle收购后有些变化:以前的版本都是免费的,社区版按GPL协议开源免费,商业版提供更加丰富的功能,但收费。

社区版的下载地址:https://dev.mysql.com/downloads/ (免费)

企业版的下载地址:https://www.mysql.com/downloads/(收费)


3.1、使用绿色版

为了方便快捷的使用MySQL我已经准备好了一个绿化了的MySQL,解压后就可以直接使用,不需要任何配置。

下载地址1:https://pan.baidu.com/s/1K08GU-E4CyEKKIseBYwRYA 密码: e59m

下载后直接解压:

mysql中从dual查询24小时_MySQL_07

点击启动PStart.exe这是一个自定义菜单的小工具,为了整理资源用的。

里面有两个MySQL的绿色版软件5.0,5.5

Navicat for MySQL是一个数据库客户端管理工具

点击启动PStart.exe后的结果如下:

mysql中从dual查询24小时_数据_08

点击启动MySQL服务,运行Navicat for MySQL即可。

*注意:上面的PStart只是一个整理文档资料的工具,并非必要,如果启动时有错误或为空时,可以直接关闭,直接启动MySQL服务,如:

mysql中从dual查询24小时_数据_09

mysql_start.bat用于启动MySql数据库,mysql_stop.bat用于关闭MySql数据库。

开发工具的启动方式也一样,如下所示:

mysql中从dual查询24小时_MySQL_10

navicat.exe用于启动Navicat数据库客户端,最好发送快捷方式到桌面,省去每次打开文件夹的麻烦。


3.1.1、设置mysql远程访问

执行mysql 命令进入mysql 命令模式,执行如下SQL代码 

mysql> use mysql; 
mysql> GRANT ALL ON *.* TO admin@'%' IDENTIFIED BY 'admin' WITH GRANT OPTION;

#这句话的意思 ,允许任何IP地址(上面的 % 就是这个意思)的电脑 用admin帐户 和密码(admin)来访问这个MySQL Server
#必须加类似这样的帐户,才可以远程登陆。 root帐户是无法远程登陆的,只可以本地登陆


3.1.2、修改mysql用户密码

1.mysqladmin命令

格式如下(其中,USER为用户名,PASSWORD为新密码):

mysqladmin -u USER -p password PASSWORD

该命令之后会提示输入原密码,输入正确后即可修改。
例如,设置root用户的密码为123456,则

mysqladmin -u root -p password 123456

2.UPDATE user 语句

这种方式必须是先用root帐户登入mysql,然后执行:

UPDATE user SET password=PASSWORD('123456') WHERE user='root';
FLUSH PRIVILEGES;

3.SET PASSWORD 语句

这种方式也需要先用root命令登入mysql,然后执行:

SET PASSWORD FOR root=PASSWORD('123456');

4.root密码丢失的情况

使用 MySQL 自带的一个工具"MySQL GUI Tools",我一直用的是5.0版本的。 在安装目录中运行一个程序 MySQLSystemTrayMonitor.exe,运行完后在系统托盘会出现图标。如果MySQL服务尚未安装,则不会出现,可先通过Action>Manage MySQL Instances 先配置和安装服务。如果已经安装服务,鼠标右键点击后,会出现"Configure Instance"的菜单。点击后出现如下MySQL Administrator窗口:
假如原来的服务配置都正常的情况下,选中左侧列表中的“启动变量”,并在相应的右侧标签中选择“安全”,勾选“禁用grant表”,然后“应用更改”。
并回到左侧的“服务器控制”,和右侧相应的“开始/停止服务”标签,点击启动服务。此时,连接mysql已经不需要用户名和密码了,你可以修改root密码。


3.1.2、安装服务

首先我们先进入mysql的安装目录下的bin目录、之后打开DOS命令窗口,进入该目录下(一定要进入该目录,否则操作错误)

mysql中从dual查询24小时_数据库_11

执行DOS命令:

输入命令:mysqld --install,之后出现如下界面。提示安装服务成功。

mysql中从dual查询24小时_mysql中从dual查询24小时_12

注意是mysqld --install不是mysql --install

如果要卸载服务,可以输入如下命令:mysqld --remove。出现如下界面。提示移除服务成功。

mysql中从dual查询24小时_mysql中从dual查询24小时_13


3.2、使用安装版

MySQL5.7.17安装包官网下载地址: https://dev.mysql.com/downloads/windows/installer/

选择自定义:

mysql中从dual查询24小时_MySQL_14

安装的组件信息:

mysql中从dual查询24小时_数据库_15

服务器软件目录:

mysql中从dual查询24小时_MySQL_16

数据目录:

mysql中从dual查询24小时_MySQL_17

点击install安装即可:

mysql中从dual查询24小时_MySQL_18


配置:

mysql中从dual查询24小时_mysql中从dual查询24小时_19

mysql中从dual查询24小时_MySQL_20

机器类型

mysql中从dual查询24小时_MySQL_21


是否支持事务功能:

mysql中从dual查询24小时_数据_22

innodb表空间:

mysql中从dual查询24小时_数据库_23


连接数量:

mysql中从dual查询24小时_MySQL_24

mysql中从dual查询24小时_MySQL_25


字符集设定:

mysql中从dual查询24小时_mysql中从dual查询24小时_26


配置windows管理相关:

mysql中从dual查询24小时_数据库_27


配置安全选项,设置管理员的用户名与密码:

mysql中从dual查询24小时_数据_28


最后执行配置即可:

mysql中从dual查询24小时_mysql中从dual查询24小时_29


配置后,会启动服务。

新版的MySQL安装包大了很多,安装过程也有些不一样。


四、使用GUI操作MySQL


4.1、关系型数据库的典型概念

数据库 databse:数据的仓库

mysql中从dual查询24小时_数据_30

表 table:数据是保存在表内,保存在一个表内的数据,应该具有相同的数据格式

行:行用于记录数据

记录:行内的数据

列:列用于规定数据格式

字段:数据的某个列

mysql中从dual查询24小时_mysql中从dual查询24小时_31

SQL:用来管理数据的语言。结构化查询语言(SQL,Structured Query Language)

mysql中从dual查询24小时_数据库_32

主键:唯一地标识表中的某一条记录,不能空,不能重复


4.2、登录数据库

mysql中从dual查询24小时_mysql中从dual查询24小时_33

*连接本地数据库时需要启动服务

mysql中从dual查询24小时_mysql中从dual查询24小时_34


4.3、创建数据库

 

mysql中从dual查询24小时_数据_35

mysql中从dual查询24小时_mysql中从dual查询24小时_36


4.4、创建表

mysql中从dual查询24小时_数据库_37

mysql中从dual查询24小时_数据库_38

列的类型:

mysql中从dual查询24小时_数据_39

数字类型

整数: tinyint、smallint、mediumint、int、bigint
浮点数: float、double、real、decimal
日期和时间: date、time、datetime、timestamp、year

字符串类型
字符串: char、varchar
文本: tinytext、text、mediumtext、longtext

二进制(可用来存储图片、音乐等): tinyblob、blob、mediumblob、longblob

列的约束:

mysql中从dual查询24小时_数据库_40


4.5、管理数据


4.5.1、添加数据

双击新建好的表名,打开表,就可以添加数据了。

mysql中从dual查询24小时_mysql中从dual查询24小时_41


4.5.2、删除数据

mysql中从dual查询24小时_数据库_42


4.5.3、修改表结构

如果想向现有的表中添加一列,则可以修改表结构:

mysql中从dual查询24小时_mysql中从dual查询24小时_43


4.5.4、外键

mysql中从dual查询24小时_MySQL_44

上面这个学生表是有些问题的:

a)、不便于修改,比如教室换成了305教室,则每个学员都要修改

b)、数据冗余,大量的重复数据

将表拆分成两个,分解后问题解决,如下图所示:

mysql中从dual查询24小时_mysql中从dual查询24小时_45

这里的班级编号就是外键,可以空,但不为空时他的值一定在要引用表中存在。如果学生表中的编号是主键这里就不应该重复,外键则可以重复也允许为空。

添加外键:

班级表:

mysql中从dual查询24小时_mysql中从dual查询24小时_46

学生表:

mysql中从dual查询24小时_mysql中从dual查询24小时_47

添加外键:

mysql中从dual查询24小时_数据_48

删除与更新时可以实现级联更新与删除,当更新设置为CASCADE时主键变化引用主键的表也会一起变化,当删除设置为CASCADE时删除主键表,引用的记录都将被删除。

mysql中从dual查询24小时_mysql中从dual查询24小时_49

o_id </span><span >int</span> auto_increment <span >primary</span> <span >key</span><span >,
     o_buyer_id </span><span >int</span><span >,
     o_seller_id </span><span >int</span><span >,
     o_totalprices </span><span >double</span><span >,
     o_state </span><span >varchar</span>(<span >50</span><span >),
     o_information </span><span >varchar</span>(<span >200</span><span >),
     </span><span >foreign</span> <span >key</span>(o_buyer_id) <span >references</span><span > s_user(u_id),      #外链到s_user表的u_id字段
     </span><span >foreign</span> <span >key</span>(o_seller_id) <span >references</span><span > s_user(u_id)      #外链到s_user表的u_id字段

mysql中从dual查询24小时_数据_50

 


4.5.5、唯一键

唯一键,也称(唯一约束),和主键的区别是可以为有多个唯一键并且值可以为NULL,但NULL也不能重复,也就是说只能有一行的值为NULL。它会隐式的创建唯一索引。

设置方法:索引 --> 添加索引 -->  栏位名 添加你想设置唯一约束的列 --> 索引类型选择 Unique 

mysql中从dual查询24小时_MySQL_51

mysql中从dual查询24小时_数据库_52

#查询
select id,name from yuangong
select * from yuangong
select * from yuangong where salary>5000
增加
INSERT into yuangong(name,salary,bumenId,mobile) value('张为剑',2190.6,2,19889007867);
INSERT into yuangong(name,salary,bumenId,mobile) value('张娜拉',9871.6,1,19889007777);
修改
update yuangong set salary=salary+1 where id=7
删除
INSERT into yuangong(name,salary,bumenId,mobile) value('张拉拉',9871.6,1,19889007777);
delete from yuangong where id=8

mysql中从dual查询24小时_数据库_53

 


4.6、上机练习

1、请创建一个新的数据库叫HR,在HR数据库中添加EMP表,EMP表的表结构如下所示

EMP表:员工信息

名称

类型

描述

1

EMPNO

int

雇员的编号,主键,自动增长

2

ENAME

VARCHAR(10)

雇员的姓名,由10位字符所组成,不为空,唯一键

3

JOB

VARCHAR(9)

雇员的职位

4

MGR

int

雇员对应的领导编号,领导也是雇员,可空(可删除这一列)

5

HIREDATE

TimeStamp

雇员的雇佣日期,默认为当前日期

6

SAL

Numeric(7,2)

基本工资,其中有两位小数,五位整数,一共是七位

7

COMM

Numeric(7,2)

奖金,佣金

8

DEPTNO

int

雇员所在的部门编号,可空,外键fk_deptno

9

DETAIL

Text

备注,可空

Dept:部门表

名称

类型

描述

1

DeptNO

int

部门的编号,主键,自动增长

2

DNAME

VARCHAR(10)

部门名,由50位字符所组成,不为空,唯一键

3

DTel

VARCHAR(10)

电话,可空

2、根据上面的表结构完成表的创建,表名为emp

3、在表中添加5条以上的数据

4、完成下列查询要求

4.1查询所有员工信息

4.2查询所有工资介于2000-5000间的员工姓名、职位与工资

4.3查询所有姓“张”的员工

4.4 按工资降序查询出2014年到2015年间入职的员工

4.5、将工资普遍上调20%

4.6、将工资低于3000元的员工奖金修改为工资的2.8倍

4.7、删除编号为5或者姓“王”的员工


五、使用SQL访问MySQL数据库


5.0、定义学生表Stu、商品类型与商品表

(id编号,name姓名,sex性别,age年龄,...)

脚本:

mysql中从dual查询24小时_数据_54

id
title
category_id
add_date
picture
state
category_id
id

mysql中从dual查询24小时_mysql中从dual查询24小时_55

 


5.0.1、新建数据库

mysql中从dual查询24小时_数据库_56


5.0.2、新建表

mysql中从dual查询24小时_数据_57


5.0.3、新建查询

mysql中从dual查询24小时_数据_58


5.1、增加数据

insert 语句可以用来将一行或多行数据插到数据库表中, 使用的一般形式如下:

Insert into 表名(字段列表) values (值列表);

insert [into] 表名 [(列名1, 列名2, 列名3, ...)] values (值1, 值2, 值3, ...);

insert into students values(NULL, "张三", "男", 20, "18889009876");

有时我们只需要插入部分数据, 或者不按照列的顺序进行插入, 可以使用这样的形式进行插入:

insert into students (name, sex, age) values("李四", "女", 21);

 

mysql中从dual查询24小时_mysql中从dual查询24小时_59

mysql中从dual查询24小时_MySQL_60

mysql中从dual查询24小时_MySQL_61

#1、添加数据
insert into stu(name,sex,age) values('张学友','男',18);
insert into stu(name,sex,age) values('张娜拉','女',73);
insert into stu(name,sex,age) values('张家辉','男',23);
insert into stu(name,sex,age) values('张汇美','女',85);
insert into stu(name,sex,age) values('张铁林','男',35);

mysql中从dual查询24小时_MySQL_62

 


5.2、查询数据

select 语句常用来根据一定的查询规则到数据库中获取数据, 其基本的用法为:

select 字段名 from 表名称 [查询条件];

查询学生表中的所有信息:select * from students;

查询学生表中所有的name与age信息:select name, age from students;

也可以使用通配符 * 查询表中所有的内容, 语句: select * from students;

mysql中从dual查询24小时_mysql中从dual查询24小时_63

#1、添加数据
insert into stu(name,sex,age) values('张学友','男',18);
insert into stu(name,sex,age) values('张娜拉','女',73);
insert into stu(name,sex,age) values('张家辉','男',23);
insert into stu(name,sex,age) values('张汇美','女',85);
insert into stu(name,sex,age) values('张铁林','男',35);
insert into stu(name,sex,age) values('张国立','男',99);

2、查询数据


2.1、查询所有学生

select id,name,sex,age from stu;

2.2、查询年龄大于80岁女学生

select id,name,sex,age from stu where age>80 and sex='女';

mysql中从dual查询24小时_数据库_64

结果:

mysql中从dual查询24小时_MySQL_65


5.2.1、表达式与条件查询

mysql中从dual查询24小时_数据库_66

where 关键词用于指定查询条件, 用法形式为: select 列名称 from 表名称 where 条件;

以查询所有性别为女的信息为例, 输入查询语句: select * from students where sex="女";

where 子句不仅仅支持 "where 列名 = 值" 这种名等于值的查询形式, 对一般的比较运算的运算符都是支持的, 例如 =、>、<、>=、<、!= 以及一些扩展运算符 is [not] null、in、like 等等。 还可以对查询条件使用 or 和 and 进行组合查询, 以后还会学到更加高级的条件查询方式, 这里不再多做介绍。

示例:

查询年龄在21岁以上的所有人信息: select * from students where age > 21;

查询名字中带有 "王" 字的所有人信息: select * from students where name like "%王%";

查询id小于5且年龄大于20的所有人信息: select * from students where id<5 and age>20;


5.2.2、聚合函数

mysql中从dual查询24小时_数据库_67

获得学生总人数:select count(*) from students

获得学生平均分:select avg(mark) from students

获得最高成绩:select max(mark) from students

获得最低成绩:select min(mark) from students

获得学生总成绩:select sum(mark) from students


5.3、删除数据

delete from 表名 [删除条件];

删除表中所有数据:delete from students;

删除id为10的行: delete from students where id=10;

删除所有年龄小于88岁的数据: delete from students where age<88;

mysql中从dual查询24小时_数据_68

#1、添加数据-----
insert into stu(name,sex,age) values('张学友','男',18);
insert into stu(name,sex,age) values('张娜拉','女',73);
insert into stu(name,sex,age) values('张家辉','男',23);
insert into stu(name,sex,age) values('张汇美','女',85);
insert into stu(name,sex,age) values('张铁林','男',35);
insert into stu(name,sex,age) values('张国立','男',99);

2、查询数据-----


#2.1、查询所有学生
select id,name,sex,age from stu;

2.2、查询年龄大于80岁女学生

select id,name,sex,age from stu where age>80 and sex='女';

2.3、查询平均年龄

select AVG(age) from stu where sex='女';

3、修改数据-----


3.1、将编号为1的学生年龄加大1岁

update stu set age=age+1 where id=1;

3.2、将80岁以上的女学生年龄修改为90岁且将姓名后增加“老人”

CONCAT(str1,str2,...) 连接字符串
update stu set age=90,name=CONCAT(name,'(老人)') where age>=80 and sex='女';

3.3、将编号4的学生名字修改为张汇美

update stu set name='张汇美' where id=4;

4、删除数据-----


4.1、删除年龄大于70岁的学生

delete from stu where age>70;

4.2、删除所有学生

delete from stu;

mysql中从dual查询24小时_数据_69


5.4、更新数据

update 语句可用来修改表中的数据, 基本的使用形式为:

update 表名称 set 列名称=新值 where 更新条件;

Update 表名 set 字段=值 列表 更新条件

使用示例:

将id为5的手机号改为默认的"-": update students set tel=default where id=5;

将所有人的年龄增加1: update students set age=age+1;

将手机号为 13723887766 的姓名改为 "张果", 年龄改为 19: update students set name="张果", age=19 where tel="13723887766";


5.5、修改表

alter table 语句用于创建后对表的修改, 基础用法如下:


5.5.1、添加列

基本形式: alter table 表名 add 列名 列数据类型 [after 插入位置];

示例:

在表的最后追加列 address: alter table students add address char(60);

在名为 age 的列后插入列 birthday: alter table students add birthday date after age;


5.5.2、修改列

基本形式: alter table 表名 change 列名称 列新名称 新数据类型;

示例:

将表 tel 列改名为 phone: alter table students change tel phone char(12) default "-";

将 name 列的数据类型改为 char(9): alter table students change name name char(9) not null;


5.5.3、删除列

基本形式: alter table 表名 drop 列名称;

示例:

删除 age 列: alter table students drop age;


5.5.4、重命名表

基本形式: alter table 表名 rename 新表名;

示例:

重命名 students 表为temp: alter table students rename temp;


5.5.5、删除表

基本形式: drop table 表名;

示例: 删除students表: drop table students;


5.5.6、删除数据库

基本形式: drop database 数据库名;

示例: 删除lcoa数据库: drop database lcoa;


5.5.7、一千行MySQL笔记

mysql中从dual查询24小时_MySQL_70

</span><span >int</span><span >(M)    M表示总位数
</span><span >-</span><span > 默认存在符号位,unsigned 属性修改
</span><span >-</span><span > 显示宽度,如果某个数不够定义字段时设置的位数,则前面以0补填,zerofill 属性修改
    例:</span><span >int</span>(<span >5</span>)    插入一个数<span >'</span><span >123</span><span >'</span>,补填后为<span >'</span><span >00123</span><span >'</span>
<span >-</span><span > 在满足要求的情况下,越小越好。
</span><span >-</span> 1表示bool值真,0表示bool值假。MySQL没有布尔类型,通过整型0和1表示。常用tinyint(<span >1</span><span >)表示布尔型。

t1_t2_fk
作用:保持数据一致性,完整性,主要目的是控制存储在外键表(从表)中的数据。

MySQL中,可以对InnoDB引擎使用外键约束:
语法:
</span><span >foreign</span> <span >key</span> (外键字段) <span >references</span> 主表名 (关联字段) <span >[</span><span >主表记录删除时的动作</span><span >]</span> <span >[</span><span >主表记录更新时的动作</span><span >]</span><span >
此时需要检测一个从表的外键需要约束为主表的已存在的值。外键在没有关联的情况下,可以设置为null.前提是该外键列,没有not </span><span >null</span><span >。

可以不指定主表记录更改或更新时的动作,那么此时主表的操作被拒绝。
如果指定了 </span><span >on</span> <span >update</span> 或 <span >on</span> <span >delete</span><span >:在删除或更新时,有如下几个操作可以选择:
</span><span >1</span>. <span >cascade</span><span >,级联操作。主表数据被更新(主键值更新),从表也被更新(外键值更新)。主表记录被删除,从表相关记录也被删除。
</span><span >2</span>. <span >set</span> <span >null</span><span >,设置为null。主表数据被更新(主键值更新),从表的外键被设置为null。主表记录被删除,从表相关记录外键被设置成null。但注意,要求该外键列,没有not null属性约束。
</span><span >3</span>. <span >restrict</span><span >,拒绝父表删除和更新。

注意,外键只被InnoDB存储引擎所支持。其他引擎是不支持的。

以下</span><span >[</span><span >合计函数</span><span >]</span>需配合 <span >group</span> <span >by</span><span > 使用:
</span><span >count</span> 返回不同的非NULL值数目    <span >count</span>(<span >*</span>)、<span >count</span><span >(字段)
</span><span >sum</span><span > 求和
</span><span >max</span><span > 求最大值
</span><span >min</span><span > 求最小值
</span><span >avg</span><span > 求平均值
group_concat 返回带有来自一个组的连接的非NULL值的字符串结果。组内字符串连接。

</span><span >--</span><span > 特殊运算符</span>
<span >!=</span> <span >all</span>()    相当于 <span >not</span> <span >in</span>
<span >=</span> <span >some</span>()    相当于 <span >in</span>。<span >any</span> 是 <span >some</span><span > 的别名
</span><span >!=</span> <span >some</span>()    不等同于 <span >not</span> <span >in</span><span >,不等于其中某一个。
</span><span >all</span>, <span >some</span><span > 可以配合其他运算符一起使用。

</span><span >--</span><span > 交叉连接 cross join</span>

</span><span >-</span><span > 注意:在函数内是可以使用全局变量(用户自定义的变量)

</span><span >-</span><span > 变量被定义后,在整个会话周期都有效(登录到退出)

</span><span >--</span><span > 退出循环</span>

</span><span >-</span><span > 函数名,应该合法的标识符,并且不应该与已有的关键字冲突。
</span><span >-</span><span > 一个函数应该属于某个数据库,可以使用db_name.funciton_name的形式执行当前函数所属数据库,否则为当前数据库。
</span><span >-</span><span > 参数部分,由"参数名"和"参数类型"组成。多个参数用逗号隔开。
</span><span >-</span><span > 函数体由多条可用的mysql语句,流程控制,变量声明等语句构成。
</span><span >-</span> 多条语句应该使用 <span >begin</span>...<span >end</span><span > 语句块包含。
</span><span >-</span> 一定要有 <span >return</span><span > 返回值语句。

mysql中从dual查询24小时_MySQL_71


5.5.8、常用的SQL

mysql中从dual查询24小时_数据库_72

AddressId
UserId
Province
City
County
Street
RevName
PostCode
Mobile
Phone
IsDefault
ArticleCommentId
ArticleId
UserId
ArticleCommentContent
ArticleCommentDate
ArticleCommentState
ArticleRemark
ArticleCommentReserver1
ArticleCommentReserver2
ArticleTypeId
ArticleTypeName
ArticleTypeState
ArticleTypeDesc
ArticleTypePicture
ArticleTypeReserve1
ArticleTypeReserve2
ArticleId
ArticleTypeId
ArticleTitle
ArticleContent
ArticleDate
ArticleAuthor
ArticleFileName
ArticleThumbNail
ArticleAddition
ArticleLevel
ArticleIsAllowComment
ArticleState
ArticleHotCount
ArticleReserve1
ArticleReserve2
ArticleReserve3
SubId
DictId
SubName
SubDesc
SubReserve1
DictId
DictName
DictDesc
DictReserve1
OrderPdtId
Id
UserId
OrderId
PdtAmount
PdtPrice
PdtReserve1
PdtReserve2
OrderId
AddressId
OrderState
ExpressNO
ExpressName
PayMoney
PayedMoney
SendInfo
BuyDate
PayDate
SendDate
ReceivDate
OrderMessage
UserId
OrderReserve1
OrderReserve2
OrderReserve3
ProductCommentId
ProductId
UserId
ProductCommentContent
ProductCommentDate
ProductCommentState
ProductCommentRemark
ProductCommentReserve1
ProductCommentReserve2
Id
Name
SubIdColor
SubIdBrand
SubIdInlay
SubIdMoral
SubIdMaterial
SubIdTopLevel
MarketPrice
MyPrice
Discount
Picture
Amount
Description
State
AddDate
Hang
RawStone
Size
ExpressageName
Expressage
AllowComment
Reserve1
Reserve2
Reserve3
UserId
UserName
Password
Email
Sex
State
RightCode
RegDate
RegIP
LastLoginDate
UserReserve1
UserReserve2
UserReserve3

mysql中从dual查询24小时_mysql中从dual查询24小时_73


5.6、MySQL与SQLServer的区别

ER图、分页、差异、Java连接MySQL

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。


5.6.1、区别一

mysql中从dual查询24小时_数据_74

1 mysql支持enum,和set类型,sql server不支持
2 mysql不支持nchar,nvarchar,ntext类型
3 mysql的递增语句是AUTO_INCREMENT,而mssql是identity(1,1)
4 msms默认到处表创建语句的默认值表示是((0)),而在mysql里面是不允许带两括号的
5 mysql需要为表指定存储类型
6 mssql识别符是[],[type]表示他区别于关键字,但是mysql却是 `,也就是按键1左边的那个符号
7 mssql支持getdate()方法获取当前时间日期,但是mysql里面可以分日期类型和时间类型,获取当前日期是cur_date(),当前完整时间是 now()函数
8 mssql不支持replace into 语句,但是在最新的sql20008里面,也支持merge语法
9 mysql支持insert into table1 set t1 = ‘’, t2 = ‘’ ,但是mssql不支持这样写
10 mysql支持insert into tabl1 values (1,1), (1,1), (1,1), (1,1), (1,1), (1,1), (1,1)
11 mssql不支持limit语句,是非常遗憾的,只能用top 取代limt 0,N,row_number() over()函数取代limit N,M
12 mysql在创建表时要为每个表指定一个存储引擎类型,而mssql只支持一种存储引擎
13 mysql不支持默认值为当前时间的datetime类型(mssql很容易做到),在mysql里面是用timestamp类型
14 mssql里面检查是否有这个表再删除,需要这样:
if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'uc_newpm')   and   OBJECTPROPERTY(id,   N'IsUserTable')   =   1)
但是在mysql里面只需要 DROP TABLE IF EXISTS cdb_forums;
15 mysql支持无符号型的整数,那么比不支持无符号型的mssql就能多出一倍的最大数存储
16 mysql不支持在mssql里面使用非常方便的varchar(max)类型,这个类型在mssql里面既可做一般数据存储,也可以做blob数据存储
17 mysql创建非聚集索引只需要在创建表的时候指定为key就行,比如:KEY displayorder (fid,displayorder) 在mssql里面必须要:create unique nonclustered index index_uc_protectedmembers_username_appid on dbo.uc_protectedmembers
(username asc,appid asc)
18 mysql text字段类型不允许有默认值
19mysql的一个表的总共字段长度不超过65XXX。
20一个很表面的区别就是mysql的安装特别简单,而且文件大小才110M(非安装版),相比微软这个庞然大物,安装进度来说简直就是.....
21mysql的管理工具有几个比较好的,mysql_front,和官方那个套件,不过都没有SSMS的使用方便,这是mysql很大的一个缺点。
22mysql的存储过程只是出现在最新的版本中,稳定性和性能可能不如mssql。
23 同样的负载压力,mysql要消耗更少的CPU和内存,mssql的确是很耗资源。
24php连接mysql和mssql的方式都差不多,只需要将函数的mysql替换成mssql即可。
25mysql支持date,time,year类型,mssql到2008才支持date和time。

mysql中从dual查询24小时_数据库_75

 


5.6.2、区别二

mysql中从dual查询24小时_mysql中从dual查询24小时_76

meijut
f1
f2
f3

mysql中从dual查询24小时_MySQL_77


六、使用JDBC访问MySQL


6.1、下载驱动

mysql中从dual查询24小时_MySQL_78


6.2、JDBC访问MySQL

 示例一:

mysql中从dual查询24小时_数据库_79

</span><span >static</span><span > {
    </span><span >try</span><span > {
        </span><span >/*</span><span >加载驱动</span><span >*/</span><span >
        Class.forName(</span>"com.mysql.jdbc.Driver"<span >);
    } </span><span >catch</span><span > (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

</span><span >public</span> <span >static</span> <span >void</span><span > main(String[] args) {
    </span><span >/**</span><span >添加</span><span >*/</span><span >
    insert();
    </span><span >/**</span><span >查询</span><span >*/</span><span >
    select();
}

</span><span >/**</span><span >查询</span><span >*/</span>
<span >private</span> <span >static</span> <span >void</span><span > select() {
    </span><span >try</span><span > {
        </span><span >/**</span><span >获得连接对象</span><span >*/</span><span >
        Connection conn </span>= DriverManager.getConnection("jdbc:mysql://localhost:3306/nfmall?useUnicode=true&characterEncoding=UTF-8", "root", "123"<span >);

        </span><span >/**</span><span >创建sql命令对象</span><span >*/</span><span >
        PreparedStatement statement</span>=conn.prepareStatement("SELECT goods.id, goods.title, goods.category_id, goods.add_date, goods.picture, goods.state, goods.details, goods.price, category.`name`, category.parentId FROM goods INNER JOIN category ON goods.category_id = category.id where price>=?"<span >);
        </span><span >//</span><span >设置参数</span>
        statement.setInt(1,1000<span >);
        </span><span >//</span><span >执行并获得结果集</span>
        ResultSet result=<span >statement.executeQuery();
        </span><span >//</span><span >遍历结果集</span>
        <span >while</span><span > (result.next()){
            </span><span >//</span><span >在当前行根据列名获得数据</span>
            String title=result .getString("title"<span >);
            BigDecimal price</span>=result.getBigDecimal("price"<span >);
            System.out.println(title</span>+"\t"+<span >price);
        }

        </span><span >//</span><span >关闭</span>

</span><span >/**</span><span >添加</span><span >*/</span>
<span >private</span> <span >static</span> <span >void</span><span > insert() {
    </span><span >try</span><span > {
        </span><span >//</span><span >输入用的扫描器</span>
        Scanner input=<span >new</span><span > Scanner(System.in);

        </span><span >/**</span><span >获得连接对象</span><span >*/</span><span >
        Connection conn </span>= DriverManager.getConnection("jdbc:mysql://localhost:3306/nfmall?useUnicode=true&characterEncoding=UTF-8", "root", "123"<span >);

        </span><span >/**</span><span >创建sql命令对象</span><span >*/</span><span >
        PreparedStatement statement</span>=conn.prepareStatement("insert into goods(title,category_id,picture,price,details,state) VALUES(?,?,?,?,?,default);"<span >);

        System.out.print(</span>"名称:"<span >);
        String title</span>=<span >input.next();
        System.out.print(</span>"类型:"<span >);
        </span><span >int</span> cateId=<span >input.nextInt();
        System.out.print(</span>"图片:"<span >);
        String picture</span>=<span >input.next();
        System.out.print(</span>"价格:"<span >);
        BigDecimal price</span>=<span >input.nextBigDecimal();
        System.out.print(</span>"详细:"<span >);
        String details</span>=<span >input.next();

        </span><span >//</span><span >设置参数</span>
        statement.setString(1<span >,title);
        statement.setInt(</span>2<span >,cateId);
        statement.setString(</span>3<span >,picture);
        statement.setBigDecimal(</span>4<span >,price);
        statement.setString(</span>5<span >,details);

        </span><span >//</span><span >执行并获得影响行数</span>
        <span >int</span> rows=<span >statement.executeUpdate();

        System.out.println(</span>"执行:"+(rows>0?"成功":"失败"<span >));

        </span><span >//</span><span >关闭</span>

mysql中从dual查询24小时_数据_80

结果:

mysql中从dual查询24小时_mysql中从dual查询24小时_81

JDBC工具类(带简单映射):

mysql中从dual查询24小时_数据库_82

mysql中从dual查询24小时_数据_83

</span><span >public</span> <span >static</span> String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver"<span >;
</span><span >public</span> <span >static</span> String URL = "jdbc:sqlserver://localhost:1433;databasename=pubs"<span >;
</span><span >public</span> <span >static</span> String USER_NAME = "sa"<span >;
</span><span >public</span> <span >static</span> String PASSWORD = "sa"<span >;

</span><span >static</span><span > {
    </span><span >try</span><span > {
        Class.forName(DRIVER);
    } </span><span >catch</span><span > (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

</span><span >private</span><span > JDBCUtils() {

}

</span><span >/**</span><span >
 * Get connection
 * 
 * </span><span >@return</span>
 <span >*/</span>
<span >public</span> <span >static</span><span > Connection getconnnection() {
    Connection con </span>= <span >null</span><span >;
    </span><span >try</span><span > {
        con </span>=<span > DriverManager.getConnection(URL, USER_NAME, PASSWORD);
    } </span><span >catch</span><span > (SQLException e) {
        e.printStackTrace();
    }
    </span><span >return</span><span > con;
}

</span><span >/**</span><span >
 * Close connection
 * 
 * </span><span >@param</span><span > rs
 * </span><span >@param</span><span > st
 * </span><span >@param</span><span > con
 </span><span >*/</span>
<span >public</span> <span >static</span> <span >void</span><span > close(ResultSet rs, Statement st, Connection con) {
    </span><span >try</span><span > {
        </span><span >try</span><span > {
            </span><span >if</span> (rs != <span >null</span><span >) {
                rs.close();
            }
        } </span><span >finally</span><span > {
            </span><span >try</span><span > {
                </span><span >if</span> (st != <span >null</span><span >) {
                    st.close();
                }
            } </span><span >finally</span><span > {
                </span><span >if</span> (con != <span >null</span><span >)
                    con.close();
            }
        }
    } </span><span >catch</span><span > (SQLException e) {
        e.printStackTrace();
    }
}

</span><span >/**</span><span >
 * Close connection
 * 
 * </span><span >@param</span><span > rs
 </span><span >*/</span>
<span >public</span> <span >static</span> <span >void</span><span > close(ResultSet rs) {
    Statement st </span>= <span >null</span><span >;
    Connection con </span>= <span >null</span><span >;
    </span><span >try</span><span > {
        </span><span >try</span><span > {
            </span><span >if</span> (rs != <span >null</span><span >) {
                st </span>=<span > rs.getStatement();
                rs.close();
            }
        } </span><span >finally</span><span > {
            </span><span >try</span><span > {
                </span><span >if</span> (st != <span >null</span><span >) {
                    con </span>=<span > st.getConnection();
                    st.close();
                }
            } </span><span >finally</span><span > {
                </span><span >if</span> (con != <span >null</span><span >) {
                    con.close();
                }
            }
        }
    } </span><span >catch</span><span > (SQLException e) {
        e.printStackTrace();
    }
}

</span><span >/**</span><span >
 * Close connection
 * 
 * </span><span >@param</span><span > st
 * </span><span >@param</span><span > con
 </span><span >*/</span>
<span >public</span> <span >static</span> <span >void</span><span > close(Statement st, Connection con) {
    </span><span >try</span><span > {
        </span><span >try</span><span > {
            </span><span >if</span> (st != <span >null</span><span >) {
                st.close();
            }
        } </span><span >finally</span><span > {
            </span><span >if</span> (con != <span >null</span><span >)
                con.close();
        }
    } </span><span >catch</span><span > (SQLException e) {
        e.printStackTrace();
    }
}

</span><span >/**</span><span >
 * insert/update/delete
 * 
 * </span><span >@param</span><span > sql
 * </span><span >@param</span><span > args
 * </span><span >@return</span>
 <span >*/</span>
<span >public</span> <span >static</span> <span >int</span><span > update(String sql, Object... args) {
    </span><span >int</span> result = 0<span >;
    Connection con </span>=<span > getconnnection();
    PreparedStatement ps </span>= <span >null</span><span >;
    </span><span >try</span><span > {
        ps </span>=<span > con.prepareStatement(sql);
        </span><span >if</span> (args != <span >null</span><span >) {
            </span><span >for</span> (<span >int</span> i = 0; i < args.length; i++<span >) {
                ps.setObject((i </span>+ 1<span >), args[i]);
            }
        }
        result </span>=<span > ps.executeUpdate();
    } </span><span >catch</span><span > (SQLException e) {
        e.printStackTrace();
    } </span><span >finally</span><span > {
        close(ps, con);
    }

    </span><span >return</span><span > result;
}

</span><span >/**</span><span >
 * query, because need to manually close the resource, so not recommended
 * for use it
 * 
 * </span><span >@param</span><span > sql
 * </span><span >@param</span><span > args
 * </span><span >@return</span><span > ResultSet
 </span><span >*/</span><span >
@Deprecated
</span><span >public</span> <span >static</span><span > ResultSet query(String sql, Object... args) {
    ResultSet result </span>= <span >null</span><span >;
    Connection con </span>=<span > getconnnection();
    PreparedStatement ps </span>= <span >null</span><span >;
    </span><span >try</span><span > {
        ps </span>=<span > con.prepareStatement(sql);
        </span><span >if</span> (args != <span >null</span><span >) {
            </span><span >for</span> (<span >int</span> i = 0; i < args.length; i++<span >) {
                ps.setObject((i </span>+ 1<span >), args[i]);
            }
        }
        result </span>=<span > ps.executeQuery();
    } </span><span >catch</span><span > (SQLException e) {
        e.printStackTrace();
    }
    </span><span >return</span><span > result;
}

</span><span >/**</span><span >
 * Query a single record
 * 
 * </span><span >@param</span><span > sql
 * </span><span >@param</span><span > args
 * </span><span >@return</span><span > Map<String,Object>
 </span><span >*/</span>
<span >public</span> <span >static</span> Map<String, Object><span > queryForMap(String sql, Object... args) {
    Map</span><String, Object> result = <span >new</span> HashMap<String, Object><span >();
    List</span><Map<String, Object>> list =<span > queryForList(sql, args);
    </span><span >if</span> (list.size() > 0<span >) {
        result </span>= list.get(0<span >);
    }
    </span><span >return</span><span > result;
}

</span><span >/**</span><span >
 * Query a single record
 * 
 * </span><span >@param</span><span > sql
 * </span><span >@param</span><span > args
 * </span><span >@return</span><span > <T>
 </span><span >*/</span>
<span >public</span> <span >static</span> <T> T queryForObject(String sql, Class<T><span > clz, Object... args) {
    T result </span>= <span >null</span><span >;
    List</span><T> list =<span > queryForList(sql, clz, args);
    </span><span >if</span> (list.size() > 0<span >) {
        result </span>= list.get(0<span >);
    }
    </span><span >return</span><span > result;
}

</span><span >/**</span><span >
 * Query a single record
 * 
 * </span><span >@param</span><span > sql
 * </span><span >@param</span><span > args
 * </span><span >@return</span><span > List<Map<String,Object>>
 </span><span >*/</span>
<span >public</span> <span >static</span> List<Map<String, Object>><span > queryForList(String sql, Object... args) {
    List</span><Map<String, Object>> result = <span >new</span> ArrayList<Map<String, Object>><span >();
    Connection con </span>= <span >null</span><span >;
    ResultSet rs </span>= <span >null</span><span >;
    PreparedStatement ps </span>= <span >null</span><span >;
    </span><span >try</span><span > {
        con </span>=<span > getconnnection();
        ps </span>=<span > con.prepareStatement(sql);
        </span><span >if</span> (args != <span >null</span><span >) {
            </span><span >for</span> (<span >int</span> i = 0; i < args.length; i++<span >) {
                ps.setObject((i </span>+ 1<span >), args[i]);
            }
        }
        rs </span>=<span > ps.executeQuery();
        ResultSetMetaData rsmd </span>=<span > rs.getMetaData();
        </span><span >int</span> columnCount =<span > rsmd.getColumnCount();
        </span><span >while</span><span > (rs.next()) {
            Map</span><String, Object> map = <span >new</span> HashMap<String, Object><span >();
            </span><span >for</span> (<span >int</span> i = 1; i <= columnCount; i++<span >) {
                map.put(rsmd.getColumnLabel(i), rs.getObject(i));
            }
            result.add(map);
        }
    } </span><span >catch</span><span > (SQLException e) {
        e.printStackTrace();
    } </span><span >finally</span><span > {
        close(rs, ps, con);
    }
    </span><span >return</span><span > result;
}

</span><span >/**</span><span >
 * Query a single record
 * 
 * </span><span >@param</span><span > sql
 * </span><span >@param</span><span > args
 * </span><span >@return</span><span > List<T>
 </span><span >*/</span>
<span >public</span> <span >static</span> <T> List<T> queryForList(String sql, Class<T><span > clz, Object... args) {
    List</span><T> result = <span >new</span> ArrayList<T><span >();
    Connection con </span>= <span >null</span><span >;
    PreparedStatement ps </span>= <span >null</span><span >;
    ResultSet rs </span>= <span >null</span><span >;
    </span><span >try</span><span > {
        con </span>=<span > getconnnection();
        ps </span>=<span > con.prepareStatement(sql);
        </span><span >if</span> (args != <span >null</span><span >) {
            </span><span >for</span> (<span >int</span> i = 0; i < args.length; i++<span >) {
                ps.setObject((i </span>+ 1<span >), args[i]);
            }
        }
        rs </span>=<span > ps.executeQuery();
        ResultSetMetaData rsmd </span>=<span > rs.getMetaData();
        </span><span >int</span> columnCount =<span > rsmd.getColumnCount();
        </span><span >while</span><span > (rs.next()) {
            T obj </span>=<span > clz.newInstance();
            </span><span >for</span> (<span >int</span> i = 1; i <= columnCount; i++<span >) {
                String columnName </span>=<span > rsmd.getColumnName(i);
                String methodName </span>= "set" + columnName.substring(0, 1<span >).toUpperCase()
                        </span>+ columnName.substring(1<span >, columnName.length());
                Method method[] </span>=<span > clz.getMethods();
                </span><span >for</span><span > (Method meth : method) {
                    </span><span >if</span><span > (methodName.equals(meth.getName())) {
                        meth.invoke(obj, rs.getObject(i));
                    }
                }
            }
            result.add(obj);
        }
    } </span><span >catch</span><span > (InstantiationException e) {
        e.printStackTrace();
    } </span><span >catch</span><span > (IllegalAccessException e) {
        e.printStackTrace();
    } </span><span >catch</span><span > (SQLException e) {
        e.printStackTrace();
    } </span><span >catch</span><span > (IllegalArgumentException e) {
        e.printStackTrace();
    } </span><span >catch</span><span > (InvocationTargetException e) {
        e.printStackTrace();
    } </span><span >finally</span><span > {
        close(rs, ps, con);
    }
    </span><span >return</span><span > result;
}

View Code


七、下载程序、帮助、视频

MySQL5.7.17安装包官网下载地址: https://dev.mysql.com/downloads/windows/installer/

视频:https://www.bilibili.com/video/av30777062/

文档中没有您可以查帮助:

mysql中从dual查询24小时_数据_84


八、作业


8.1、使用javascript实现身份证校验与信息提取。

校验:校验身份证是否正确,如出生的年月日,最后一位校验码是否符合规则

信息提取:位置,生日,性别;位置信息存储到MySQL数据库中,使用ajax获取

mysql中从dual查询24小时_数据_85

mysql中从dual查询24小时_数据_86

 身份证位置sql数据下载


8.2、SQL强化练习

8.3、请使用JDBC完成8.2中学生表的CRUD,只需在控制器台操作即可。