JavaWeb
SQL:
进入Mysql
1.SQL语句可以单行或多行写,以分号结束
2.注释: 单行注释: – 注释内容(中间要有一个空格隔开)
#注释内容(中间没有空格)
多行注释:/*注释内容 */
DDL (操作数据库)
查询:show databases;
创建:create database 数据库名称;
(判断,如果不存在则创建)
create database if not exists 数据库名称;
删除:drop database 数据库名称;
(判断,如果不存在则删除)
drop database if not exists 数据库名称;
使用当前数据库
(查看当前数据库) select database();
(使用数据库) use 数据库名称;
DDL (操作表)
查询当前数据库下所有表:
show TABLES;
查询表结构:
DESC 表名称;
创建表
CREATE TABLE 表名(
字段名 数据类型 ,
字段名 数据类型
);
删除表
DROP TABLE 表名;
删除表时判断是否存在
DROP TABLE IF EXISTS 表名;
修改表
改表名
alter table 表名 rename to 新的表名;
添加一列
alter table 表名 add 列名 数据类型;
修改数据类型
alter table 表名 modify 列名 新数据类型;
修改列名和数据类型
alter table 表名 change 列名 新列名 新数据类型;
删除列
alter table 表名 drop 列名;
DML
添加数据
给指定列添加数据
insert into 表名(列名1,列名2,…) values(值1,值2,…);
给全部列添加数据
insert into 表名 values(值1,值2,…);
批量添加数据
insert into 表名(列名1,列名2,…) values(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
insert into 表名 values(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
修改数据
修改表数据
update 表名 set 列名1=值1,列名2=值2,…[WHERE 条件];
删除数据
delete from 表名 [where 条件];
DQL
基础查询
查询多个字段
select 字段列表 from 表名;
查询所有数据
select * from 表名;
去除重复记录(使用关键字distinct)
select distinct 字段列表 from 表名;
起别名
AS :as 也可省略
条件查询
查询语法:
select 字段列表 from 表名 where 条件列表
条件
排序查询
select 字段列表名 from 表名 order by 排序字段名1 [排序方式1],排序字段2 [排序方式2] …;
排序方式:升序:asc 降序:desc
注:如有多个排序条件,当前边条件值一样时,才会根据第二条条件
聚合函数:将一列数据作为一个整体,进行纵向计算
聚合函数的分类
聚合函数的语法
select 聚合函数名(列名) from 表;
注意:null值不参与所有聚合函数运算
分组查询
语法:select 字段列表 from 表名 [where 分组前条件限定] group by 分组字段名 [having 分组后条件过滤];
where和having区别
执行时机不一样:where分组之前进行限定,不满足where,不参与分组,having是分组之后进行过滤
where不能对聚合函数进行判断,having可以
顺序 :where>聚合函数>having
分页查询(limit)
约束
概念:作用在表中列上,用于限制加入表的数据,为保证数据库中数据的正确性,有效性和完整性
约束添加
语法:
创建表时添加
create table 表名(
列名 数据类型 约束;
….
);
建完表之后添加
alter table 表名 modify 字段名 数据类型 约束;
删除约束
alter table modify 字段名 数据类型;
外键约束
概念:外键用来让两个表的数据之间建立连接,保证数据的一致性和完整性
语法
添加约束
创建表时添加
create table 表名(
列名 数据类型;
….
constraint 外键名称 foreign key (外键列名) references 主表(主表列名)
);
建完表之后添加
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(主表列名)
删除约束
alter table 表名 drop foreign key 外键名称;
数据库设计
表的关系
一对多和一对一都通过外键来构造
多对多要通过第三张表来构造
多表查询分类
连接查询:内连接 外连接:右外连接 左外连接
子查询
内连接语法(相当于查询A B交集数据)
隐式内连接
select 字段列表 from 表一,表二… where 条件;
显示内连接
select 字段列表 from 表1 inner join 表二 on 条件;
外连接语法
左外连接(以上面图为例,A集合和交集部分)
select 字段列表 from 表1 left join 表二 on 条件;
右外连接(以上面图为例,B集合和交集部分)
select 字段列表 from 表一 right join 表二 on 条件;
子查询
JDBC
它是Java程序访问数据库的标准接口。
使用Java程序访问数据库时,Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接口来访问,而JDBC接口则通过JDBC驱动来实现真正对数据库的访问。
JDBC基本步骤
项目搭建
1.
2.
有此提示
注册驱动(但是从jdk6开始,会自动导入此类,就可省略不写)
Class.forName(“com.mysql.jdbc.Driver”);
也可用DriverManager.registerDriver(com.mysql.jdbc.Driver)
Connection
JDBC重要的接口,建立与数据库的连接
建立时需要指定的数据库url,用户名,密码参数
url:
jdbc:mysql://主机名称:mysql服务端口号/数据库名称?参数=值&参数=值
若连接本机,且端口未改变,则可以省略主机名称:mysql服务端口号,即jdbc:mysql:///数据库名称?参数=值&参数=值
用户名和密码
user,password可以用“属性名=属性值”
Statement和PreparedStatement
Statement作用执行SQL语句
int executeUpdate(sql):用于执行DML,DDL
返回值:1.DML语句影响的行数 2.DDL语句后,执行可能为0
ResultSet executeQuery(sql) :用于执行DQL
返回值:ResultSet结果集对象
DML,DDL语句
因为DML用于操作数据库中的数据,包括插入、更新、删除和查询数据
DDL用于定义和修改数据库的结构,包括创建、修改、删除数据库对象
所以影响的行数为0或1
处理结果时判断是否为0,则可判断是否成功
DQL
因为是查询语句,所以要用到ResultSet
ResultSet:
作用:封装DQL查询结果
ResultSet stmt.executeQuery(sql) 执行DQL,返回ResultSet对象
对比
PreparedStatement
之所以会用到PreparedStatement,是因为Statement存在SQL注入(存在于登陆)
详细可见:(JDBC查询 - Java教程 - 廖雪峰的官方网站)
使用PreparedStatement可以完全避免SQL注入的问题,因为PreparedStatement始终使用“?”作为占位符,并且把数据连同SQL本身传给数据库,这样可以保证每次传给数据库的SQL语句是相同的,只是占位符的数据不同,还能高效利用数据库本身对查询的缓存。上述登录SQL如果用PreparedStatement可以改写如下: