马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
目录
一、MYSQL入门
1.1 数据库概念
1.2数据库管理系统
1.3 MYSQL的特点:
1.4 Windows 上安装 MySQL
1.5 登录 MySQL
1.6 MySQL 连接
1.7 SQLyog 安装
二、SQL语句
2.1 SQL分类
2.1.1数据定义语言:简称DDL(Data Definition Language)
2.1.2数据操纵语言:简称DML(Data Manipulation Language)
2.1.3数据控制语言:简称DCL(Data Control Language)
2.1.4数据查询语言:简称DQL(Data Query Language)
2.2 SQL通用语法
2.2.1 SQL语句可以单行或多行书写,以分号结尾
2.2.2 可使用空格和缩进来增强语句的可读性
2.2.3 MySQL数据库的SQL语句不区分大小写
2.2.4 可以使用/**/的方式完成注释
2.3 数据范例
2.3.1 什么是数据范例
2.3.2 数据范例的分类
2.4 数据库操纵
2.4.1 检察数据库
2.4.2 删除数据库
三、数据库表操纵
3.1 数据库表操纵
3.2 主键约束
四、SQL查询语句 (一)
4.1 select基本查询语句
4.1.1 单列查询
4.1.2 多列查询
4.1.3 查询表中全部字段
4.2 distinct消除冗余
4.3 使用别名
4.3.1 as使用别名方式
4.3.2 不使用as方式
4.4 运算符
4.4.1 算术运算符(+、-、*、/、%)
4.4.2 逻辑运算符(=、<>、!=、<、<=、>、>=)
4.4.3 关系运算符(and or not)
4.5 group by分组
4.6 having分组条件
4.7 order by排序
4.8 limit分页
4.9 in操纵
4.10 范围操纵
4.11 模糊查询:like
五、SQL查询语句(二)
5.1 多表查询
5.1.1 为什么要使用多表查询
5.1.2 where子句多表查询
5.1.2 join子句多表查询.
5.2 连接
5.2.1 内连接(INNER JOIN)
5.2.2 左外连接(LEFT JOIN)
5.2.3 右外连接(RIGHT JOIN)
5.2.4 全外连接(FULL JOIN)
5.3 子查询
5.3.1 比力子查询
5.3.2 ANY子查询
5.3.3 IN子查询
5.3.4 SOME子查询
5.3.5 ALL子查询
六、JDBC操纵数据库
6.1 JDBC的各个类和接口
6.2 JDBC连接数据库的步调
6.2.1 创建Java项目
6.2.2 创建文件夹lib,粘贴jar包
6.2.3 创建Java类,写好主方法
6.2.4 开始Coding !!!
6.3 创建表tb_book
6.3.1 表的设计
6.3.2 表中的数据
6.4 web工程项目配置
6.5 jdbc操纵实现增编削查
6.5.1 实现查询图书
6.5.2 实现添加图书
6.5.3 实现修改图书
6.5.4 实现删除图书
七、总结
一、MYSQL入门
1.1 数据库概念
数据库(Database)是按照数据布局来组织、存储和管理数据的堆栈。
1.2数据库管理系统
数据库管理系统简称dbms是科学组织和储存数据,对数据库举行同一的管理和控制,以保证数据库的安全性和完整性,高效地获取和维护数据的系统软件。
1.3 MYSQL的特点:
1、 数据以表格的情势出现
2、 每行为各种记载名称
3、 每列为记载名称所对应的数据域
4、许多的行和列组成一张表单
5、若干的表单组成database
1.4 Windows 上安装 MySQL
第一步:下载所需的安装包
打开网址:MySQL :: Download MySQL Community Server , 如下所示 :
在弹出的第二个页面中,选择点击“No thanks, just start my download.” 跳过注册/登录帐号环节直接下载。如下图所示 :
然后,耐烦等待下载完成…
第二步:压缩到指定目录
预备好一个安装 MySQL 程序的目录,如:D:/software
在本教程中,您已经学会了怎样使用MySQL安装程序在Windows系统中安装MySQL,下载MySQL示例数据库并将其加载到MySQL服务器中,以通过此MySQL教程练习和学习MySQL。
这里解压后的目录为:D:\software\mysql-5.7.18-winx64 , 此目录下的文件如下所示 :
第三步:启动MySQL服务器
以管理员身份打开命令行,进入 MySQL 服务器安装的目录:D:\software\mysql-5.7.18-winx64\bin ,实行以下命令启动 MySQL
- Microsoft Windows [版本 10.0.10586]
- (c) 2015 Microsoft Corporation。保留所有权利。
- C:\WINDOWS\system32>D:
- D:\>cd software\mysql-5.7.18-winx64\bin
- D:\software\mysql-5.7.18-winx64\bin>mysqld -install
- Service successfully installed.
- D:\software\mysql-5.7.18-winx64\bin>net start mysql
- MySQL 服务正在启动 ..
- MySQL 服务已经启动成功。
- D:\software\mysql-5.7.18-winx64\bin>
复制代码 如果有提示如下错误 :
- D:\software\mysql-5.7.18-winx64\bin> mysqld.exe
- mysqld: Can't change dir to 'D:\software\mysql-5.7.18-winx64\data' (Errcode: 2 - No such file or directory)
- 2017-07-14T18:48:51.023897Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
- ... ...
- 2017-07-14T18:48:51.039516Z 0 [Note] Binlog end
- 2017-07-14T18:48:51.039516Z 0 [Note] mysqld.exe: Shutdown complete
复制代码 上面错误提示中,已经说明了:
- mysqld: Can't change dir to 'D:\software\mysql-5.7.18-winx64\data' (Errcode: 2 - No such file or directory)
复制代码 则必要在创建一个目录:D:\software\mysql-5.7.18-winx64\data\ ,如今我们就来创建这个目录,在创建目录完成后重新实行 mysqld -install 启动 MySQL 服务器 -
一定要注意两个问题,切记!
第一: 以管理员自身份打开CMD;
第二:用cd命令进入到你MySQL文件的解压路径。
第四步:连接MySQL服务器
服务启动成功之后,就可以连接/登录MySQL服务器了,打开命令提交符界面输入mysql -u root -p 或 mysql -h localhost -u root -p(第一次登录没有暗码,直接按回车过),登录成功,但是登录成功后,不能实行任何操纵,MySQL服务器要求您必须设置暗码再实行其它操纵。
假设我们登录成功后,要检察当前目录下所数据名称(实行查询:show databases),但它提示要先设置暗码。完整的过程如下所示 -
- D:\software\mysql-5.7.18-winx64\bin>mysql -hlocalhost -uroot -p
- Enter password:
- Welcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is 4
- Server version: 5.7.9
- Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
- Oracle is a registered trademark of Oracle Corporation and/or its
- affiliates. Other names may be trademarks of their respective
- owners.
- Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
- mysql> show databases;
- ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
- mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
- Query OK, 0 rows affected (0.08 sec)
- mysql> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | mysql |
- | performance_schema |
- +--------------------+
- 6 rows in set (0.11 sec)
- mysql>
复制代码 有关解压包安装MySQl服务器就这样完成了~,如果想要使用在线安装的方式来安装MySQL
请参考: MySQL :: MySQL 5.7 Reference Manual :: 2.3.3 MySQL Installer for Windows
1.5 登录 MySQL
当 MySQL 服务已经运行时, 我们可以通过 MySQL 自带的客户端工具登录到 MySQL 数据库中, 首先打开命令提示符, 输入以下格式的定名:
参数说明:
- -h : 指定客户端所要登录的 MySQL 主机名, 登录本机(localhost 或 127.0.0.1)该参数可以省略;
- -u : 登录的用户名;
- -p : 告诉服务器将会使用一个暗码来登录, 如果所要登录的用户名暗码为空, 可以忽略此选项。
如果我们要登录本机的 MySQL 数据库,只必要输入以下命令即可:
按回车确认, 如果安装精确且 MySQL 正在运行, 会得到以下响应:
若暗码存在, 输入暗码登录, 不存在则直接按回车登录。登录成功后你将会看到 Welcome to the MySQL monitor... 的提示语。
然后命令提示符会一直以 mysql> 加一个闪耀的光标等待命令的输入, 输入 exit 或 quit 退出登录。
1.6 MySQL 连接
按照提示输入暗码,并按下 Enter 键。
在登录成功后会出现 mysql> 命令提示窗口,你可以在上面实行任何 SQL 语句。
以上命令实行后,登录成功输出效果如下:
- Welcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is 2854760 to server version: 5.0.9
- Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
复制代码 在以上实例中,我们使用了 root 用户登录到 MySQL 服务器,当然你也可以使用其他 MySQL 用户登录。
如果用户权限足够,任何用户都可以在 MySQL 的命令提示窗口中举行 SQL 操纵。
成功连接到 MySQL 后,你可以在命令行中直接实行 SQL 查询。
列出全部可用的数据库:
选择要使用的数据库:
列出所选数据库中的全部表:
退出 mysql> 命令提示窗口可以使用 exit 命令,如下所示:
或者使用:
1.7 SQLyog 安装
在日常开辟中,当输入的命令较长时,使用命令行客户端工具输入命令很不方便。此时可以使用相对方便的图形化管理工具来操纵MySQL,从而提高效率。
SQLyog是Webyog公司推出的一个高效、简捷的图形化管理工具,用于管理MySQL数据库。SQLyog的3个特点:
1、基于MySQLC APIs程序接口开辟。
2、方便快捷的数据库同步与数据库布局同步。
3、强盛的数据表备份与还原功能。
SQLyog提供了个人版和企业版等版本,并发布了GPL协议开源的社区版。SQLyog的下载和安装过程比力简朴,社区版源代码托管在GitHub上,读者可以到GitHub网站自行下载。以社区版SQLyog Community 13.1.9(64 Bit)版本为例,演示怎样登录MySQL,具体步调如下:
1、双击SQLyog安装包启动SQLyog安装程序。
2、根据安装界面的提示信息一步一步操纵,安装完成界面:
3、单击安装完成界面的“完成”按钮,启动SQLyog:
4、在SQLyog主界面单击菜单栏“文件”→“新连接”,会打开“连接到我的SQL主机”对话框,单击“新建"按钮,在MySQLHost Address文本框中输入localhost,"用户名"文本框中输入root,“暗码”文本框中输入",1234567890!",“端口"文本框中输入3306。
5、连接成功跳转到SQLyog主界面:
二、SQL语句
2.1 SQL分类
2.1.1数据定义语言:简称DDL(Data Definition Language)
DDL用于对数据库中的对象举行新增、修改、删除
其中DDL中有三个关键字分别是:
CREATE 新增
创建数据库SQL
CREATE DATABASE 数据库名 [CHARACTER SET utf8]
- 创建表
- CREATE TABLE 表名(
- 列1 类型 [约束],
- 列2 类型 [约束],
- …
- );
复制代码
- 修改
- ALTER
- 修改表结构,为表新增一列
- ALTER TABLE 表名ADD 列名 列的数据类型;
复制代码
- 修改表结构,修改列
- ALTER TABLE 表名 CHANGE 旧列名 新列名 新列的数据类型;
复制代码
- DROP
- 删除数据库
- DROP DATABASE 数据库名;
复制代码
注意:
数据库中的对象是指,数据库、表、视图、索引等。
2.1.2数据操纵语言:简称DML(Data Manipulation Language)
DML用于对数据库中表中的数据举行新增、修改、删除
其中DML中有三个关键字分别是:
插入 INSERT
向表中插入数据的公式
此时values后括号中的数值要和表名后括号中的数值的个数,范例,次序一一对应
- INSERT INTO 表名(列1,列2,列3,…) VALUES(数值1,数值2,数值3,,…);
复制代码
修改 UPDATE
为了不把表中的数据全部修改成一样的数据,我们要加上条件语句where
- UPDATE 表名 SET 列1=数据1,列2=数据2,... [WHERE id = 1];
复制代码
删除 DELETE
为了不把表中的数据全部删除,我们要加上条件语句where
FROM关键字不能省略
- DELETE FROM 表名 [WHERE id = 1];
复制代码
2.1.3数据控制语言:简称DCL(Data Control Language)
DCL对用户或角色赋予权限以及收回权限
其中DCL有两个关键字
赋予权限 GRANT
将查询表的权限赋予DAHUANG用户
- GRANT SELECT ON *.* TO DAHUANG;
复制代码
收回权限 REVOKE
将查询表的权限从DAHUANG用户收回
- REVOKE SELECT ON *.* FROM DAHUANG;
复制代码
2.1.4数据查询语言:简称DQL(Data Query Language)
DQL用户对表中的数据举行查询
其中DQL有一个关键字,即SELECT
简朴查询的公式为
其中*代表通配符 FROM不能省略
2.2 SQL通用语法
2.2.1 SQL语句可以单行或多行书写,以分号结尾
可以看到,在我没有键入;时,mysql数据库是不把“show databases”看做是一句完整的sql语句的
2.2.2 可使用空格和缩进来增强语句的可读性
可以使用TAB键和空格键来控制sql语句的可读性
2.2.3 MySQL数据库的SQL语句不区分大小写
建议使用大写,例如:SELECT * FROM user。
2.2.4 可以使用/**/的方式完成注释
mysql中的注释可以是/**/、#、--
2.3 数据范例
2.3.1 什么是数据范例
数据范例决定了,mysql中全部列都具有数据范例,以决定能够存储哪种数据。
2.3.2 数据范例的分类
数值型
整数范例
| 字节
| 用途
| INT或INTEGER
| 4
| 大整数值
| BIGINT
| 8
| 大整数值
| FLOAT
| 4
| 单精度浮点数值
| DOUBLE
| 8
| 双精度浮点数值
| 字符型
字符范例
| 字节大小
| 形貌
| CHAR
| 0-255字节
| 定长字符串
| VARCHAR
| 0-255字节
| 变长字符串
| TINYBLOB
| 0-255字节
| 不超过255个字符的二进制字符串
| TINYTEXT
| 0-255字节
| 短文本字符串
| BLOB
| 0-65535字节
| 二进制情势的长文本数据
| TEXT
| 0-65535字节
| 长文本数据
| 时间范例
时间范例
| 大小
| 格式
| 用途
| DATE
| 4
| YYYY-MM-DD
| 日期值
| TIME
| 3
| HH:MM:SS
| 时间值或持续时间
| YEAR
| 1
| YYYY
| 年份值
| DATETIME
| 8
| YYYY-MM-DD HH:MM:SS
| 混淆日期和时间值
| TIMESTAMP
| 4
| YYYYMMDD HHMMSS
| 混淆日期和时间值,时间戳
|
2.4 数据库操纵
2.4.1 检察数据库
检察全部数据库的sql语句
检察数据库创建时的信息
- SHOW CREATE DATABASE 数据库名;
复制代码 2.4.2 删除数据库
删除数据库时的sql语句
三、数据库表操纵
3.1 数据库表操纵
如图创建的数据库表student 效果图所示:
1、首先创建数据库表要用到的是DDL数据定义语言,其中数据定义语言包罗的三个关键此是:
create alter update
DDL数据定义语言是做什么用的:它是用来控制表布局的,就如同楼房一样,是用来搭建框架的,让其有一 个骨架,仅此而已。
如效果图所示创建这张表student 的sql;
- CREATE TABLE student (
- id INT(5), #默认的值 11位
- name VARCHAR(50), #姓名
- sex VARCHAR(10), #性别
- phone INT(13) #手机号
-
- ) ;
复制代码 2、实行创建表的sql之后效果如图:
3、怎么知道是否创建出这张表 就要用到数据库的DML 数据操纵语言,数据操纵语言是用来操纵数据表中的数据用的。
如同楼房的框架架构都有了,我是可以在楼房中布局那个地方是卧室,客厅,厨房等。
DML数据操纵语言包罗的关键词是:select insert update delete
select 译文是:查询,挑选
insert 译文是:插入 嵌入
update 译文是:修改
delete: 译文是:删除
其中 查询 表用到的DML 中关键字是: select
语法是 select * from 表名;
注意:
其中 * 代表的是全部的字段名称 from 是来自什么地方
sql语句是:
4、既然 * 代表的全部的字段 那么查询 指定的或者单独的某个字段是否可以呢?
查询字段的语法是: select 字段名, 字段名, 字段名, 字段名..... from 表名;
如图所示查询其中的两个字段:
- select id,phone from student;
复制代码
5、修改数据库表是指修改数据表的布局:用到的是DDL数据定义语言中的 alter
alter 的译文是: 修改
如:向表student中添加一个字段;
sql 语法是:alter table 表名 新字段名 字段范例;
如:向student 表中 添加一个字段是 age 范例是 int (3) 长度为3
添加完成之后在 用DML 数据控制语言中的 select 关键词去查询
6、去修改表的某一个字段的名称应该怎么去做?sql语法是什么呢,用到的关键字又是什 么? 修改表的字段名还是 修改表的布局,用到的是DDL数据定义语言的alter
sql语法是: alter table 表名change 原字段名 新字段名 字段范例;
如去修改表student age 字段 修改为 sage
效果图如下:
修改完成之后在 用DML 数据控制语言中的 select 关键词去查询
sql语法是: select * from 表名;
效果图如下:
7、修改 表字段的范例 用到的是DDL 的alter
修改的语法是: alter table 表名 modify 字段名 变更的字段范例;
如修改 sage 的字段范例为 varchar(30) 长度为 30
sql语句是:alter table student modify sage varchar(30);
效果如图所示:
修改完成之后在 要用到检察表布局
检察表布局的语法是 desc 表名;
效果如图:
8、删除数据库表
删除数据表是用到的DDL 的 drop 删除表
sql 语法是: drop table 表名;
效果如图所示:
3.2 主键约束
1、创建主键
表的主键是什么,有什么作用;
数据库主键是指表中一个列或者列的组合,其值能够唯一的标识表中的每一个行。这样的一列或者多列成为表的主键,通过它可以逼迫表的实体完整性。当创建或者更改表时可以通过定义PRIMARY KEY约束来创建主键,一个表只能有一个主键约束,而且主键约束中的列不能是空值,由于主键约束确保唯一数据,所一经常来定义标识列。
2、主键的作用
2.1、 主键是用于唯一标识数据库表中一行数据的。
2.2、 作为一个可以被外键有效引用的对象。
3、主键的设计原则
3.1、 主键应当是对用户没故意义的,好比说用户登陆一个系统的时候的登录id;而这种情况就不大概了:“学生表”必要支持这样的需求“学生注销后,可以重新激活自己的信息,而且还要保持自己的号码跟原来的一直”,这样的话主键就不能满足要求了。
3.2、 唯一性。
3.3、 非空性:主键的值是不可重复的,也不可以为空。
创建主键的关键词是 PRIMARY KEY
sql语句是
- create table student(
- id int primary key,
- name varchar(20)
- );
复制代码
检察表布局
desc 表名;
desc student;
4、删除主键
既能创建主键 那么也能删除主键
删除主键的语法是 alter table 表名 drop primary key;
删除student 表的主键如效果图
用desc 表名 检察表布局 检察是删除主键
desc student;
5、其它约束
其他约束 如 not null 意思是非空 也就是必填项不能为空值
unique 唯一 意思是不能有重复的有且仅有一个值,不能有重复的值
sql语句如图所示;
- create table student(
- id int primary key, -- 创建主键
- name varchar(20) not null, --非空约束
- email varchar(30) unique -- 唯一约束
- );
复制代码
检察表布局
desc student;
四、SQL查询语句 (一)
商品表(good)
先熟悉一下SQL语句实行次序:
【⑤确定要显示的数据列】select [distinct] * | 列[别名],列[别名],列[别名].....
【①确定数据泉源(行与列的聚集)】from 表名称[别名]
【②针对于数据行举行筛选】[where限定条件(s)]
【③针对于筛选的行分组】[group by 分组字段,分组字段,分组字段,.......]
【④针对于筛选的行分组】[having分组过滤]
【⑥数据排序】[order by排序字段[asc|desc],排序字段[asc|desc],......]
【⑦分页】[limit (m-1)*n,n]
4.1 select基本查询语句
4.1.1 单列查询
例如:
查询商品表中商品名称信息
4.1.2 多列查询
例如:
查询商品表中的商品名称及商品价格
4.1.3 查询表中全部字段
例如:
查询全部商品信息
4.2 distinct消除冗余
例如:
查询商品种别
4.3 使用别名
4.3.1 as使用别名方式
例如:
查询商品表中的商品名称及商品价格
4.3.2 不使用as方式
例如:
查询商品表中的商品名称及商品价格
4.4 运算符
4.4.1 算术运算符(+、-、*、/、%)
例如:
查询每种商品的总价格(数量*价格)
4.4.2 逻辑运算符(=、<>、!=、<、<=、>、>=)
例如:
查询商品表中商品价格大于5000的商品信息
4.4.3 关系运算符(and or not)
例如:
查询商品表中商品是手机并且价格大于5000
4.5 group by分组
例如:
查询每类商品的数量
总结:
实际上group by子句之以是使用麻烦,是由于分组的时候有一些约定条件;
- 如果查询不使用group by子句,那么select子句中只答应出现统计函数,其他任何字段不答应出现。
2.如果查询中使用了group by子句,那么select子句中只答应出现分组字段、统计函数,其他任 何字段不答应出现。
4.6 having分组条件
例如:
查询每类商品的数量大于2
说明:关于where与having的区别?
1.where子句是在group by分组之前举行筛选,指的是选出那些可以参与分组的数据,并且where子句之中不答应使用统计函数;
2.having子句是在group by分组之后实行的,可以使用统计函数。
4.7 order by排序
排序order by(asc升序,desc降序)
例如:
查询商品信息价格由低到高举行显示,如果价格相同,按照商品编号由低到高排序
4.8 limit分页
限制效果查询返回的数量:
分页
每一页显示多少条数据
显示的第几页
n:当前页码
m:每页显示的数据
- select * from 表名 limit (n-1)*m,m;
复制代码 例如:
查询第二页记载
4.9 in操纵
in指的是根据一个指定的范围举行数据查询
例如:
查询商品编号为2,4,6的商品信息
注意:
in操纵不仅短而且性能还好,这就是首选。
4.10 范围操纵
between...and的告急功能是举行范围的查询,其使用语法情势如下:
Where 字段|数值 between 最小值 and最大值。
4.11 模糊查询:like
like可以实现数据的模糊查询操纵,如果要想使用like则必须使用如下的两个匹配符号:
“_”:匹配恣意的一位符号;
“%”:匹配恣意的符号(包罗匹配0位、1位、多位)
例如:
查询商品表名称有“海”的商品信息
五、SQL查询语句(二)
5.1 多表查询
5.1.1 为什么要使用多表查询
在实际生活或者开辟中,单一一张表已经无法满足我们实际的开辟必要,我们必要更多的数据。但是在一张表中存储过多的数据会影响到服务器的运行效率,以是我们创建多张表并将多张表用某一个字段建立连接,就形成了如今我们必要学习的多表查询。
5.1.2 where子句多表查询
在查询的过程中,如果不加以限制,则会出现如下情况:
我们可以看出,只有画箭头的几条数据才是精确的数据,以是我们可以通过如下方法从两张表中获取精确数据
5.1.2 join子句多表查询.
在我们sql语句中还有另一种写法来得到多个表中的数据
5.2 连接
5.2.1 内连接(INNER JOIN)
要注意,在mysql的全部连接中,只有内连接是默认连接。以是上面的sql语句我们也可以写成如下格式:
5.2.2 左外连接(LEFT JOIN)
左外连接会显示两个表都有的数据以及左表中的全部数据,sql语句如下:
5.2.3 右外连接(RIGHT JOIN)
5.2.4 全外连接(FULL JOIN)
必要注意的是,mysql数据库临时不支持全外连接,但是我们可以通过左外连接和右外连接的聚集模拟全外连接,sql语句如下:
5.3 子查询
定义:
子查询答应把一个查询 嵌套在另一个查询当中。
子查询,又叫内部查询,相对于内部查询,包罗内部查询的就称为外部查询。
子查询可以包罗普通select还可以包罗的任何子句,好比:distinct、 group by、order by、limit、join和union等;但是对应的外部查询必须是以下语句之一:select、insert、update、delete
5.3.1 比力子查询
比力子查询是一种在SQL查询中使用的子查询,用于在外部查询的条件中与外部查询的某些列举行比力。比力子查询可以返回一个或多个值,这些值用于与外部查询中的列举行比力。比力子查询通常用于选择、过滤或排序数据。
5.3.2 ANY子查询
any关键词的意思是“对于子查询返回的列中的任何一个数值,如果比力效果为TRUE,就返回TRUE”。
5.3.3 IN子查询
使用in举行子查询,这个我们在日常写sql的时候是经常遇到的。in的意思就是指定的一个值是否在这个聚集中,怎样在就返回TRUE;否则就返回FALSE了。
in是“=any”的别名,在使用“=any”的地方,我们都可以使用“in”来举行替换。
有了in,肯定就有了not in;not in并不是和<>any是同样的意思,not in和<>all是一个意思。
5.3.4 SOME子查询
some是any的别名,用的较少。
5.3.5 ALL子查询
all必须与比力操纵符一起使用。all的意思是“对于子查询返回的列中的全部值,如果比力效果为TRUE,则返回TRUE”。
例如:
“10 >all(2, 4, 5, 1)”,由于10大于聚集中的全部值,以是这条判断就返回TRUE;而如果为“10 >all(20, 3, 2, 1, 4)”,这样的话,由于10小于20,以是该判断就会返回FALSE。
六、JDBC操纵数据库
1.什么是JDBC
JDBC是Java DataBase Connectivity的首字母缩写
2. JDBC有什么作用
顾名思义,JDBC的告急作用就是作为java程序和数据库的连接让我们可以通过java代码来操纵数据库。
3. 怎么使用JDBC
6.1 JDBC的各个类和接口
1、Connection接口
作用:代表数据库连接
2、DriverManager类
作用:管理一组 JDBC 驱动程序的基本服务
应用程序不再必要使用 Class.forName() 显式地加载 JDBC 驱动程序。在调用 getConnection 方法时,DriverManager 会试着从初始化时加载的那些驱动程序以及使用与当前 applet 或应用程序相同的类加载器显式加载的那些驱动程序中查找合适的驱动程序。
3、Statement接口
作用:用于将 SQL 语句发送到数据库中,或明白为实行sql语句
有三种 Statement对象:
Statement:用于实行不带参数的简朴SQL语句;
PreparedStatement(从 Statement 继承):用于实行带或不带参数的预编译SQL语句;
CallableStatement(从PreparedStatement 继承):用于实行数据库存储过程的调用。
4、PreparedStatement接口
关系:public interface PreparedStatement extends Statement
区别
(1)PreparedStatment安全性高,可以避免SQL注入
(2)PreparedStatment简朴不繁琐,不消举行字符串拼接
(3)PreparedStatment性能高,用在实行多个相同数据库DML操纵时
5、ResultSet接口
ResultSet对象是executeQuery()方法的返回值,它被称为效果集,它代表符合SQL语句条件的全部行,并且它通过一套getXXX方法(这些get方法可以访问当前行中的不同列)提供了对这些行中数据的访问。
ResultSet里的数据一行一行分列,每行有多个字段,且有一个记载指针,指针所指的数据行叫做当前数据行,我们只能来操纵当前的数据行。我们如果想要取得某一条记载,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的全部记载,就应该使用while循环。
ResultSet对象自动维护指向当前数据行的游标。每调用一次next()方法,游标向下移动一行。
初始状态下记载指针指向第一条记载的前面,通过next()方法指向第一条记载。循环完毕后指向末了一条记载的后面。
6.2 JDBC连接数据库的步调
6.2.1 创建Java项目
6.2.2 创建文件夹lib,粘贴jar包
Jar包其实就是一个java应用程序,里面有很多class字节码文件
6.2.3 创建Java类,写好主方法
6.2.4 开始Coding !!!

