黑马程序员技术交流社区

标题: 【石家庄校区】MYSQL & JDBC总结 [打印本页]

作者: 1059472218    时间: 2018-1-23 14:55
标题: 【石家庄校区】MYSQL & JDBC总结
本帖最后由 小石姐姐 于 2018-1-24 15:21 编辑

MYSQL & JDBC总结

-石家庄校区黑马JavaEE就业6期


mysql回顾


顺序: select...from...where...group by...having...order by ...limit;




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;


外键的添加方式
        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概念和数据库驱动程序
JDBC原理
           +----------+           | Java程序 |           +-----+----+                 |           +-----+----+           |   JDBC   |           |    接口   |           +-----+----+                 |       +---------+---------+       |                   |+------+------+     +------+------+|  MySQL驱动   |     |  Oracle驱动 ||    实现类    |     |    实现类   |+------+------+     +------+------+       |                   |+------+------+     +------+------+| MySQL数据库  |     | Oracle数据库 |+-------------+     +-------------+


JDBC开发步骤









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2