cgb2107-day05

Posted cgblpx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cgb2107-day05相关的知识,希望对你有一定的参考价值。

一,扩展视图

–1,概述

可视化的表,视图当做是一个特殊的表,是指,把sql执行的结果,直接缓存到了视图中。
下次还要发起相同的sql,直接查视图。
使用: 1,创建视图 2,使用视图

–2,测试

create view 视图名 as  SQL语句;
select * from 视图名;
#视图:就是一个特殊的表,缓存上次的查询结果
#好处是提高了SQL的复用率,坏处是占内存无法被优化

#1.创建视图
CREATE VIEW emp_view AS
SELECT * FROM emp WHERE ename LIKE '%a%' #模糊查询,名字里包含a的
#2.使用视图
SELECT * FROM emp_view

二,SQL练习

–1,测试

参考帖子里的内容:https://blog.csdn.net/u012932876/article/details/117359992

#统计每个岗位的老师有几个人
SELECT COUNT(1),prof FROM teachers 
GROUP BY prof #按照非聚合列分组
HAVING prof='副教授' #having分组后再过滤

#统计每个系最年长的老师
SELECT depart,MIN(tbirthday) FROM teachers
GROUP BY depart
#order by tbirthday #按照数字升序

#查询大于平均年龄的老师
SELECT AVG(tbirthday) FROM teachers 
#'19690708250000.0000000000'
SELECT * FROM teachers WHERE tbirthday<(
	SELECT AVG(tbirthday) FROM teachers )

#查询男老师能上的课程
#子查询:in子查询,因为第一次查到了多个结果
SELECT cname FROM courses WHERE tno IN(
	SELECT tno FROM teachers WHERE tsex='男')
#连接查询:小表驱动大表,高效
SELECT courses.cname FROM courses INNER JOIN teachers
ON teachers.tno=courses.tno #表关系
WHERE teachers.tsex='男' #业务条件
#笛卡尔积
SELECT courses.cname FROM teachers,courses
WHERE teachers.tno=courses.tno #表关系
AND teachers.tsex='男' #业务条件

#了解insert into
#给指定列插入指定值,多个列名用逗号隔开,多个值也是逗号隔开
INSERT INTO dept(dname) VALUES('java开发部')

三,SQL优化

–1,SQL的执行顺序

–2,总结

参考帖子里的内容:https://blog.csdn.net/u012932876/article/details/117359992
1,用字段名代替*
2,where里能用and就不用or
3,设置字段类型时,能用varchar就不用char
4,字段值尽量用数字代替字符串
5,给常用来作为查询条件的字段,设计索引,但是,单表的索引控制再5个以内
6,观察SQL的性能,使用explain关键字,本质上就是看有没有用到索引
7,模糊查询,where name like ‘张%’ ,是高效的写法,甚至可以让索引生效
8,where name=123,会导致索引失效。
where name=‘123’,会让name字段的索引生效
。。。。

四,JDBC

–1,概述

全称是java database connectivity,专门用来通过Java程序 操作 数据库。
JDBC还是一套标准,支持对各种数据库产品的操作。
mysql数据库使用JDBC:提供了一个jar包(很多的工具类)。

–2,使用步骤

1,创建工程,导入MySQL提供的jar包并编译:把jar包复制到工程里,编译jar包(选中jar包右键add as library…)
2,通过Java连接数据库,需要指定一些连接数据库的参数:用户名,密码,端口号,ip地址,指定库名。
3,发起SQL语句并执行
4,处理结果集

–3,入门案例

package cn.tedu.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

//测试 jdbc
//1,导入jar包  2,连接数据库
public class Test1 {
    public static void main(String[] args) throws Exception {
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,获取数据库的连接
                    //数据传输协议   数据库的ip 端口号 数据库名
        String url = "jdbc:mysql://localhost:3306/cgb2107";
        Connection c = DriverManager.getConnection(url,"root","root");
        //3,获取传输器
        Statement s = c.createStatement();
        //4,利用传输器执行SQL,返回结果
        ResultSet r = s.executeQuery("select * from dept");//执行查询语句
        //5,处理结果
        while( r.next() ){//next()判断有数据吗,有就返回true
            //解析数据,用getXxx()获取每个字段的值--参数可以是字段名或者字段索引
            int a = r.getInt(1);//获取第1列的值
            System.out.println(a);
            String b = r.getString("dname");//获取dname字段的值
            System.out.println(b);
            String loc = r.getString(3);//获取第3列的值
            System.out.println(loc);
        }
        //6,释放资源
        r.close();//结果集
        s.close();//传输器
        c.close();//连接
    }
}

–4,练习

package cn.tedu.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

//练习jdbc
public class Test2 {
    public static void main(String[] args) throws Exception {
//        method();
        method2();
    }
    //利用jdbc,完成新增的功能
    private static void method2() throws Exception{
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,获取数据库的连接
        //数据传输协议   数据库的ip 端口号 数据库名
        String url = "jdbc:mysql://localhost:3306/cgb2107";
        Connection c = DriverManager.getConnection(url,"root","root");
        //3,获取传输器
        Statement s = c.createStatement();
        //4,利用传输器执行  增删改的SQL
        //executeUpdate()用来执行增删改的SQL,只返回影响行数
        int rows = s.executeUpdate(
                "INSERT INTO emp(ename,job) VALUES('rose','副总')");
        //5,释放资源
        //r.close();//结果集
        s.close();//传输器
        c.close();//连接
    }
    //利用jdbc,查询emp表的所有数据
    private static void method() throws Exception {
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,获取数据库的连接
        //数据传输协议   数据库的ip 端口号 数据库名
        String url = "jdbc:mysql://localhost:3306/cgb2107";
        Connection c = DriverManager.getConnection(url,"root","root");
        //3,获取传输器
        Statement s = c.createStatement();
        //4,利用传输器执行SQL,返回结果
        ResultSet r = s.executeQuery("select * from emp");
        //5,处理结果
        while(r.next()){//如果有数据,next()返回true
            for(int i=1;i<9;i++){//自己数表里一共有几列,就循环几次
                Object a = r.getObject(i);//参数是字段的索引1 2 3...
                System.out.println(a);//打印每列得到的值
            }
        }
        //6,释放资源
        r.close();//结果集
        s.close();//传输器
        c.close();//连接
    }
}

五,作业

需求: 模拟用户登录现象
1,需要你自己创建user表,并提供一些字段(id name password)
2,向表中添加记录,如1 jack 123456
3,编写JDBC程序,完成登录
4,本质上就是向发起了select语句:
select * from user where name=‘jack’ and password=‘123456’
5,当用户输入正确的用户名和密码时,提示登录成功,否则提示登录失败

以上是关于cgb2107-day05的主要内容,如果未能解决你的问题,请参考以下文章

cgb2107-day16

cgb2107-day07

cgb2107-day18

cgb2107-day10

cgb2107-day03

cgb2107-day14