数据库(简单理解为是数据存储的基本容器),数据库管理系统(MySQL Oracle DB2 SQLServer 内存数据库),表(表是数据库下一个对象,实际的数据存储的位置)
表一行: 认为是一个实体,记录;
每一个列: 属性,域
3306/用户名密码/编码设置 ;
Mysql安装完成,会生成一个服务;
建立数据库,建立表: 设计表的结构(比较重要)
可能包含了很多其他的部分:
DDL :数据定义语言
创建数据库,创建表;
–创建数据库语法
mysql> create database mydb;
Query OK, 1 row affected (0.01 sec)
–创建表
mysql> create table student(sId int auto_increment primary key,sName varchar(20)
not null,sAddress varchar(20));
Query OK, 0 rows affected (0.11 sec)
—删除表
mysql> drop table student;
Query OK, 0 rows affected (0.05 sec)
–删除数据库
mysql> drop database mydb;
Query OK, 0 rows affected (0.13 sec)
DML: 数据操作语言
增加 :
Insert into 表名(列名列表) values(值列表)
注意: 列名列表和值列表要匹配(个数,类型要匹配) ;列名的列表时可以省略的(默认是表中的所有列来插入);
如果某个列自动增长的,可以插入,也可以不插入(值为null ,或者这个列省略不写)
删除:
删除的是表中的行;
Delete from 表 [where 条件] [] 表示可选
如果不加条件删除的是表中的所有行;(注意 如果没有外键的依赖关系的话)
Truncate table 表名 ; 删除表 [delete from 表]
修改:
Update 表 set 列=值,列2=值 [where 条件]
查询:
Select 列名 as 显示名,列名 显示名 from 表 [where 条件]
1) 回去将早上那个Emp的案例使用HahsMap完成;
2) 回去设计表:
商品类型表(父表): goodsType
列名 类型 说明
typeId Int 商品类型编号,主键,自动增长
typeName Varchar(20) 商品类型,不能为空
TypeRemark Varchar(200) 类型的描述
商品表(子表): goods
列名 类型 说明
goodsId Int 商品编号,主键,自动增长
goodsName Varchar(20) 商品名称,不能为空
goodsPrice Double 价格
goodsCount Int 数量
TypeId Int 商品类型ID关联type表typeId
goodsDate Datetime 上架时间
3) 使用crud语句完成向表(3)插入 删除 修改 查询操作
-- 1 插入 分别向goodType和goods表中插入一条记录
insert into goodstype values(null,'休闲小零食','好吃呀~')
insert into goods values(null,'辣条',2,1,10000,'2018-03-03')
insert into goods values(null,'辣鸡',20,1,10,'2018-03-03');
insert into goods values(null,'醉鹅',200,1,1,'2018-03-03');
insert into goods values(null,'拌面',5.6,1,10000,'2018-03-03');
select * from goodstype;
select * from goods;
-- 2 修改 将商品类型为编号为1 和[and or]2的商品价格统一修改为25
update goods set goodsprice = 25 where typeId =1 or typeId=2;
update goods set goodsprice = 25 where typeId in (1,2);
-- 3 删除 将商品名字中(包含) '辣条' 的记录删除
-- 模糊查询 like
delete from goods where goodsName like '%辣条%'
-- 4 查询 查询价格最高的那个商品,显示其名称和价格
--order by 排序
select goodsName,goodsPrice from goods ORDER BY goodsprice [ASC] -- 默认升序
select goodsName,goodsPrice from goods ORDER BY goodsprice DESC -- 降序
-- select top 1 是SQLServer中的语法 mysql不支持
-- 解法1
select goodsName,goodsPrice from goods ORDER BY goodsprice DESC limit 1
-- 解法2
-- max(列)
-- 这种写法是错误的
select goodsName,max(goodsPrice) from goods
-- 将
select goodsName from goods
select max(goodsPrice) from goods
-- 使用max的正确写法
-- 先得到max
select max(goodsPrice) from goods
-- 将max的结果作为另外一个查询的条件 --子查询
select goodsName,goodsPrice from goods where goodsPrice =(select max(goodsPrice) from goods)
-- 5 联接查询 显示结果类似如下:
商品名称 商品类型
辣条 休闲小零食
-- 内联接 INNER JOIN
select goods.goodsName as 商品名称,goodstype.typeName as 商品类型
from goods inner JOIN goodstype
on goods.typeId = goodstype.typeId
-- 可以使用where
select goods.goodsName as 商品名称,goodstype.typeName as 商品类型
from goods , goodstype
where goods.typeId = goodstype.typeId
希望表中存储的数据是正确的,有意义的,完整地;
完整性约束 实现
实体完整性约束 主键,自动增长[唯一键]
域完整性约束(列 属性) 数据类型,是否为空,唯一,默认值等
参照完整性约束(引用完整性约束) 外键
其他完整性约束[登陆<->注册->要积分->会员等级不够->下载文件] 自定义一些规则,函数触发器等来实现
唯一键是可以为null,但是主键不能为空
Select 列名,列名 as 别名 from 表 [select * from … 尽量不要写]
Select 列名,列名 as 别名 from 表 [where 条件]
Select 列名,列名 as 别名 from 表 [where 条件] [order by] 列名1,列名2 [asc/desc]
统计的函数: count(列名) 计数 /sum(列名)/avg(列名)/max(列名)/min(列名)
Select 列名,列名 as 别名 from 表 [group by] 列1,列2
Select 列名,列名 as 别名 from 表 limit 参数1
Select 列名,列名 as 别名 from 表 limit 参数1,参数2
1.3.6 完整的查询:
Select 列名,列名
From 表
Where 条件
Group by 分组
Having 条件 –分组之后的筛选
Order by 列 [asc /desc]
可以使用冒号来定义表格的对齐方式,如下:
类型 | 语法 | 备注 |
---|---|---|
内联接 | Inner join | 得到的是两(多)张表的公共数据 略(见昨天的笔记和视频) |
外联接(左) | Left join | 得到左表的所有数据,右表中如果没有对应的数据,则显示为null |
外联接(右) | Right join | 得到的是右表中的所有数据,左侧表中如果没有对应,则显 |
交叉联接 | Cross Join | Cross Join 笛卡尔积 |
1) 自己去熟悉一下刚刚的查询操作;
2) 设计一个新的数据库和表: 用户的注册和登录操作(sql来模拟)
检索某个范围的记录; 例如: 以“王%”开头的所有人;
通配符: % [] _ 等等
1) Like: 字符串比较多
Select 列 from 表 where 列 like ‘%王%’
2) Between … and: ( 列 > 值 and 列< 值)
某个范围 select 列 from 表 where 列 between 值1 and 值2 (值1<值2) –可以使数字或者时间值
3) In (not in) : 列 = 值 or 列 =值
匹配小括号内的值
Select 列 from 表 where 列 in (值1,值2)
Select 列 from 表 where 列 = 值 or 列 =值
应用:批量删除很好用;
4) Exists (not exists)
Select 列 from 表 where exists (查询结果)
某种程度上,我们的exists检索可以使用索引; in 使用的全表的扫描 ;所以通常意义上来说,我们的exists效率比较高;
5) 其他:
空 (NULL) is null ( is not null)和 “” 的查询(=’’ !=’’ <>’’):
正则是一种字符匹配一种方式; 比如要检索表中满足 (哪些用户名是a开头的? 哪些用户名是以m结尾的? ‘%m’ )
…. Like ‘%m’ 当然也可以使用如下的正则表达式实现
Select 列 from 表 where 列 regexp ‘正则基本语法
1) 设计一个网吧计费系统设计(用户表 计算机表 上机记录表),同时模拟添加(用户注册)用户,计算机(添加设备),用户上机,换机,下机操作,用sql完成.
2) 设计一个员工管理数据表: 员工表,部门表,模拟添加员工,开除员工,给员工加工资;
Java + MySQL ; java的数据库连接技术;
案例:OA平台的部门管理,部门添加,删除,修改,查询等;
操作步骤: 部门添加
1. 建立数据库和表; 插入测试数据
2. 需要加入外部的mysql- ….jar包;
记得要添加到构建路径( build path)
我们可以使用mysql-connector.jar 中的一些类(接口)和方法;
/**
* 增加操作的代码
* @author Administrator
*
*/
public class TestAddDept {
public static void main(String[] args) throws SQLException {
// 要连接到数据库的基本信息
// String hostName = "localhost"; // 127.0.0.1 // 192.168.13.122
// String port = "3306";
// ① : 创建url user password
String url = "jdbc:mysql://localhost:3306/companydb";
String user = "root";
String password = "root";
// ② 建立一个连接
// 两个对象 Connection DriverManager
// url - jdbc:subprotocol:subname 形式的数据库 url
Connection conn = DriverManager.getConnection(url, user, password);
// 使用conn
//System.out.println(conn);
// 使用conn对象得到一个 执行sql语句的对象 statement/preparedstatement
// ③ 编写sql语句 这里我们要操作MySQL数据库
String sql = "insert into dept values(null,'开发部','挺好的')";
//④ 通过连接对象得到 PreparedStatement
PreparedStatement pstmt = conn.prepareStatement(sql);
//⑤ 执行增删改 ,并处理结果
int n = pstmt.executeUpdate();
if (n > 0)
System.out.println("增加成功");
else
System.out.println("增加失败");
// ⑥ 释放资源
if (null != pstmt)
pstmt.close();
//连接放在最后来释放
if (null != conn)
conn.close();
}
}
3) 设计一个网吧计费系统设计(用户表 计算机表 上机记录表),同时模拟添加(用户注册)用户,计算机(添加设备),用户上机,换机,下机操作,用sql完成. [电子版作业发我邮箱]
[email protected] . sql文件 (周天晚上)
4) 回去完成 员工的添加,删除,修改操作; 从控制台输入进来;
5) 回去预习 查询的操作;