java相关知识
1:java module 模块 project最大 然后是module , 可以建多个module ,可以在module的src创建包和类
2.一个表只能有一个auto_increment,且该列必须是primary key或者unique key。 必须与int同用 又名pk 3.主键必须不为空,不重复,是一个表的唯一标识默认unique。复合主键,两个都相同才报错! 4.uuid与自增的区别 5.unipue 唯一,不能有重复的,多个字段可以重复设置为unique eg: age int unique;表中的加入的内容不能重复,唯一约束 6.show variables(变量) like '%char%'; mysql查询使用的默认字符集 7.substring 截取字符串长度;select substring('sshfkhjd',1,2) mysql默认第一位是1 8.select version();查询mysql版本 9.denfender 防火墙;
10.“不一定的,MySQL 每张表只能有1个自动增长字段,这个自动增长字段即可作为主键,也可以用作非主键使用,但是请注意将自动增 长字段当做非主键使用时必须必须为其添加唯一索引,否则系统将会报错。” 11.json格式 数组[] 对象{} [{},{},{},{""},{""}] 12.sql 语句 jdbc程序 bat批处理文件后缀
13.给字段名起别名 用as as也可以省略
14select distinct dept from t1 去重统计!!!!!!!!!!!!!!select count(distinct dept) from t1 distinct
15dense_rank() over() 排名 over() 必须与其他的连用 16.rank()1 1 3跳跃排名 dense_rank 1 1 2
数据库内容
数据库需要学习的东西
primary key();主键约束,主键不能同名
AUTO_INCREMENT, auto_increment 自增 不给值从最大的开始增加 SQL 指结构化查询语言,全称是Structured Query Language。 SQL 让您可以访问和处理数据库,包括数据插入 在计算机科学领域,配置文件(英语:configuration file,台湾作设定档)是一种计算机文件,可以为一些计算机程序配置参数和初始设置。
想要学好mysql数据库要先学号sql语言,还需要掌握:事务,存储引擎,索引,sql优化,锁,运维内容:日志,主从复制,读写分离,分库分表; 基础:sql 函数 约束 多表查询 事务 进阶:存储引擎 索引 sql优化 视图/存储过程/触发器 锁 innodb核心 mysqL管理 运维:日志,主从复制,分库分表,读写分离
关系型数据库:RBDMS(建立在关系模型基础上,由多张相互连接的二维表组成的数据库) 客户端===>数据库管理系统==》数据库==》表 sql:结构化查询语句,是关系型数据库的标准语言 qsl通用语法、qsl分类,DDL。DML DQL DCL SQL语句不区分大小写,关键字最好大写 用空格或者缩进来增强语句可读性 可以单行可以多行 用分号结束 ; 单行注释-- 多行注释/* */ DDL数据定义语句,用来定义数据库对象(数据库 表 字段) DML数据操作语句,对数据库表中的数据进行增删改查 DQL数据查询语句,用来查询数据库中的表 DCL数据控制语言,用来创建数据库用户,控制数据库的访问权限。
SQL-
DDL数据库操作
建立数据库的相关内容
查询 查询所有数据库SHOW DATABASES; SELECT DATABASE(); 创建 CREATE DATABASE[IF NOT EXISTS]数据库名[DEFAULT CHARSET]字符集[COLLATE排序规则] 删除 DROP DATABA 查询指定数据库show create database 数据库名() ; 使用 USE 数据库
创建表的相关内容
创建表 create table 加表名 ( 字段1 字段类型[comment ‘’] 字段2 字段类型[comment ''])[comment 表注释] 表结构查询 查询本数据库所有表 show tables; 查询表结构 desc 表名 查询指定表的建表语句show create table 表名()
整数类型:
tinyint 1byte smallint 2byte meflumint 3byte int或integer 4byte bigint 8byte folat 4byte double 8byte decimal 依赖于m精度和D标度的值 unsigned 无符号的了类型;
score double(4.1)4是整体长度,1是允许出现几位小数
往表中添加字段: alter table 表名 ADD 字段名 类型(长度) alter table 表名 ADD 字段名 类型(长度)auto_increment primary key() fritst (aftrt 字段名)
删除字段名
alter table 表名 drop (coiumn )字段名;
修改数据类型
alter table 表明 modify 新的数据类型(长度);
修改一个字段名
alter table 表名 rename column 旧字段名 to 新字段名
修改一个表名
alter table 表名 rename 旧表名 to 新表名
修改字段名和字段类型和位置
alter table 表名 change 旧字段名 新字段名 类型(长度)(位置)【comment 注释】【约束】 必须要带类型
afte 字段名 (可以指定在哪个字段名之后)
。。。。first在第一列
修改表名
aftrt table 旧表名 rename 旧表名;
复制表结构
create table 被复制的表 like 复制的新表;
删除表
drop table【if exists】表明 删除指定表 并重新创建表 truncate table 表名; 可以做到删除表数据但是不删除表名; 插入表中的是记录!!
insert 插入一行的数据
insert into 和 replace 一样。唯一区别:在使用repla时有主键值时,会修改数值
DML 数据操作语言
添加数据: insert into 表名(字段名1,字段名2)values(值1,值2);给指定字段赋值 insert into 表名() values(值1,值2); insert into 表名(字段1字段2)values (值1,值2),(值1,值2),(值1,值2)... insert into 表名 values(值1,值2),(值1,值2) 删除数据行delete from qaxx where (); select * from 表名;查询当前表结构 修改数据 update 表名 set 字段名1=值1,字段名=值2....[where条件] 不带where会更新整张表的数据 可以往一张表中的列加数据;
DQL语句 数据查询语言
查询关键字 select 字段列表 from 表名列表 where 条件列表 group by 分组字段列表 having 分组后条件列表 order by 排序字段列表 limit 分页参数
基本查询
条件查询 where 聚合查询 count max min avg sum 分组查询 group by 排序查询 order by 分页查询 limit 基本查询: 1查询多个字段 select 字段1,字段2,字段3 from 表名; 2查询所有字段 select 字段1,字段2,字段3 。。。。from 表名 3select *from 表名;!!!!不建议使用 查询并起别名 select 字段名..... as 别名 from 表名 查询 select * from 表名 where age = 88; select * from 表名 where age <20; select * from 表名 where age <=20; select * from 表名 where idcard is null;为null select * from 表名 where idcard is not null;不为null select * from 表名 where age != 88;select * from 表名 where age <>88;不等于 select * from 表名 where age >=15&& age<=20; 和 select * from 表名 where age >=15and age<=20 select * from 表名 where age between 14 and 45;既包含最小值又包含最大值; select * from 表名 where gender='女'and age<15; select * from 表名 where age=15 or age=45 or age =14; select * from 表名 where age in(15,45,14); select * from 表名 where name like '--',查询名字为两个字的;一个_一个字符,%是任意字符 select * from 表名 where name like '%X',查询名字最后一个字为X的;
聚合查询:
将一列数据作为一个整体,进行000000000000000000纵向计算 常见聚合常数 count 统计数量 max 最大值 min 最小值 avg 平均值 sum 求和 select count(*) from emp;查询数量select count(id) from emp; select avg(age)from emp;查询平均数 select max(age) from emp;查询最大值; select min(age) from emp;查询最小值; select sum(age) from emp where workdress='西安',查询工作地址是西安的人的年龄总和
select 字段列表 from 表名【where条件】 group by 分组字段名【having分组后过滤条件】 where 和 having 区别 1执行时机不同 : where 是分组之前进行过滤,不满足where 条件,不参与分组;having是对分组后进行过滤 2判断条件不同:where不能对聚合函数进行判断,having可以 1根据性别分组,统计男员工数量和女性员工数量 select[gender,]count() from emp group by gender; select[gender,]avg() from emp group by gender; select workdress,count() [别名] from emp age where age <45 group by workdress having count()【或者使用别名】>=3; 执行顺序where > 聚合函数>having 分组之后,查询的字段一般是聚合函数或者分组字段,输入其他字段无任何意义;
排序查询
order by selectfrome emp order by age asc(升序)desc(降序) 多字段排序查询 selectfrome emp order by age asc,idcard desc(降序) 当年龄相同时用idcard降序排序查询
DQL分页查询
select 字段列表 from 表名 limit 起始索引 查询记录数; 注意: 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数 分页查询时数据库的方言,不同的数据库有不同的实现,mysql中的时limit 如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10.
select * from emp limit 0,10; select * from emp limit 10,10;
1查询年龄为20,21,23岁的员工信息 select * from emp where gender='女'and age in (20,21,23); 2查询性别为男,并且年龄在20--40以内的姓名为三个数的员工 select from emp where gender='男'and age between 20and40,name like '_ _ _'; 3统计员工表中,年龄小于60岁男性员工和女性员工 select count()from emp where age<60 group by gender; 4查询所有年龄小于35的员工 的姓名和年龄,并对查询结果按年龄升序排列,如果年龄相同按着入职时间降序排列 select gender, age from emp where age<35 order by age asc,entrydate desc; 5查询性别为男,并且年龄在20-40以内的前5个员工并对查询结果按年龄升序排列,如果年龄相同按着入职时间降序排列 select gender='男' from emp where age<35 order by age asc,entrydate desc;
DCL:
DCL data control language 数据 控制语言,用来管理数据库用户,控制数据库的访问权限。 查询用户: 1use mysql; select * from user; 2创建用户 create user ’用户名‘@’主机名‘ identidied by '密码'; create user ’用户名‘%‘ identidied by '密码'; 可以访问任意数据库 3修改用户密码:s alter user '用户名 '@'主机名 ' identidied with mysql_native_password by ’新密码‘; 4删除创建的用户 DROP user'用户名'主机名'; 补充!!!权限控制!! 不赋权限的话只能访问系统库不能访问其他库 查询权限: show grants for '用户名'@'主机名' 授予权限: grant 权限列表 on 数据库名.表名 to '用户名'@'主机名'; 撤销权限: revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名'; revoke all . on aa@'%';撤销所有库和表的权限
函数:
是指一段可以被另一段程序调用的程序或者代码; 分类: 字符串函数 数值函数 日期函数 流程函数
字符串函数
1.concat select concat('lcb','qsx');//字符串拼接 2.lower select lower('QSX');//把所有函数转化为小写 3.upper select upper('qsx');//把所有小写转化为大写 4lpad select lpad('qsx',5,'lcb');//在字符串左侧开始插入,一共插入5位; 5rpad select rpad('qsx',5,'lcb');//在字符串右侧开始插入,一共插入5位; 6trim 去除两边空格 select trim(' qsx lcb '); 7substring 截取字符串; select substring('qsx lcb',1,5);索引从1开始,截取5位,并且空格也算位数;//mid有相同效果 案例:把emp表中所有的workno统一为五位数,不足五位补0; updata emp set workno=lpad(workno,5,'0');
数值函数
1向上取整 ceil select ceil(1.2) //结果2 2向下取整 foor select foor(2.1) //2 3随机 rand select rand();//介于0--1的随机数; 4取模 mod select mod(5,4) //1 5 round 求参数的四舍五入保留y位小数 round(23.4545,2)保留两位小数四舍五入 round(rand()*1000000,0)
日期函数
curdate 返回当前日期 curdate(); curtime 返回当前时间 curtime(); now(); 返回当前时间和日期 year 返回指定date的年份 year(now();) month 返回指定date的月份 month(now();) day 返回指定date的日期 day(now();) date_add(now(),interval 70 day) select adddate(now(),23) 默认计算相差天数 select name,datediff(curdate(),shijan) s from qaxx order by s desc; 计算入职时间
流程函数
1.if(判断语句,’‘,’‘) select if(2<1,'对','错') 2.ifnull select ifnull('不是null的话返回','是mull的话返回本值'); 3case when then else end 令××=××。其余的=×× select name ,case gender when '男' then '牛' else '妞儿'end from qaxx; select name, case when score >=90 then '优秀'from qaxx;
case when then else end
第一种情况 :判断一个只有一组 when then,字段名可以放在case when中间 select name ,case gender when '男' then '牛' else '妞儿'end from qaxx; 第二种情况 多个case when 字段名不可以放在case when中间 写else的话后边必须跟条件或者‘ ’ select *,case when workno<900 then 'niu' when workno>1000 then 'daniu' end from qaxx;
truncate 直接删除表内容结构,auto_increment恢复默认
约束:
作用于表中字段上的规则,用于限制存储在表中的数据; 保证数据库数据的正确性,有效性和完整性; 非空约束 not null 唯一约束 enique 主键约束 primary key 默认约束 default 外键约束 foreign key !!!!用来让两张表的数据之间建立联系,保证数据的一致性和完整性 有外键约束起码要有两张表 检查约束 8.0 16以后才有的 check(age>12&&...) 多个约束之间没有先后顺序 且用空格分开
外键约束:
具有外键的表叫子表,外键关联的表叫父表; 用子表的外键约束和父表关联 添加外键: 还没建好表: create table os( ...... [constraint约束,限制] 外键名 foreign key (外键字段名)references (参考的意思)主表(主表列名) ); alter table lcb add constraint foreign key(外键字段名 ) references 主表(主表列名)’ 删除外键 alter table 表名 drop foreign key(外键名); alter table 表名 drop constraint 外键名字;
关联主表后,错误信息无法加入 增加到主表外键时,主表字段必须是微信,类似主键
外键连接时,子表列连接父表是,必须兼容,就是字段属性要一致 alter table lcb add constraint sji foreign key(name) references qaxx(id) on UPDATE cascade on DELETE cascade ; 为父子表添加外键的同时添加能同时修改和删除的功能 cascade :在对父表进行修改删除操作的同时查看是否有对应外键,如果有,对子表进行相同操作 alter table lcb add constraint sji foreign key(name) references qaxx(id) on UPDATE set null on DELETE set null ; cascade :在对父表进行修改删除操作的同时查看是否有对应外键,如果有该外键值为null(该外键必须允许取null值)
约束: 主键约束 primary key 外键约束 foreign key 默认约束 default 唯一约束 enique 非空约束 not null 检查约束 chect
多表查询:
多表关系 多表查询概述 内连接 外连接 自连接 子查询 联合查询;;;;
多表关系:
项目开发中。在进型数据库表结构设计时。会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间的关系
分析设计表结构。由于业务之间相互关联,所以各个表之间也存在着关系,基本分为三种: 一对一,一对多(多对一),多对多; 一对多:部门与员工的关系 关系:一个部门对应多个员工。多个员工对应一个部门; 实现:在多的一方建立外键;
多对多:学生与课程之间的关系 实现:建立一张中间表。中间表至少包含两个外键,分别关联两个主键;
一对一:用户与用户详情; 一对一关系多用来进行单表拆分,将一张表的基础字段放在一张表中,其他的详情字段放在另一张表中,以提升操作效率; 实现:在任意单表加入外键,关联另一方的主键,并且设置外键为唯一unique
内连接:
有null的可以用内连接,用的是重合的部分
查询的是两张表之间交集的部分; 语法:隐式内连接:select 字段名 from 表1,表2 where 条件; 语法:显式内连接:select 字段名 from 表1【inner】join 表2 on 连接条件。。; 隐式eg:查询每一个员工的姓名以及关联的部门名称 表结构:emp dept 连接条件:epm.deptz-id=dept.id
显式eg:inner join on 表结构:emp dept 连接条件:epm.deptz-id=dept.id select emp.name,empt.name from emp 【inner】 join empt on epm.deptz-id=dept.id
让有null的显示用外连接:
外连接包含了所有数据,内连接在数据为空的时候无法匹配数据
外连接:
左外连接: select 字段名 from 表1 left 【outer】 join 表2 on 条件;查询的是左表所有的数据 包含 表1和表2 交集的部分; 右外连接: select 字段名 from 表1 right 【outer】 join 表2 on 条件;查询的是表2(右表)所有的数据 包含 表1和表2 交集的部分; 左外eg: select emp.name,empt.name from emp left join empt on epm.deptz-id=dept.id 右外: select emp.name,empt.name from emp right 【outer】 join empt on epm.deptz-id=dept.id
自连接:必须起别名
select 字段名 from 表1 别名,表2 别名 where 条件; select 字段名 from 表1 别名 join 表2 别名 on 连接条件;
select 字段名 from 表1 别名,表2 别名 where epm.deptz-id=dept.id ; 自连接能用内外连接
联合查询:联合查询的多张表列数必须一致,字段类型也要保持一致 union all会将全部的数据直接合并在一起,union在合并后会去重; 多张表联合查询要用union , 单表才用or select 字段名 from 表1 union(union all)
子查询:
sql语句中嵌套select语句,称为嵌套查询,又称为子查询。 select* from t1 where column1=(select column1 from t2) 外部可以是查询也可以是增删改查 根据子查询结果的不同: 标量子查询:子查询结果为单值 列子查询:子查询结果为一列 行子查询:子查询结果为一行 表子查询:查询结果为多行多列
根据子查询出现的位置:可以分为: where之后 from之后 select之后
标量子查询:
子查询结果为单值(数字,字符串,日期 ),最简单的形式,称为标量子查询;
常用操作符:= >= <= <> < > 等 1查询销售部员工的所有信息 分为两步 a查询销售部的部门标号id b, 根据部门id查询员工信息 select * from emp where dept_id=(select id from dept where name='销售部' ) 查询在房中白入职之后的所有员工 a 查询房中白的入职日期 b查询在这个日期入职的所有员工信息 select entrydate from emp where name=‘东方白’ select* from emp where enterdate> (elect entrydate from emp where name=‘东方白’ );
列子查询 :
子查询结果为一列(可以是一行)
in 在指定的范围内多选一 not in 不在指定的集合范围内 any 子查询返回列表中,有任意一个满足即可 some 与any同,使用some的地方都可以用any all 子查询返回列表的所有值都满足
EG:查询所有比财务部工资高的员工信息: select id from emp when name ='财务部' select salary from emp where dept=( select id from emp when name ='财务部') select * from emp where salary >all( select salary from emp where dept=( select id from emp when name ='财务部'))
行子查询:
子查询结果为一行(可以是多列)
常用的操作符:= <> ,in not in 查询与张无忌的薪资以及直属领导相同的员工信息; 查询张无忌的薪资以及直属领导 select salary managerid from where name=‘张无忌’; select * from emp where(salary managerid)=(select salary managerid from where name=‘张无忌’)
表子查询 多行多列
多行多列!!! ;;
事务:
1事务简介 2事务的操作 3事务四大特性 4并发事务问题 5事务隔离级别
事务:
是一组操作的集合,是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起像系统提交或者撤销操作请求,即这种操作要么同时
成功要么同时失败 (银行提款问题)把查询余额,取款,转账作为一个事务范围内 开启事务--》出现异常的话回滚事务,把扣去的钱加上--》提交事务 默认sql的事务是自动提交的,也就是说当执行一条sql语句时,mysql会立即隐式的提交事务
事务操作:
因为sql的事务是自动提交的,
第一种方法:设置手动提交: 1查看/设置事务的提交方式 SELECT @@autocommit; set @@autocommit=0; 2提交事务; commit; 3回滚事务; rollback; (增删改查只是临时修改表事务,只有提交数据才会彻底提交,在当前窗口数据会改,但不会彻底保存,另一窗口不会改动值)
1start transaction/begin 开启事务 (开启后默认set @@autocommit=0) 22提交事务; commit; 3回滚事务; rollback;
事务的四大特性:ACID
原子性:事务是不可分割的最小操作单元,要么全成功要么失败 一致性:事务完成时,必须所有的数据保持一致状态 隔离性:数据库的隔离机制,保证事务在不受外部并操作影响的独立环境下运行。 持久性:事务一旦回滚和提交,对数据库的改变 是永久性的
多个并发事务同时运行产生的: 并发事务引发的问题: 脏读:一个事务读取另一个事务还没有提交的数据 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称为不可重复读 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了幻影
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
read uncommitted | √ | √ | √ |
read committed | Х | √ | √ |
repeatable read | Х | Х | √ |
serializable | Х | Х | Х |
serializable串行化,隔离级别越来越高。性能差
mysql 默认隔离级别
oracle默认隔离级别是:read committed
查看事务的隔离级别:
select @@transaction_isolation;
设置事务的隔离级别:
set [session当前会话|global] transaction isolation level{read uncommitted|read committed|repeatable read|serializable}