- public static void main(String[] args) {
- try {
- //1.通过反射将加载Driver类(加载驱动)
- Class.forName("com.mysql.jdbc.Driver");
- //2.获得java程序和数据库的连接
- /*
- * 第一个参数url:代表连接的是哪一个数据库,
- * 其中localhost表示本机ip地址可以用127.0.0.1代替
- * 3306表示mysql的默认端口号
- * demo表示连接的具体数据库,可以换成别的数据库
- * 第二个参数username:默认用户名root
- * 第三个参数password:默认密码root
- */
- Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo","root","root");
- //3.创建Statement对象,其作用是执行sql语句
- Statement cs = conn.createStatement();
- //4.执行sql语句,获得结果集
- String sql = "select * from emp where ename = 'SMITH'";
- ResultSet rs = cs.executeQuery(sql);
- //5.处理结果集 通过while循环来遍历结果集
- while(rs.next()){//如果结果集中有下一个元素,则返回true
- //我们现在学习得jdbc还比较简单,所以我们将数据打印在控制台上即可
- /仔细观察上图,我们可以看出empno是第一列并且是int类型
- //ename是第二列并且是varchar类型
- //job是第三列并且是varchar类型
- //并不是说我查询来的所有数据都要用到,仔细观察我没有写mgr和comm
- //括号中除了写列的序号之外我们还可以写列的名称
- //...以此类推,直到最后一列
- System.out.println("员工编号:"+rs.getInt(1)+"\t员工姓名:"+rs.getString(2)+"\t职位:"+rs.getString(3)+"\t入职日期:"+rs.getString(5)+"\t工资:"+rs.getDouble("sal")+"\t部门编号:"+rs.getInt("deptno"));
- }
- //6.关流
- //我们在使用完这些接口之后需要进行资源释放
- //在关流的时候,我们要注意遵循"先进后出"原则
- //即先创建的后关,后创建的先关
- if(rs != null){
- rs.close();
- }
- if(cs != null){
- cs.close();
- }
- if(conn != null){
- conn.close();
- }
- } catch (Exception e) {
- //注意这里↑
- /*我们要处理的异常应该改成Exception
- * 用父类Exception代替ClassNotFoundException和SQLException
- * 否则我们需要在这里处理两次异常
- */
- e.printStackTrace();//将异常打印到控制台
- }
- }
复制代码 控制台输出效果:
6.3 创建表tb_book
6.3.1 表的设计
bid是主键,编号自动生成
6.3.2 表中的数据
6.4 web工程项目配置
6.5 jdbc操纵实现增编削查
Book.java
6.5.1 实现查询图书
实现代码:
- public static void selectAllBook() {
- //使用JDBC技术
- try {
- //1、注册驱动
- Class.forName("com.mysql.jdbc.Driver");
- //2、通过驱动管理器连接数据库
- Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_school", "root", "root");
- //3、通过连接创建PreparedStatement对象
- PreparedStatement ps = conn.prepareStatement("select * from tb_book");
- //4、通过Statement对象执行SQL语句
- ResultSet rs = ps.executeQuery();
- //写一个集合
- List<Book> list = new ArrayList<Book>();
- //遍历
- while (rs.next()) {
- //创建对象
- Book stu = new Book(rs.getInt("bid"), rs.getString("bname"), rs.getString("bauthor"),
- rs.getDouble("bprice"), rs.getDate("bdate"));
- //把数据放入集合中
- list.add(stu);
- }
- //5、处理结果
- if (list.size() > 0) {
- for (Book b : list) {
- System.out.println(b);
- }
- } else {
- System.out.println("对不起,没有数据!");
- }
- //6、释放资源(先进后出)
- rs.close();
- ps.close();
- conn.close();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
复制代码 测试代码:
- package com.xxx.test;
- import com.bw.utils.JDBCUtils;
- /**
- * <br>Title:TODO 类标题
- * <br>Description:TODO 类功能描述
- */
- public class TestBook {
- public static void main(String[] args) {
- JDBCUtils.selectAllBook();
- }
- }
复制代码 测试效果:
6.5.2 实现添加图书
实现代码:
- public static void addBook(Book b) {
- //使用JDBC技术
- try {
- //1、注册驱动
- Class.forName("com.mysql.jdbc.Driver");
- //2、通过驱动管理器连接数据库
- Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_school", "root", "root");
- //3、通过连接创建PreparedStatement对象
- PreparedStatement ps = conn
- .prepareStatement("insert into tb_book(bname,bauthor,bprice,bdate)values(?,?,?,?)");
- //给占位符赋值
- ps.setString(1, b.getBname());
- ps.setString(2, b.getBauthor());
- ps.setDouble(3, b.getBprice());
- ps.setDate(4, b.getBdate());
- //4、通过Statement对象执行SQL语句
- int num = ps.executeUpdate();
- //5、处理结果
- if (num > 0) {
- System.out.println("添加成功!");
- } else {
- System.out.println("添加失败!");
- }
- //6、释放资源(先进后出)
- ps.close();
- conn.close();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
复制代码 测试代码:
- package com.xxx.test;
- import java.sql.Date;
- import java.util.Scanner;
- import com.bw.entity.Book;
- import com.bw.utils.JDBCUtils;
- /**
- * <br>Title:TODO 类标题
- * <br>Description:TODO 类功能描述
- */
- public class TestBook {
- public static void main(String[] args) {
- //写一个Scanner对象
- Scanner sc = new Scanner(System.in);
- System.out.println("请输入书名:");
- String bname = sc.next();
- System.out.println("请输入作者:");
- String bauthor = sc.next();
- System.out.println("请输入价格:");
- Double bprice = sc.nextDouble();
- System.out.println("请输入日期(格式只能是例:2017-08-13):");
- String bdate = sc.next();
- //写一个Book对象
- Book b = new Book(bname, bauthor, bprice, Date.valueOf(bdate));
- //添加图书
- JDBCUtils.addBook(b);
- //查询图书
- JDBCUtils.selectAllBook();
- }
- }
复制代码 测试效果:
6.5.3 实现修改图书
实现代码:
- public static void updateBookById(Book b) {
- //使用JDBC技术
- try {
- //1、注册驱动
- Class.forName("com.mysql.jdbc.Driver");
- //2、通过驱动管理器连接数据库
- Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_school", "root", "root");
- //3、通过连接创建PreparedStatement对象
- PreparedStatement ps = conn
- .prepareStatement("update tb_book set bname=?,bauthor=?,bprice=?,bdate=? where bid=?");
- //给占位符赋值
- ps.setString(1, b.getBname());
- ps.setString(2, b.getBauthor());
- ps.setDouble(3, b.getBprice());
- ps.setDate(4, b.getBdate());
- ps.setInt(5, b.getBid());
- //4、通过Statement对象执行SQL语句
- int num = ps.executeUpdate();
- //5、处理结果
- if (num > 0) {
- System.out.println("修改成功!");
- } else {
- System.out.println("修改失败!");
- }
- //6、释放资源(先进后出)
- ps.close();
- conn.close();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
复制代码 测试代码:
- package com.xxx.test;
- import java.sql.Date;
- import java.util.Scanner;
- import com.bw.entity.Book;
- import com.bw.utils.JDBCUtils;
- /**
- * <br>Title:TODO 类标题
- * <br>Description:TODO 类功能描述
- */
- public class TestBook {
- public static void main(String[] args) {
- JDBCUtils.selectAllBook();
- //写一个Scanner对象
- Scanner sc = new Scanner(System.in);
- System.out.println("请输入要修改的书号:");
- int bid = sc.nextInt();
- System.out.println("请输入书名:");
- String bname = sc.next();
- System.out.println("请输入作者:");
- String bauthor = sc.next();
- System.out.println("请输入价格:");
- Double bprice = sc.nextDouble();
- System.out.println("请输入日期(格式只能是例:2017-08-13):");
- String bdate = sc.next();
- //写一个Book对象
- Book b = new Book(bid, bname, bauthor, bprice, Date.valueOf(bdate));
- //修改图书
- JDBCUtils.updateBookById(b);
- JDBCUtils.selectAllBook();
- }
- }
复制代码 测试效果:
6.5.4 实现删除图书
实现代码:
- public static void deleteBookById(int bid) {
- //使用JDBC技术
- try {
- //1、注册驱动
- Class.forName("com.mysql.jdbc.Driver");
- //2、通过驱动管理器连接数据库
- Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_school", "root", "root");
- //3、通过连接创建PreparedStatement对象
- PreparedStatement ps = conn.prepareStatement("delete from tb_book where bid=?");
- //给占位符赋值
- ps.setInt(1, bid);
- //4、通过Statement对象执行SQL语句
- int num = ps.executeUpdate();
- //5、处理结果
- if (num > 0) {
- System.out.println("删除成功!");
- } else {
- System.out.println("删除失败!");
- }
- //6、释放资源(先进后出)
- ps.close();
- conn.close();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
复制代码 测试代码:
- package com.xxx.test;
- import java.util.Scanner;
- import com.bw.utils.JDBCUtils;
- /**
- * <br>Title:TODO 类标题
- * <br>Description:TODO 类功能描述
- */
- public class TestBook {
- public static void main(String[] args) {
- //写一个Scanner对象
- Scanner sc = new Scanner(System.in);
- System.out.println("请输入要删除的书号:");
- int bid = sc.nextInt();
- //删除图书
- JDBCUtils.deleteBookById(bid);
- JDBCUtils.selectAllBook();
- }
- }
复制代码 测试效果:
七、总结
本篇章数据库根本已经讲完啦,小同伴一定要把根本知识学踏实了。虽然像jdbc这种实现方式在实际开辟中已经被MyBatis、MyBatis Plus、 JPA这样封装好了的框架所替换。但是在我们面试中却会被面试官经常问到这些根本性的知识(例如:要你手写jdbd连接数据库代码。)以是大伙们不可以轻视这些根本的知识点。后面我会继承和大伙们聊一聊常见的框架使用,并分享一些面试中高频的问题,大伙们在平常学习或者实际开辟中有任何问题,都可以来私信我哦!我们下期再见!
MySQL资料包
链接:https://pan.baidu.com/s/1Js1zQPuGS8SoL77aC_hE0A?pwd=1q2w
PS:如果链接失效了联系我,我会实时补充哈
|