本帖最后由 小石姐姐 于 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);//释放资源
}
}
|