本帖最后由 小石姐姐 于 2018-1-24 15:21 编辑
MYSQL & JDBC总结
-石家庄校区黑马JavaEE就业6期
mysql回顾
- SQL:结构化查询语言
- SQL分类
- DDL: 数据定义语言
- DML: 数据操作语言
- DCL: 数据控制语言
- DQL: 数据查询语言
- SQL特点
- SQL语句数据库增删改查操作(C(create) R(retrieve) U(update) D(delete))
- 语法
- create datebase 数据库名称 [character set 字符集 collate 字符集校对];
- SQL语句表增删改查操作(C(create) R(retrieve) U(update) D(delete))
- SQL语句记录增删改查操作(C(create) R(retrieve) U(update) D(delete))
- 【SQL的查询语句的总结】
- 排序可以按照多列, 如先按a列降序, 如果a列中有相同的值, 则按b列降序
- SELECT * FROM users ORDER BY age DESC, salary DESC;
- 查询语句的顺序
顺序: select...from...where...group by...having...order by ...limit;
- 聚合函数
- SQL内置了一些函数(类似于API方法), 可以对查询的结果进行相关计算
- 作用:
- 竖向对某一列的值进行计算, 然后返回一个计算结果.
- SELECT 函数名(列名) FROM 表名 ...;
- MAX(列名): 获取指定列的数值中的最大值
- MIN(列名): 获取指定列的数值中的最小值
- AVG(列名): 计算指定列的数值中的平均值
- 聚合函数的函数名和小括号之间要连着写, 不要有空格:
- 正确: SUM(zname)
- 错误: SUM (zname)
- NULL与任何数的运算结果都是NULL: SELECT (NULL + 10)结果为NULL,可以用ifnull进行判断
- 语法
- select sum(ifnull(zname,0)) from sort;
LIMIT ... OFFSET ...语句
* 在`SELECT`最后使用
* 翻页公式: `条数 * (页数 - 1)`
* 作用: 从总的查询结果中取出一部分作为查询结果
* 应用场景: 常用于分页
* 2种格式
* 格式1: `LIMIT 结果数 OFFSET 偏移量;`
* 格式2: `LIMIT 偏移量, 结果数;`
* 注意: 以上两种格式的参数位置是相反的, 不要写错!
USE mybase;
# 分页(1页2条), 第1页
SELECT * FROM sort LIMIT 2 OFFSET 0; 条数 * (页数 - 1)
# 分页(1页2条), 第2页
SELECT * FROM sort LIMIT 2 OFFSET 2; 条数 * (页数 - 1)
# 分页(1页2条), 第3页
SELECT * FROM sort LIMIT 2 OFFSET 4; 条数 * (页数 - 1)
# 分页(1页2条), 第4页
SELECT * FROM sort LIMIT 2 OFFSET 6;
UNION合并操作符
* 作用: 用于将两个或多个SELECT语句的查询结果合并为一个结果集
* 必要条件:
* 所有合并的SELECT结果集必须拥有**相同的列**(列的数量相同, 列名相同, 列的顺序相同)
* 默认情况下, **UNION会对结果集进行去重**, 如果不想去重, 可以使用`UNION ALL`
# 格式
SELECT column_name, ... FROM table_name1
[WHERE condition]
UNION [ALL|DISTINCT]
SELECT column_name, ... FROM table_name2
[WHERE condition];
# 示例
SELECT username FROM user_table1
UNION
SELECT username FROM user_table2;
SELECT * FROM sort WHERE sid = 1 OR sid = 7;
(SELECT * FROM sort WHERE sid = 1)
UNION
(SELECT * FROM sort WHERE sid = 7)
(SELECT * FROM sort)
UNION
(SELECT * FROM sort)
演示
# 第一个SELECT
SELECT username FROM user_table1;
# 输出
|username|
|--------|
|zhangsan|
# 第二个SELECT
SELECT username FROM user_table2;
# 输出
|username|
|--------|
| lisi|
# 使用UNION合并
(SELECT username FROM user_table1)
UNION
(SELECT username FROM user_table2);
# 输出
|username|
|--------|
|zhangsan|
| lisi|
子查询(也叫嵌套查询)
子查询: 使用SELECT语句查询出来的结果集, 实际上也可以看做一个表. 既然是一个表, 我们就可以用他作为其他查询语句的表
子查询语句也是一个SELECT语句, 使用小括号()括起来
注意:
在SELECT查询语句中使用子查询, 相当于把结果集看做一个表
如果作为WHERE子句的条件, 则子查询可以不起别名
如: SELECT * FROM user_table1 WHERE age < (SELECT AVG(age) FROM user_table1);
如果作为FROM后被查询的表, 子查询必须起别名
如: SELECT * FROM (SELECT username FROM user_table1) AS user WHERE username = 'zhangsan';
注意:
如果不起别名会报错: Every derived table must have its own alias
虽然起了别名, 但结果集实际还是结果集, 并不会变成真的表
使用UPDATE, DELETE语句时, 被更新的表不能用在set或where的子查询
否则会报错: You can't specify target table 'xxx' for update in FROM clause
解决办法: 在操作被更新的表的子查询外再套一层SELECT * FROM(是否取别名取决于是用在FROM还是WHERE子句), 然后外层再执行UPDATE或DELETE
如: DELETE FROM stutb WHERE score < (SELECT * FROM (SELECT AVG(score) FROM stutb WHERE department LIKE 'javaEE基础班') AS avgscore);
# 一个SELECT查询
SELECT username FROM user_table1;
# 输出
|username|
|--------|
|zhangsan|
| lisi|
| wangwu|
# 如果把以上看做一个表, 假设这个表名为user, 则我们会这样写
SELECT * FROM user WHERE username = 'zhangsan';
# 可以得到
|username|
|--------|
|zhangsan|
# 所以, 我们把user替换为刚才的SELECT语句, 并用小括号将SELECT语句括起来
# 替换结果类似于下面这样
# SELECT * FROM user WHERE username = 'zhangsan';
# SELECT * FROM (SELECT username FROM user_table1) AS user WHERE username = 'zhangsan';
# 执行一下
SELECT * FROM (SELECT username FROM user_table1) WHERE username = 'zhangsan';
# 也可以得到
|username|
|--------|
|zhangsan|
# 这就是子查询, 括号内的查询相当于父查询语句的一个孩子, 使用子查询的结果作为表继续查询
SELECT sname FROM sort;
sheet = SELECT sname FROM sort;
SELECT * FROM (SELECT sname FROM sort) AS z WHERE sname = '家电';
----------------------------------------------------------
-- 多表查询
-- 1-->内连接查询 查询多表直接的交集
-- 显示内查询
SELECT * FROM dinner d INNER JOIN food f INNER JOIN dinner2food df ON d.did=df.did AND f.fid=df.fid;
-- 隐式内查询(推荐用这个)
SELECT * FROM dinner d, food f, dinner2food df WHERE d.did=df.did AND f.fid=df.fid;
-- 2-->外连接查询
-- 右外查询
SELECT * FROM (dinner d, food f) RIGHT JOIN dinner2food df ON d.did=df.did AND f.fid= df.fid;
-- 左外查询
SELECT * FROM dinner2food df LEFT JOIN (dinner d, food f) ON d.did=df.did AND f.fid=df.fid;
外键的添加方式
- 方式一 外部添加:
- 注意, 外键的字段必须存在
- alter table 表名 add foreign key (外键的字段名)references (主表)指向的表名(主表的主键字段名);
- 方式二 建表时添加
cid INT PRIMARY KEY AUTO_INCREMENT,
number VARCHAR(20),
cname VARCHAR(20),
uid INT,
FOREIGN KEY (uid) REFERENCES users(uid)
);
什么是数据库:
数据库: 就是一个文件系统,这个文件必须通过标准的SQL访问
什么是关系型数据库
关系型数据库存放的都是实体之间的关系
C:/Users/ZRH/AppData/Local/YNote/data/qq8CC2F1FA720F8A5393B7A67614B8C1E2/2c4552d05a12491d8956b17aaf9af9fb/wps248b.tmp.jpeg
【数据库的多表设计】
数据库都是关系型的数据库,存的是实体之间的关系.实体之间有哪些关系?
实体的关系总结起来就有三种关系:
Ø 一对多的关系的建表原则:
* 在多的一方创建一个字段,这个字段作为外键指向一的一方的主键.
Ø 多对多的关系的建表原则:
* 创建一个第三种表,中间表中至少需要两个字段分别作为外键指向多对多双方的各自的主键.
Ø 一对一的关系的建表原则:
* 唯一外键对应:假设一对一的双方是一对多的关系.在多的一方创建外键指向一的一方的主键.需要在外键上添加一个unique约束.
* 主键对应:将一对一的双方的主键建立映射.
JDBC概念和数据库驱动程序
- Java DataBase Connectivity, Java数据库连接. 是一种技术的名称
- 是SUN公司提供的用于执行SQL语句的Java API, 用为多种关系型数据库提供统一的访问. 它由一组用Java语言编写的类和接口组成, 是Java访问数据库的标准规范
- 两个不同的设备要通信, 需要满足一定的通信数据格式, 数据格式由设备提供商规定, 设备提供商为设备提供驱动软件, 通过驱动软件就可以让两个设备通信.
- Java和MySQL数据库就可以看作2个不同的设备, JDBC需要使用数据库驱动来让Java代码与数据库服务器通信, 将Java中的SQL字符串发送给数据库来执行
- 数据库驱动有多种, 用于不同开发语言, 对于Java也有专门的一个驱动
JDBC原理
- JDBC是一套API, 可以通过Java代码来使用JDBC, 同时提供了一套接口, 用于让数据库厂商根据自家数据库特点去实现JDBC的功能
- 数据库驱动是数据库厂商根据自家数据库特点去实现JDBC接口而制作的, 用于让JDBC能够调用数据库的相关功能
- Java程序通过使用JDBC的API, 通过多态的方式调用数据库驱动中实现类的方法, 对数据库进行操作
+----------+ | Java程序 | +-----+----+ | +-----+----+ | JDBC | | 接口 | +-----+----+ | +---------+---------+ | |+------+------+ +------+------+| MySQL驱动 | | Oracle驱动 || 实现类 | | 实现类 |+------+------+ +------+------+ | |+------+------+ +------+------+| MySQL数据库 | | Oracle数据库 |+-------------+ +-------------+
JDBC开发步骤
- 使用JDBC中的类, 创建对MySQL数据库的连接
- 使用执行者对象, 向数据库执行SQL语句, 并获取执行结果
|
|