黑马程序员技术交流社区
标题: 【石家庄校区】数据库相关小结 [打印本页]
作者: heifachangcun 时间: 2018-12-10 11:22
标题: 【石家庄校区】数据库相关小结
本帖最后由 小石姐姐 于 2018-12-13 09:18 编辑
mysql
oracle
db2
非关系型
redis
mysql 6.0收费
DBMS 数据库管理系统
数据库结构
数据库
-->表(列)
-->数据
SQL通用语法
1. SQL 语句可以单行或多行书写,以分号结尾。
2. 可使用空格和缩进来增强语句的可读性。
3. MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。
4. 3 种注释
* 单行注释: -- 注释内容 或 # 注释内容(mysql 特有)
* 多行注释: /* 注释 */
sql分类
DDL(数据库和表的操作):create,drop,alter
DML(数据的增删改):insert,delete,update
DQL(数据的查询):select,where
DCL(DBA):grant,revoke
数据类型
VARCHAR(长度) :字符串
CHAR(长度)
TEXT
DATE :包含年月日
DATETIME:需要赋值,包含年月日时分秒
TIMESTAMP 默认当前系统时间,包含年月日时分秒
约束 (对表中的数据进行限定,保证数据的正确性.有效性.完整性)
分类:
主键(primary key) AUTO_INCREMENT
1. 注意:
1. 含义:非空且唯一
2. 一张表只能有一个字段为主键
3. 主键就是表中记录的唯一标识
2. 在创建表时,添加主键约束
[Java] 纯文本查看 复制代码
create table stu(
id int primary key,-- 给id添加主键约束
name varchar(20)
);
3. 删除主键
-- 错误 alter table stu modify id int ;
ALTER TABLE stu DROP PRIMARY KEY;
4. 创建完表后,添加主键
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
5. 自动增长:
1. 概念:如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长
2. 在创建表时,添加主键约束,并且完成主键自增长
[Java] 纯文本查看 复制代码
create table stu(
id int primary key auto_increment,-- 给id添加主键约束
name varchar(20)
);
3. 删除自动增长
ALTER TABLE stu MODIFY id INT;
4. 添加自动增长
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
外键(foreign key)让表与表产生关系,保证数据的正确性
1. 在创建表时,可以添加外键
* 语法:
create table 表名(
....
外键列
constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
);
2. 删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
3. 创建表之后,添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
4. 级联操作
1. 添加级联操作
语法:ALTER TABLE 表名 ADD CONSTRAINT 外键名称
FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE ;
2. 分类:
1. 级联更新:ON UPDATE CASCADE
2. 级联删除:ON DELETE CASCADE
非空(not null)
1. 创建表时添加约束
CREATE TABLE stu(
id INT,
NAME VARCHAR(20) NOT NULL -- name为非空
);
2. 删除name的非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
唯一(unique)
1.在创建表时,添加唯一约束
CREATE TABLE stu(
id INT,
phone_number VARCHAR(20) UNIQUE -- 手机号
);
2. 删除唯一约束
ALTER TABLE stu DROP INDEX phone_number;
多表的关系
1对1:如人和身份证,一一对应的
实现方式:一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键
1对多(多对一)
实现方式:在多的一方创建外键指向一的一方的主键
多对多
实现方式:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键
MYSQL
安装卸载
net start mysql:启动mysql的服务
net stop mysql:关闭mysql服务
netstat -ano | findStr "3306"
taskkill /F /PID mysql的进程id
* MySQL登录
1. mysql -uroot -p密码
2. mysql -hip -uroot -p连接目标的密码
3. mysql --host=ip --user=root --password=连接目标的密码
* MySQL退出
1. exit
2. quit
sqlyog工具使用
--------------------------------------------
DDL(对数据库和表的操作)
数据库
创建数据库:
create database 数据库名称
创建数据库,并指定字符集
CREATE DATABASE 数据库名 CHARACTER SET 字符集名(如utf8)
删除数据库
DROP DATABASE 数据库名
查询所有数据库名称
SHOW DATABASES
查询某个数据库的创建语句
SHOW CREATE DATABASE 数据库名
查询当前正在使用的数据库名称
SELECT DATABASE()
使用数据库
USE 数据库名
表
创建表
CREATE TABLE 表名(列名 数据类型 约束,列名 数据类型 约束...)
复制表:
create table 表名 like 被复制的表名
删除表
DROP TABLE 表名
查看表中数据的类型
SHOW CREATE TABLE 表名
查询某个数据库中所有的表名称
SHOW TABLES
查询表结构
DESC 表名
添加一列
ALTER TABLE 表名 ADD 列名 数据类型 约束
删除列
ALTER TABLE 表名 DROP 列名
修改列名称 类型
ALTER TABLE 表名 MODIFY 列名 新数据类型 约束
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型 约束
修改表的字符集
ALTER TABLE 表名 CHARACTER SET 字符集名称(如utf8)
修改表名
RENAME TABLE 表名 TO 新表名
删除表后重新生成新的表,数据不可找回
TRUNCATE TABLE 表名
DML(对表中数据的增删改操作)
添加数据
INSERT INTO 表名(列名...) VALUES(值...)
注意:列名和值要一一对应;如果表名后不定义列名,则默认给所有列添加值;
除了数字类型,其它类型需要使用引号(单双均可)引起来
删除数据
DELETE FROM 表名 WHERE 条件
注意:如不加条件,则删除表中所有记录;
修改数据
UPDATE 表名 SET 列名 = 值 WHERE 条件
注意:如不加条件,则修改表中所有记录
DQL(对表中数据的查询操作)
去重:
distinct
起别名:
as:也可省略直接在列后边空格写上要起的代替的名字
排序方式:
ASC:升序,系统默认排序
DESC:降序
注意:如果有多个排序条件,则当前面的条件值一样时,才会判断第二个条件,中间用逗号分隔
聚合函数:
count : 计算个数(一般选择非空列:主键)
max:计算最大值
min:计算最小值
sum:计算和
avg:计算平均数
分组查询:
1. 语法:group by 分组字段;
2. 注意:
1. 分组之后查询的字段:分组字段、聚合函数
2. where 和 having 的区别?(面试题)
1. where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
2. where 后不可以跟聚合函数,having可以进行聚合函数的判断。
分页查询:
limit(开始的索引,每页查询的条数)
条件查询:
1. where子句后跟条件
2. 运算符
* > 、< 、<= 、>= 、= 、<>(不等于)
* BETWEEN...AND -->(取中间值)
* IN( 集合) -->(取定点值)
* LIKE:模糊查询
* 占位符:
* _:单个任意字符
* %:多个任意字符 (如%张%,代表X张X)
* IS NULL (为空)
* and 或 && 并且,多个条件同时成立
* or 或 || 或者,多个条件任一成立
* not 或 ! 非,不成立
单表
SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 列名 HAVING 条件 ORDER BY 列名 ASC/DESC LIMIT 索引,多少条 --(注释)
(查询 条件 分组 分组后的条件 排序 分页 备注)
多表
笛卡尔积:
* 有两个集合A,B .取这两个集合的所有组合情况。
* 要完成多表查询,需要消除无用的数据
内连接(从哪些表查,条件是什么,查询哪些字段)
隐式
SELECT 列名 FROM 表名1,表名2 WHERE 关联条件 AND 条件
显式
SELECT 列名 FROM 表名1 JOIN 表名2 ON 关联条件 WHERE 条件
外链接
左外链接(查询左表所有数据及多表的交集部分)
SELECT 列名 FROM 表名1 LEFT JOIN 表名2 ON 关联条件 WHERE 条件
右外链接(查询右表的所有数据及多表的交集部分)
SELECT 列名 FROM 表名1 RIGHT JOIN 表名2 ON 关联条件 WHERE 条件
子查询
查询嵌套查询
作为条件: 查询结果为单行单列(使用运算符判断),多行单列(使用运算符in来判断)
作为虚拟表 查询结果为多行多列
事务(管理的业务操作同生共死)
操作:
开启事务:
START TRANSACTION;
提交:
COMMIT;
回滚:
ROLLBACK;
提交方式:
手动提交(Oracle默认提交方式)
自动提交(mysql默认提交方式)
修改事务的默认提交方式:
* 查看事务的默认提交方式:SELECT @@autocommit; -- 1 代表自动提交 0 代表手动提交
* 修改默认提交方式: set @@autocommit = 0;
四大特性
原子性:操作的单位同生共死
持久性:提交或回滚后,数据库会持久保存
一致性:操作前后,数据总量不变
隔离性:多个事务之间相互独立
隔离级别(脏读,不可重复读,虚读,幻读)
默认隔离界别
MYSQL --> 3
ORACLE --> 2
隔离级别:(级别从小到大,安全性越来越高,效率越来越低)
1. read uncommitted:读未提交
* 产生的问题:脏读、不可重复读、幻读
2. read committed:读已提交 (Oracle)
* 产生的问题:不可重复读、幻读
3. repeatable read:可重复读 (MySQL默认)
* 产生的问题:幻读
4. serializable:串行化
* 可以解决所有的问题
* 数据库查询隔离级别:
* select @@tx_isolation;
* 数据库设置隔离级别:
* set global transaction isolation level 级别字符串;
jdbc
概念
一套接口(java提供的规范) --> 要求厂商自己实现操作各自数据库的 驱动
面向接口编程 真正执行的代码是驱动jar包中的实现类
步骤前需要导入驱动jar包:
导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下
2.右键-->Add As Library (选择model)
1.注册驱动
2.获取数据库连接对象 Connection
3.定义sql语句
4.创建sql和执行sql的对象 Statement
5.执行sql获取结果 传入参数sql
6.处理结果
7.释放资源
ps:
1.ResultSet的遍历
while(rs.next()){
rs.getObejct(1);
rs.getObejct("列名")
}
2.sql注入
使用 PrepareStatement 配合占位符 ?
pst.executeQuery() --> 没有参数
pst.executeUpdate() --> 没有参数
3.jdbc控制事务
开启事务
conn.setAutoCommit(false);
提交事务
conn.commit()
回滚事务
conn.rollback();
抽取JDBC工具类 : JDBCUtils
分析:
1. 注册驱动也抽取
2. 抽取一个方法获取连接对象
3. 抽取一个方法释放资源
连接池(一个容器[集合],存放数据库连接对象)
底层原理:连接池先申请一些连接对象存放在连接池中,用户需要访问数据时从池中调用,用完 后把连接对象归还给连接池.
好处:
节约资源,提高访问效率,降低内存溢出的情况出现的概率
C3P0:现阶段使用率最高的数据库连接池技术
接入步骤:
1.导jar
1.c3p0 2个(c3p0-0.9.5.2.jar, mchange-commons-java-0.2.12.jar)
2.mysql驱动
2.导入配置文件(src目录下)
c3p0-config.xml
* 路径:直接将文件放在src目录下即可。
3.使用
DataSource dataSource = new ComboPooledDataSource();
Connection con = dataSource.getConnection();
DRUID(德鲁伊):数据库连接池实现技术,由阿里巴巴提供的,新的
接入步骤
1.导jar
1.druid(druid-1.0.9.jar)
2.mysql驱动
2.导入配置文件(src)( 是properties形式的* 可以叫任意名称,可以放任意目录下)
druid.properties
3.使用
Properties pro = new Properties();
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"))
DataSource dataSource = DruidDataSourceFactory.createDataSoure(pro)
Connection con = dataSource.getConnection();
JdbcUtils实现思路
1. 定义一个类 JDBCUtils
2. 提供静态代码块加载配置文件,初始化连接池对象
3.提供方法:
1.获取数据源(连接池) DataSource
2.获取连接对象 Connection
3.释放资源 重载
思路:
1,2:
DataSource在类加载的时候就应该初始化,为了保证对象能够及时创建,在 static{} 静态代码块中创建的对象
Properties pro = new Properties();
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"))
dataSource = DruidDataSourceFactory.createDataSoure(pro)
提供返回数据源的方法 getDataSource() ---> return dataSource
提供返回连接 getConnection() ---> return dataSource.getConnection()
3:
在关闭之前做非空判断!!!
JdbcTemplate
SPRING (基于jdbc来简化数据库的操作)
!!!如果有占位符需要传入参数
[Java] 纯文本查看 复制代码
DataSource dataSource = new ComboPooledDataSource();
JdbcTemplate template = new JdbcTemplate(dataSource);
增删改
template.update("sql",[具体参数]);
查询
单条结果
[Java] 纯文本查看 复制代码
Map<String,Object> map = template.queryForMap("sql",[具体参数]);
Bean bean = template.queryForObject("sql",new BeanPropertyRowMapper<Bean>(Bean.class),[具体参数]);
多条结果
[Java] 纯文本查看 复制代码
List<Map<String,Object>> list = template.queryForList("sql",[具体参数]);
List<Bean> list = template.query("sql",new BeanPropertyRowMapper<Bean>(Bean.class),[具体参数]);
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |