黑马程序员技术交流社区
标题: 【石家庄校区】day07-day10学习笔记 [打印本页]
作者: zhouxiaomeng 时间: 2018-5-9 15:40
标题: 【石家庄校区】day07-day10学习笔记
本帖最后由 小石姐姐 于 2018-5-11 10:09 编辑
day07-day10学习笔记
MySQL概述1 .什么是数据库
就是一个文件系统,通过标准的SQL访问;
2 .什么是关系型数据库
存放的是实体和实体之间的关系
SQL结构化查询语言(一)SQL对数据库操作1 .创建数据库:
create database 数据库名 character set 字符集 collate 字符集校对规则;2 .查看数据库:
show databases;查看所有的数据库;
show create database 数据库名;查看某个数据库的定义信息;3 .修改数据库:
alter database 数据库名 character set 字符集 collate 字符集校对规则;4 .删除数据库:
drop database 数据库名5 . 切换数据库:
use 数据库名(二)SQL对数据库表操作1.SQL创建表语法 create table 表名(字段名称 字段类型(长度) 约束,字段名称 字段类型(长度) 约束,字段名称 字段类型(长度) 约束.....) 多个字段之间用逗号分开
字段类型:
Java中的类型 | SQL中的类型 |
byte/short/int/long | tinyint/smallint/int/bigint |
float | float |
double | double |
boolean | boolean |
char/String | char/varchar |
Date | date/time/datetime/timestamp |
File | BLOB/TEXT |
char和varchar的区别: char代表是固定长度的字符或字符串。 varchar代表的是可变长度的字符串。
datetime和timestamp区别 datetime就是既有日期又有时间的日期类型,如果没有向这个字段中存值,数据库使用null存入到数据库中 timestamp也是既有日期又有时间的日期类型,如果没有向这个字段中存值,数据库使用当前的系统时间存入到数据库中。
约束
单表约束分类:
建表语句 :
create database web_test1;
use web_test1;
create table user(
id int primary key auto_increment,//主键自增
username varchar(20) unique,
password varchar(20) not null,
age int,
birthday date
);2 .SQL查看表语法 1 . 查看所有表: show tables;
2 .查看某个表的结构信息: desc 表名;
3 .SQL删除表语法drop table 表名;
4 .SQL修改表语法主要记住两个:
1.添加列:alter table 表名 add 列名 类型(长度) 约束;
2.修改列类型:alter table 表名 modify 列名 类型(长度) 约束;
(三)SQL对数据库表中记录操作1.添加表的记录插入某些列:
insert into 表名 (列名1,列名2,列名3....) values(值1,值2,值3...);
插入所有列:
insert into 表名 values(值1,值2,值3...);
注意事项
1.值的类型与数据库中表列的类型一致。
2.值的顺序与数据库中表列的顺序一致。
3.值的最大长度不能超过列设置最大长度。
4.值的类型是字符串或者是日期类型,使用单引号引起来。
直接向数据库中插入中文记录会出现错误!!!解决方法: 需要将MySQL数据库服务器中的客户端部分的字符集改为gbk。 找到MySQL的安装路径:my.ini文件,修改文件中[client]下的字符集,如下所示;
[client]
port=3306
[mysql]
default-character-set=gbk2.修改表记录;语法:update 表名 set 列名=值,列名=值 [where条件];
注意事项
1.值的类型与列的类型一致。
2.值的最大长度不能超过列设置的最大长度。
3.字符串类型和日期类型添加单引号。
3 .删除表记录语法:delete from 表名 [where条件] 一般都是带where条件的,慎用!
删除表中的记录有两种做法:
4 .查看表记录语法格式:S(select)… F(from)…W(where)…G(group by)…H(having)…O(order by);
SELECT语句的执行顺序SELECT语句中子句的执行顺序与SELECT语句中子句的输入顺序是不一样的,所以并不是从SELECT子句开始执行的,而是按照下面的顺序执行:
开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果
每个子句执行后都会产生一个中间结果,供接下来的子句使用,如果不存在某个子句,就跳过。
举例:
select s.sname,avg(sc.score) from student s,stu_cour sc where s.sid = sc.sno group by s.sname;基本查询: select [distinct] * |列名 from 表名 [条件];
1.查询所有学生信息;
select * from exam;
select name,english from exam;//多个字段之间用逗号
select distinct english from exam; //distinct为去重4 .别名查询
select name,english+chinese+math as sum from exam;条件查询:
使用where子句
1 . > < , >= , <= , <> ,= 注意不等于是<>
2 .like:模糊查询 注意:%和_的区别, %代表0个及以上占位, _代表一个占位, %%
3 .in:范围查询
select * from exam where english in (69,75,89); 条件关联:and , or ,not
select * from exam where name = '李四' and english > 90;排序查询:
order by 字段名:asc升序 desc降序;
查询学生信息,先按照语文成绩进行倒序排序,如果成绩相同再按照英语成绩升序排序
select * from exam order by chinese desc,english asc;聚合函数:
求和 | 最大值 | 最小值 | 计数 | 平均值 |
sum() | max() | min() | count() | avg() |
1 .sum();
select sum(english)+sum(chinese)+sum(math) from exam;
select sum(english+chinese+math) from exam;
两者的区别?
sum(ifnull(字段1,0)+字段2+字段3);2 .count(*) | count(id)写主键的话 效率比较高;
3 .max()|min() 最大最小;
4 .avg();平均值;
分组查询:
语法:group by;
where子句后面不能跟聚合函数。如果现在使用带有聚合函数的条件过滤(分组后条件过滤)需要使用一个关键字having;
按商品名称统计,统计每类商品花费的总金额在5000元以上的商品,并且按照总金额升序排序
select product,sum(price) from orderitem group by product having sum(price) > 5000 order by sum(price) asc;
多表的设计原则
一对多多的一方设置关联字段跟一的一方的主键进行外键关联,是否设置成真正外键看业务需求;
多对多建立中间表,设置至少两个字段对应关联两个表的主键,是否这是真正的外键看业务需求;
多表查询内连接隐式连接:select * from student s,classes c where s.cno = c.cid;
显示连接(太常用):
select * from classes c inner join student s on c.cid = s.cno;
外连接左外连接;
select * from student s left join classes c on on c.cid = s.cno;
右外连接
select * from student s right join classes c on on c.cid = s.cno;
多表查询带in子查询
select * from classes where cid in (SELECT cno FROM student WHERE birthday > '1991-01-01');
带exists子查询
select * from classes where exists (SELECT cno FROM student WHERE birthday > '1991-01-01');
带any子查询
SELECT * FROM classes WHERE cid > ANY (SELECT cno FROM student)
带all子查询
SELECT * FROM classes WHERE cid > ALL (SELECT cno FROM student)
JDBC开发入门第一步:加载驱动;
Class.forName("com.mysql.jdbc.Driver ");抛异常
第二步:获得连接;
Connection conn = DriverManager.getConnection( , , )
第三步:进行JDBC的基本操作;
创建可执行sql语句的对象;
编写SQL语句
执行sql语句
第四步:释放资源;
注意事项:
写代码的原则:
对扩展是开放的
对修改源码是关闭的;
查询的时候 模糊查询的时候 like ? 然后在设置参数的时候 setString(1,"%小%") 推荐这种写法;
@Test
//查询数据;
public void demo1(){
//作用域问题,所以将Connection连接/PreparedStatement/ResultSet结果集定义为空
Connection conn = null;
PreparedStatement pstm = null;
ResultSet rs = null;
//将代码添加到try(){}catch(){}finally{}中
try {
//创建连接;在创建连接的时候同时已经加载驱动了
conn = JDBCUtils.getConnection();
//写sql语句;
String sql = "select * from student where sid > ?";
//预编译;传SQL语句;
pstm = conn.prepareStatement(sql);
//设置参数
pstm.setString(1, "5");
//执行Sql语句;这里面不需要传SQL参数;因为上面传过了
rs = pstm.executeQuery();
while(rs.next()){//判断是否有下一行
System.out.println(rs.getString("sid")+" "+rs.getString("sname")+" "+rs.getString("sex"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCUtils.release(rs,pstm,conn);//释放资源
}
}增删改:
@Test
//修改数据
public void demo2(){
Connection conn = null;
PreparedStatement pstm = null;
try {
//创建连接;
conn = JDBCUtils.getConnection();
//写SQL;
String sql = "update student set sname = ?,sex = ? where sid = ?";
//预编译;
pstm = conn.prepareStatement(sql);
//设置参数;
pstm.setString(1, "测试修改");
pstm.setString(2, "不男不女");
pstm.setString(3, "3");
//执行sql;
int num = pstm.executeUpdate();
if(num>0){
System.out.println("修改成功!");
}else{
System.out.println("修改失败!");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.release(pstm, conn);//释放资源
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |