A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 金星君 初级黑马   /  2019-5-31 13:05  /  684 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

第二阶段_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 排序方式2​ASC 升序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、备份还原

day18

1、多表查询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、授权

day19

set 字段名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(){}









评分

参与人数 1黑马币 +5 收起 理由
落地生根 + 5 这个相关视频有没有

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马