黑马程序员技术交流社区

标题: 【石家庄校区】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