本帖最后由 小石姐姐 于 2018-1-12 11:21 编辑
SQL语句,JDBC阶段笔记 SQL语句介绍和分类:
用于操作数据库的代码
分类:
DDL:数据定义语言,用来定义数据库对象(库,表等)
CREATE ALTER DROP
DML:数据操作语言,对表中的记录进行增删改
INSERT DELETE UPDATE
DQL:数据查询语言,对表中的记录进行查寻
SELECT FROM WHERE
DCL:数据控制语言,常见修改用户,权限
SQL通用语法
特点:
SQL语句可以单行或多行书写,一条语句的结尾必须以;结尾
不区分大小写(默认情况数据也不区分大小写)
SQL语句的单词之间通过空格分隔,参数之间使用,逗号分隔
字符串和日期要使用''单引号或""双引号包括,推荐单引号
SQL注释
单行注释:
#单行注释
-- 单行注释(有空格)
多行注释:
/*注释内容*/
常用数据类型:
INT:整数
DOUBLE:浮点数(小数)
VARCHAR:存储空间是可变的,可变长度字符
CHAR:存储空间固定的,固定长度字符
DATE:
数据库的操作:
创建数据库:
CREATE DATABASE 库名;
删除指定数据库:
DROP DATABASE 库名;
查看所有数据库:
SHOW DATABASES;
数据库中创建数据表:
创建表的操作必须要先使用一个数据库:USE 库名;
格式:
CREATE TABLE 表名(
列名1 数据类型 约束,
列名2 数据类型 约束,
列名3 数据类型 约束
);
// VARCHAR和CHAR一般需要手动指定长度, 日期数字等其他类型有默认长度一般不需要指定
* 约束:
* constraint
* 作用: 就是对列中记录的值进行限制, 如果插入的数据不符合约束规则, 则该操作会被立刻终止
* 扩展:
* 约束的种类:
* **主键约束**: `PRIMARY KEY`, 限制该列的记录值不能为空且唯一(不能重复), 相当于同时设定了`NOT NULL`和`UNIQUE`
* **自增约束**: `AUTO_INCREMENT`, 设置该列的记录值可以自动增加
* 默认从几开始? 1
* 能用于什么类型? 只能用于数字类型(如INT, DOUBLE, 小数1.23自增后是2)
* 外键约束: `FOREIGN KEY`, 主要是连接另一个表的主键
* 非空约束: `NOT NULL`, 限制该列的记录值不能为空
* 唯一约束: `UNIQUE`, 唯一, 限制该列的记录值不能重复
* 检查约束: `CHECK (条件)`, 限制该列插入的记录值是否符合要求
* 默认值约束: `DEFAULT 值`, 限制该列记录如果没有插入值, 则使用默认值
* 列出当前数据库的所有表
* `SHOW TABLES;`
* 查看表的结构
* `DESC 表名;`: desc=description描述
* 删除表
* `DROP TABLE 表名;`
* 修改表的结构
* 格式: `ALTER TABLE 表名 操作关键字 列名 数据类型 约束;`
* 操作关键字
* `ADD`: 增加列.
* `ALTER TABLE 表名 ADD 新列名 数据类型 约束;`
* `MODIFY`: 修改指定列的数据类型和约束(不能修改列名).
* `ALTER TABLE 表名 MODIFY 要修改的列名 新数据类型 新约束;`
* `CHANGE`: 修改指定列的列名+数据类型+约束.
* `ALTER TABLE 表名 CHANGE 旧列名 新列名 新数据类型 新约束;`
* `DROP`: 删除列.
* `ALTER TABLE 表名 DROP 列名;`
* 修改表名
* 格式: `RENAME TABLE 旧表名 TO 新表名;`
向数据表中添加数据
添加数据格式1:
insert into 表名(列名1,列名2,列名3) values (值1,值2,值3);
添加数据格式2,不考虑主键
格式:
insert into 表名(列名) values (值);
添加数据格式3,所有值都给出
格式:
insert into 表名 values (全列值);
添加数据格式4,批量写入
格式:
insert into 表名 (列名1,列名2,列名3) values
(值1,值2,值3),
(值1,值2,值3),...
修改(更新)数据表中的数据(记录)
格式:
update 表名 set 列1=值1,列2=值2 where 条件;
where 条件:数据中的唯一性
删除指定记录
格式:
delete form 表名 where 条件
清空表格式:
truncate table 表名
解决命令行乱码问题:
# 将数据库数据修改为Windows的GBK
SET NAMES 'GBK';
数据的基本查询:
查询指定字段
SELECT 列名1, 列名2 FROM 表名;
查询所有字段
SELECT * FROM 表名;
DISTINCT去重
SELECT DISTINCT 列名1, 列名2 FROM 表名;
AS给字段取别名
SELECT 列名 AS 别名 FROM 表名;
对查询结果进行数学计算
SELECT 列名+值 FROM 表名;
* 条件查询:
* 即按指定条件查询记录返回符合条件的结果集, 使用`SELECT`和`WHERE`组合
* `WHERE`:
* 作用: 条件子句, 过滤符合条件的结果
* 运算符
* 比较运算符
* `=`: 相等
* `<>`或`!=`: 不等
* `>`: 大于
* `<`: 小于
* `>=`: 大于等于
* `<=`: 小于等于
* `BETWEEN...AND...`: 在一个范围内(包含头和尾), `BETWEEN 0 AND 10;` 0~10
* 如:
* `IN ()`: 在列表中, 满足列表中一个即可
* 如: `IN (1, 3, 5)`
* `IS NULL`: 是空
* `LIKE 通配符`: 模糊查询
* 通配符种类
* `%`: 一个百分号可以表示任意个字符. 比如`王%`, `王大锤`, `王五`
* `_`: 一个下划线可以表示一个字符. 比如`王_`, 只能匹配`王五`
* 逻辑运算符
* `AND`: 与. 两边条件同时成立才成立
* `OR`: 或. 两边条件只要有一个成立就成立
* `NOT`: 非, 取相反结果
* `NOT BETWEEN ... AND ...`: 不在范围内
* `NOT IN`: 不在列表中
* `NOT LIKE`: 不匹配
* `IS NOT NULL`: 非空
* 日期也是可以比较的
排序查询:对已有的结果进行排序
select * from 表名 order by 列名1 desc/asc,列名2 desc/asc;
desc 降序
asc 升序(默认)
注意: `WHERE`和`ORDER BY`的顺序
WHERE`在前, `ORDER BY`在后, 否则报错
因为是排序是对SELECT查询出的结果集再次进行排序, 而不是对表中的数据进行排序. 所以要先把SELECT WHERE的查询结果拿到, 才能使用ORDER BY排序
聚合函数:
作用:竖向对某一列的值进行计算,然后返回一个计算结果
格式:select 函数名(列名) from 表名...;
常用的5个聚合函数
COUNT(列名)`: 计算指定列的记录行数.
注意: 值为NULL的记录不会被统计
SUM(列名)`: 计算指定列的数值总和
如果数据类型不是数值, 则结果为: 0
MAX(列名)`: 获取指定列的数值中的最大值
MIN(列名)`: 获取指定列的数值中的最小值
AVG(列名)`: 计算指定列的数值中的平均值
如果数据类型不是数值, 则结果为: 0
分组查询:
* 格式:
* `GROUP BY 列名 HAVING 条件`,
* `SELECT ... FROM ... WHERE ... GROUP BY 列名 HAVING 条件;`
* `HAVING`的作用: 可选, 对查询结果进行分组显示后, 再次按条件过滤
最终一个完整的SELECT语句格式
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... DESC;
JDBC:
JDBC操作数据库的步骤:
1.注册驱动
告知JVM实用的是哪一个数据库的驱动
DriberManger.registerDriver():是真实的注册驱动的方法
因为驱动中实现了这个方法,推荐我们使用:
Class.forName("数据库驱动的Driver实现类的全类名")
2.获得链接
使用JDBC中的类,完成对MySQL数据库的连接
获取连接
Connection conn = DriverManager.getConnection(url,username,password)
url`: 数据库地址, `jdbc:mysql://主机IP:端口号/数据库名
主机IP或端口号可以省略, 默认使用localhost和3306: `jdbc:mysql:///day02_04
3.获得语句执行平台
通过连接对象获取对SQL语句的执行者对象
Statement s = conn.creatStatement(); 不安全的
PrepardStatement ps = conn.prepareStatement(String sql):创建预编译对象
PreparedStatement`接口
void setObject(int paramIndex, Object value)`: 设置指定占位符的值
注意: 索引从1开始
SQL语句中的参数使用`?`问号占位符代替, 且不要写单引号
int executeUpdate()`: 执行INSERT, DELETE, UPDATE语句, 返回生效的行数
注意该方法不要传递参数
ResultSet executeQuery()`: 执行SELECT查询语句, 返回结果集
注意该方法不要传递参数
4.执行SQL语句
使用执行者对象, 向数据库执行SQL语句, 并获取执行结果
Statement
增删改: `int s.executeUpdate(String sql)`
判断操作是否成功: 判断返回值是否`>0`则生效, 否则不成功
查: `ResultSet rs = s.executeQuery(String sql)`
思考: 判断操作是否成功: 是返回null呢还是调用`.next()`用是否为true判断?
PreparedStatement
增删改: `int ps.executeUpdate();`
判断操作是否成功: 判断返回值是否`>0`则生效, 否则不成功
查: `ResultSet rs = ps.executeQuery();`
5. 处理结果
根据项目的业务需求对结果进行操作
`ResultSet`接口
boolean next()`: 将结果集的指针向下移动一行, 并返回是否还有下一条记录
注意: 没有调用该方法之前, ResultSet的光标在第一条记录之前, 只有调用一次next方法后, 指针才指向第一条记录
boolean next();`: 将指针向后移动, 如果有下一个记录则true, 否则false
默认不执行的之后, 指针在第一条记录之前; 只有调用一次才能指向第一条: `while (rs.next()) {}`
String getString(String 列名)`: 获取指定列的值, 以String类型
Object getObject(String 列名)`: 获取指定列的值, 以Object类型
void close()`: 释放结果集资源
6. 释放资源
释放数据库连接, 必须
resultSet.close()`
preparedStatement.close()`
statement.close()`
connection.close()`
|
|