java module 模块 project最大 然后是module 可以在module的src创建包和类
一个表只能有一个auto_increment,且该列必须是primary key或者unique key。 必须与int同用 又名pk
主键必须不为空,不重复,复合主键,两个都相同才报错!
uuid与自增的区别
unipue 唯一,不能有重复的 eg: age int unique;表中的加入的内容不能重复,唯一约束
show variables like '%char%'; mysql查询使用的默认字符集
substring 截取字符串长度;
select version();
denfender 防火墙;
“不一定的,MySQL 每张表只能有1个自动增长字段,这个自动增长字段即可作为主键,也可以用作非主键使用,但是请注意将自动增
长字段当做非主键使用时必须必须为其添加唯一索引,否则系统将会报错。”
json格式
数组[]
对象{}
[{},{},{},{""},{""}]
sql jdbc bat
select version;查询版本;
给字段名起别名 用as as也可以省略
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
select*frome emp order by age asc(升序)desc(降序)
多字段排序查询
select*frome 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;
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
内连接:
查询的是两张表之间交集的部分;
语法:隐式内连接:select 字段名 from 表1,表2 where 条件;
语法:显式内连接:select 字段名 from 表1【inner】join 表2 on 连接条件。。;
隐式eg:查询每一个员工的姓名以及关联的部门名称
表结构:emp dept
连接条件:epm.deptz-id=dept.id
select emp.name,empt.name from emp,empt where 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
外连接包含了所又数据,内连接在数据为空的时候无法匹配数据
外连接:
左外连接:
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 * from emp where
显式内连接: