第二阶段_sql day16数据库 1、基本概念 2、DataBase - DB 2、MySQL 1、启动与关闭 1、services.msc 打开服务窗口 2、net start/stop mysql 管理员cmd执行启动或关闭 2、登录和退出 1、mysql -uroot -proot 2、exit/quit 退出 3、mysql -h地址 -u -p 4、mysql --host=ip值 --user=root --passsword=密码 3、SQL1、定义 结构化查询语言,操作所有关系型数据库的规则2、通用语法1、单行/多行书写,分号结束2、不区分大小写,关键字建议用大写3、注释1、单行注释: -- 注释内容 #注释内容 2、多行注释: /* 注释 */ 3、分类1、DDL 操作数据库和表1、操作库1、C(create) 创建
//创建数据库create database 数据库;//判断数据库不存在,创建,并指定字符集create database if not exists 数据库名 character set utf8
2、R(retrieve) 查询
//查看所有数据库show databases;//查询指定数据库, 字符集show create database 数据库名;
3、U(update) 修改
//修改指定数据库的字符集alter database 数据库名 character set 字符集;
4、D(delete)删除
//删除指定数据库drop database 数据库名;//判断存在后删除drop database if exists 数据库名;
5、使用数据库
//查询当前正在使用的数据库名select database();//使用数据库use 数据库名;
2、操作表 1、查询
//查询库中所有表show tables;//查询表结构desc 表名;//查询指定表创建信息show create table 表名;
2、创建
//创建create table 表名( 列名1 数据类型1, 列名2 数据类型2, ... 列名n 数据类型n); //复制create table 新表 like 旧表;//sql常用数据类型1、int整数 2、double(x,y)小数(指定范围) 3、date日期,只包含年月日,yyyy-MM-dd4、datetime日期 包含年月日时分秒,yyyy-MM-dd HH:mm:ss5、timestamp时间戳 包含年月日时分秒,yyyy-MM-dd HH:mm:ss (自动赋值当前系统时间)5、varchar(x) 字符串,(指定长度)
3、修改
//修改表名alter table 旧表 rename to 新表;rename table 旧表 to 新表;//修改表字符集alter table 表名 character set 字符集名;//添加列alter table 表名 add 列名 数据类型//修改字段名及类型alter table 表名 change 旧字段名 新字段名 新数据类型;alter table 表名 modify 旧字段名 新数据类型;//删除列alter table 表名 drop 字段名;
4、删除
//删除drop table 表名;//判断存在,删除drop table if exists 表名
2、DML 增删改表中数据 1、增
insert into 表名(列名1,列名2,...,类名n) values(值1,值2,...,值n);//注意1、列名和值一一对应2、如果表名后不定义列名,则默认所有添加 insert into 表名 values(值);3、除了数字类型,其他类型需要使用引号(单双都可用)
2、删
delete from 表名 [where 条件];//注意1、如果不加条件,则删除表内所有数据。但是不适用,一般是先删除表,再创建同名新表,如:truncate 表名;
3、改
update 表名 set 列名1=值1,列名2=值2...列名n=值n [where 条件];//注意1、如果不加条件,将会修改表中所有记录的数据
3、DQL 查询表中数据 1、定义
select 字段名列表 from 表名列表 where 条件列表 group by 分组字段 having 分组后条件 order by 排序 limit 分页限定;
2、基本查询
//查询表内所有字段select * from 表名;//查询指定字段select 字段列表 from 表名;//去重查询 --distinctselect distinct 字段列表 from 表名;//计算列ifnull(表达式1,表达式2)//起别名 as
3、条件查询
//>,<,=,!=,>=,<=,<>//between...and...//and / or//in()//is null / is not null null值不能使用判断//like
4、模糊查询
1、占位符 _ 一个任意字符 % 多个任意字符
4、DCL 授权day171、DQL1、排序查询
order by 子句order by 字段1 排序方式2, 字段 2 排序方式2ASC 升序DESC 降序注意 1、如果有多个排序条件,当第一排序有重复时,才进行第二排序2、orderby单独使用,不能被where修饰
2、聚合函数 将一列数据作为一个整体,进行纵向计算1、count 计算个数
select count(字段名) from 表名;//聚合函数计算会排除null值select count(ifnull(字段名,0)) from 表名//一般选择主键进行统计
2、max 计算最大值
select max(字段名) from 表名;
3、min 计算最小值
select min(字段名) from 表名;
4、sum 计算和
select sum(字段名) from 表名;
5、avg 计算平均分
select avg(字段名) from 表名;
3、分组查询
1、格式select 分组字段,聚合函数() from 表名 group by 分组字段;2、带条件select 分组字段,聚合函数() from 表名 where 条件 group by 分组字段;
4、分页查询
//语法:select from 表名 limit 开始索引,长度; //公式:开始索引=(页码-1)*长度//limit分页操作是一个“方言”,即各种数据库的分页操作不一样
5、where和having 1、where在分组前限定,having 分组后限定 2、where不能跟聚合函数,having可以 2、约束1、概念 对表中的数据进行约束,保证数据的正确性、有效性、完整性2、格式
//1、创建表时添加create table 表名( 字段名 数据类型 约束条件);//2、添加alter table 表名 modify 旧字段名 新数据类型 新约束条件;
3、分类1、主键: primary key
//1、非空且唯一//2、一张表只能有一个字段为主键//3、主键时表中记录的唯一标识//删除主键alter table 表名 drop primary key;//自动增长 auto_increment ,一般定义在主键之后//删除自增alter table 表名 modify 旧字段名 新数据类型;
2、非空: not null
//删除alter table 表名 modify 旧字段名 新数据类型;
3、唯一: unique 某一列的值不能重复,可以添加null值,但只能添加一次
//删除alter table 表名 drop index 字段名
4、外键: foreign key
//创建表时创建create table 表名( ... 外键列, constraint 外键名 foreign key(外键字段名) references 关联表名(关联字段名));//删除外键alter table 表名 drop foreign key 外键名;//添加alter table 表名 add constraint 外键名 foreign key(外键字段名) references 关联表名(关联字段名)//级联更新on update cascade,作用于设置外键后//级联删除on delete cascade
3、多表关系1、一对一2、一对多(多对一)在多的一方建立外键,指向一的一方 3、多对多实现借助中间表,至少包含两个字段 ,作为外键分别指向两张表 需要设置联合主键
create table a( id1 int, id2 int, primary key(id1,id2));
4、范式1、概念:设计数据库需要遵循的规范。各种范式呈递次规范。2、分类1、第一范式(1NF):每一列都是不可分割的原子数据项
//存在问题1、数据冗余2、数据添加3、数据删除
2、第二范式(2NF):基于1NF,非码属性必须完全依赖于候选码(消除非主属性对主码的部分函数依赖)
1、函数依赖:a-->b 如果通过a的值可以确定唯一b的值,则b依赖于a2、完全函数依赖:a-->b 如果a是一个属性组,而b的值需要依赖于a属性组的中的所有属性值3、部分函数依赖a-->b 如果a是一个属性组,而b的值只需依赖于a属性组的中的部分属性值4、传递函数依赖:a-->b b-->c5、码:如果在一张表中,一个属性或属性组,被其他所有属性完全依赖,则称此为该表的码6、主属性:码属性组中的所有属性
3、第三范式(3NF):基于2NF,任何非主属性不依赖于其他属性(消除传递依赖)4、巴斯-科德范式(BCNF)5、第四范式(4NF)6、第五范式(5NF)5、备份还原day181、多表查询1、定义
//格式select * from 表1,表2;//笛卡尔积:有集合A,B,取这两个集合的所有情况//多表查询需要消除笛卡尔积
2、分类1、内连接查询1、隐式内连接 —— where
//格式select * from 表1,表2 where 表1.字段名 = 表2,字段;//查询指定字段select 表1.字段名,表2,字段 from 表1,表2 where 表1.字段名 = 表2,字段;//为表取别名后查询select 别名1.字段名,别名2.字段 from 表1 别名1, 表2 别名2 where 表1.字段名 = 表2.字段名;
2、显示内链接
//语法select 字段列表 from 表1 [inner] join 表2 on 表1.字段名 = 表2.字段名;
3、注意1、从那些表中数据2、条件是什么3、查询哪些字段2、外连接查询1、左外连接
//语法select 字段列表 from 表1 left [outer] join 表2 on 条件;//条件示例:表1.字段 = 表2.字段//查询的是左表所有数据,以及与其的交集(右表不能匹配条件的记录显示为空)
2、右外连接
select 字段列表 from 表1 right [outer] join 表2 on 条件;//查询右表所有数据,以及与其的交集(左表不能匹配条件的记录显示为空)
3、子查询 -- 嵌套查询1、子查询的结果是单行单列:把一条查询语句当作一个值来使用,可以拿来计算或判断,运算符:=,!=,>,<,<> 2、子程序子查询的结果是单行多列或多行单列: 当作一个集合来使用,可以拿来计算或判断, 运算符 in,聚合函数 3、子程序子查询的结果是多行多列:当作一张虚拟表来使用,参与查询 4、自链接查询 -- 自己和自己查询
select 字段列表 from 表名,表名 where 条件;
2、事物1、基本介绍1、概念 事务管理的多个步骤,要么同时执行成功,要么同时失败2、流程1、开启事务: start transaction;2、回滚:rollback;3、提交:commit;3、MySQL会自动提交 1、一条DML(增删改)语句会自动提交一次事务 2、查看提交方式 select @@autocommit;值为1是自动提交,0是手动提交 3、修改提交方式 set @@autocommit = 0; 2、四大特征1、原子性:是不可分割的最小单位,要么同时成功,要么同时失败 2、持久性:当事务提交或者回滚后,数据库会持久化的保存 3、隔离性:多个事务之间,相互独立。 4、一致性:事务操作前后,数据总量不变 3、隔离级别 1、定义:多个事务相互独立,如果多个事务操作同一批数据,设置不同的隔离级别,解决问题。 2、存在问题 1、脏读:一个事务,读取到另一个事务中没提交的数据。 2、不可重复读:在同一个事务中,两次读取的数据不一样(a事务读到了事务b已经提交的(update)数据) 3、幻读(虚读):一个事务操作(DML)数据表所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改(a事务读到了事务b已经提交的(insert)数据) 3、隔离级别 1、read uncommitted:读未提交 出现问题:脏读,重复读,幻读 2、read committed: 读已提交(oracle默认) 出现问题:重复读,幻读 3、repeatable read:可重复读(mysql默认) 出现问题:幻读 4、serializable:串行化 5、注意:隔离级别从小到大安全性越来越高,但效率越来越低 6、数据库隔离级别查询 select @@tx_isolation; 7、数据库隔离级别设置 set global trasnsaction isolation level 级别字符串; 3、DCL管理用户1、管理用户1、切换搭配mysql数据库2、查询user表2、创建用户3、删除用户4、修改用户2、授权day19set 字段名s gbk; 修改字段编码为gbk JDBC1、基本概念:java数据库连接,java操作数据库2、本质:(sun)官方定义的一套操作所有关系型数据库的规则(接口),各个数据库厂商实现这套接口,提供数据库驱动jar包。我们可以使用这套接口,但真正执行的代码是驱动jar包的实现类。3、JDBC使用
//1、导包add as libary//2、注册驱动Class.forName("com.mysql.jdbc.Driver");//3、获取数据库连接对象 ConnectionConnection conn = DriverManager.getConnection(url,user,password) //url = jdbc:mysql://ip地址(域名):端口号/数据库名称 //如果连接的是本机mysql服务器,并且默认端口为3306,则url可以简写为:jdbc:mysql:///数据库名称//4、定义sql语句 String sql = 语句;//5、获取执行sql语句的对象,StatementStatement stmt = conn.createStatement();//6、执行sql,返回结果int count = stmt.executeUpdate(sql);//7、处理结果System.out.println(count);//8、释放资源stmt.close;conn.close;
4、详解对象 1、DriverManager 驱动管理对象 1、注册驱动 2、获取数据库连接 2、Connection 数据库连接对象 3、Statement 执行sql语句对象 4、ResultSet 结果集对象 封装查询结果 next() 游标向下移动 getXxx(参数) 获取数据 Xxx->数据类型 参数-> int 列编号(从1开始) ->String 列名称 5、PreparedStatement 执行sql语句对象 1、sql注入问题:在拼接sql语句时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题。 2、预编译sql:参数使用'?'作为占位符 3、获取执行sql语句对象Connection.prepareStatement(String sql) 获取对象时传递参数,执行时就可不用传参 4、给?设置值 方法:setXxx(参数1,参数2) 参数1:?位置,从1开始 参数2:?的值 5、优点:防止sql注入,效率高5、JDBC操作事务 Connection1、开启事务:setAutoCommit(boolean autoCommut) 值为false开启事务在执行sql语句前开启事务 2、提交事务:commit()当所有sql都执行完提交事务 3、回滚事务:rollback() 在catch中回滚事务 day20 1、数据库连接池1、定义:一个存放数据库连接(Connection对象)的容器(集合)。2、优点 节约资源,用户访问高效3、实现1、标准接口:DataSource (javax.sql) 获取方法:getConnection() 归还连接:close() 如果连接对象是从连接池对象中获取,则是归还连接 4、常用连接池1、C3P0
//1、导包 (实现包、依赖包,驱动包)//2、定义配置文件 //名称:properties/c3p0-config.xml; //路径:放在src目录下//3、创建核心对象->数据库连接对象->ComboPooledDateSource//可以传参指定配置信息,不传参数是默认配置DataSource ds = new ComboPooledDateSource();//4、获取连接 getConnection()ds.getConnection();
2、Druid1、格式
//1、导包//2、定义配置文件 //是properties形式 //可以是任意名称,可以放在任意目录下。即不会自动加载。//3、加载配置文件Properties pro = new Properties();InputStream is = ...;pro.load(is);//4、获取数据库连接池对象:通过工厂类来获取 DruidDataSourceFactory.createDataSource(pro);//5、获取连接对象getConnection();
2、定义工具类
//1、定义一个类 JDBCUtils//2、定义成员变量 DataSource//3、静态代码块初始化 //加载配置文件 //获取DataSource//4、定义获取连接方法//5、归还连接方法//6、获取连接池方法
2、Spring JDBC: JdbcTemplate 1、定义:Spring框架对JDBC的简单封装,提供了JdbcTemplate对象 2、格式
//1、导包//2、创建对象 JDBCTemplate。依赖于数据源DataSource//数据源=数据库连接池//3、调用方法,完成CRUD操作(增删改查) //update():执行增删改 //查询 //queryForMap(): 封装为map集合。查询的结果集只能是1,即只能查询一条记录,字段名为键。 //queryForList():封装为list集合。可以查询所有记录,将每一条记录封装为map集合,在封装到list集合 //query():封装为JavaBean对象。参数传入sql语句,RowMapper<>接口,?的值 //需要定义一个描述类 //常用new BeanPropertyRowNapper<类名>(类名.class) //把变量定义成引用类型 //把数据存入描述类对象,再封装为list集合 //queryForObject():封装为对象,一般是基本数据类型.class //参数:sql语句,返回值类型 //一般用于聚合函数
3、给某一个类里的方法进行功能的改变或者增强 1、继承 重写方法 2、装饰设计模式 包装,如字符缓冲流 1、装饰类和被装饰类实现相同接口 2、在类中定义一个被装饰类的成员变量 3、定义一个有参构造,参数传递的是被装饰类的对象 4、如果想替换原有方法,则重写这个方法;不想替换的,就直接调用被装饰类的方法 3、动态代理设计模式4、Junit单元测试,可以让方法独立执行
//处理小灯泡,把注解加载到工作空间@Testpublic void test(){}
|