DOS命令中mysql操作格式:
1.链接mysql:
mysql -u root -p root
2.链接成功以后
查看数据库有几个:
show databases;
3.选择要使用哪个数据库:
use test
;
4.查看数据库里有几个表:
show tables
;
5.创建表:
mysql>create table if not exists student
(
->id
int primary key auto_increment comment '注释',
->name
varchar(50),
->sex
char(1));
6.查看表:
desc student
;
7.设置中文乱码问题
1)查看编码
show variables like 'char%';
2)更改编码
set character_set_results=gbk; #结果显示乱码问题
set character_set_client=gbk; #数据写入报错
8.插入多个数据:
insert into student
(name
,sex
) values
('张三','男'),
('李四','女');
9.删除一条数据
delete from student
where name = '张三';
10.更改数据
update student
set name
='张三' where name
='李四'; #把李四改成张三
11.删除表
drop table student
;
12.新增一列
语法:alter table 表格名 add 列名 列类型。
数据类型 -alter table table_name add col_name char(5)。
如果想在一个已经建好的表中添加一列,可以使用诸如:
alter table TABLE_NAME add column NEW_COLUMN_NAME varchar(255) not null;
这条语句会向已有的表中加入新的一列,这一列在表的最后一列位置。如果我们希望添加在指定的一列,可以用:
alter table TABLE_NAME add column NEW_COLUMN_NAME varchar(255) not null after COLUMN_NAME;
注意,上面这个命令的意思是说添加新列到某一列后面。如果想添加到第一列的话,可以用:
alter table TABLE_NAME add column NEW_COLUMN_NAME varchar(255) not null first;
13.添加外键
mysql> ALTER TABLE 从表名 //student
-> ADD CONSTRAINT (main_id_con)//外键 student里的tid
-> FOREIGN KEY (main_id)//从表外键字段(tid)
-> REFERENCES 主表(id); //teacher
-> //
- 多表查询
select
distinct t1.AGENT_ZONE as agentzone, //distinct : 去重
count(distinct t1.G_CORP_NAME) as unitcount,
count(distinct t1.BATCHNO) as batchno,
count(case t1.GBA_BANK_F when '2' then 1 end) as bpnums,
//case when:当t1.GAB_BANK_F为2的时候等于1
count(case t1.GAB_BANK_F when '2' then 1 end) as bcount,
//case when:当t1.GAB_BANK_F为2的时候等于G_AMOUNT 的值
sum(case t1.GAB_BANK_F when '2' then t1.G_AMOUNT end) as bamount,
count(case t1.GBA_BANK_F when '1' then 1 end) as tpnums,
count(case t1.GAB_BANK_F when '1' then 1 end) as tcount,
sum(case t1.GAB_BANK_F when '1' then t1.G_AMOUNT end) as tamount
from GJT_WAGES_DETAIL t1
//left join...on :连接查询,即使右表中没有匹配,也从左表返回所有的行
left join GJT_WAGES_SUMMARY t2
on t1.BATCHNO = t2.BATCHNO
where 1=1
and WORKDATE between '2020-04-11' and '2021-09-12'
group by t1.AGENT_ZONE // 以t1.AGENT_ZONE分组 ,分组后如果还要使用where条件,就用having代替where
修改某一列的字段属性
alter table user modify column sex varchar(50);创建一个新表和某一旧表一样
create table 新表名 like 旧表名;
17.修改某一列的列名
alter table 表名 change 旧列名 新列名 新列名类型;
删除某一列
alter table 表名 drop 列名;修改表名
rename table 旧表名 to 新表名;蠕虫复制
insert into 新表 select * from 旧表;
如果只想复制某几个字段:
insert into 新表(name,sex) select (name,sex) from 旧表;单个升序、降序查询
select * from 表名 where 查询条件 order by 根据什么字段 【ASC/DESC】;(ASC:升序。DESC:降序)多个字段升序、降序查询
select * from 表名 where 查询条件 order by 字段1 【ASC/DESC】,字段2 【ASC/DESC】;(ASC:升序。DESC:降序)
想要将null值的数据往前排就:
select * from 表名 where 查询条件 order by 字段 【ASC/DESC】nulls first;
想要将null值的数据往后排就:(默认)
select * from 表名 where 查询条件 order by 字段 【ASC/DESC】nulls last;分页
limit 跳过几条,当前页显示几条;
例如:
limit 0,5; 跳过0条,当前页显示5条,相当于第一页,查找了5条
limit 5,5; 跳过5条,当前页显示5条,相当于第二页,查找了5条
limit 2,5; 跳过第1,2条,查找出第3,4,5,6,7五条数据连接查询
- left join:表1左连接表2,以左为主,表示以表1为主,关联上表2的数据,查出来的结果显示左边的所有数据,然后右边显示的是和左边有交集部分的数据。
- right join:右连接查询,同理。
- inner join:内连接,表示以两个表的交集为主,查出来是两个表有交集的部分,其余没有关联就不额外显示出。
具体使用方法请点击
25、将数据库中的两个字段拼接
select `id`, concat(concat(`police_no`, "--"), `name`) as `name`,`depart_id`
from gap_person
26、视图
(1)创建视图
create or replace view stu_view as select id,name from student where id <= 10
(2)修改视图
create or replace view stu_view as select id,name from student where id <= 10
或者
alter view stu_view as select id,name from student where id <= 10
(3)删除视图
drop view if exists view_stu
(4)视图检查
说明:如果在创建视图的时候加上 with cascaded(或者是local) check option,那么对视图进行增、删、改操作的时候,必须满足where条件才能成功,不然就失败。
- cascaded
例如:
// 例子一
create or replace view stu_view as select id,name from student where id <= 10 with cascaded check option
成功的是:insert into stu_view values(1,'zxc')
失败的是:insert into stu_view values(15,'zxc')
// 例子二 当视图二根据视图一所创建的,我们再进行增、删、改操作时,视图一也会默认加上 with cascaded check option来进行视图检查。
create or replace view stu_view_1 as select id,name from student where id <= 20
create or replace view stu_view_2 as select id,name from stu_view_1 where id > 10 with cascaded check option
成功的是:insert into stu_view_2 values(25,'zxc') // 在视图二中,25大于10可以插入,但是在视图一中,25不小于等于20,所以插入失败。
失败的是:insert into stu_view_2 values(15,'zxc') // 在视图二中,15大于10可以插入,在视图一中,15小于20,所以插入成功。
- local
// 例子一
create or replace view stu_view as select id,name from student where id <= 10 with local check option
成功的是:insert into stu_view values(1,'zxc')
失败的是:insert into stu_view values(15,'zxc')
// 例子二 当视图二根据视图一所创建的,我们再进行增、删、改操作时,视图一按它自己所规定的来进行。
create or replace view stu_view_1 as select id,name from student where id <= 20
create or replace view stu_view_2 as select id,name from stu_view_1 where id > 10 with cascaded check option
成功的是:insert into stu_view_2 values(25,'zxc') // 在视图二中,25大于10可以插入,在视图一中,视图一没有设置视图检查,所以插入成功。
失败的是:insert into stu_view_2 values(8,'zxc') // 在视图二中,8不大于10,所以插入失败。
(5)视图的更新
要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。如果视图包含以下任何一项,则该视图不可更新:
- 聚合函数或窗口函数(sum、min、max、count等);
- distinct;
- group by;
- having;
- union 或 unionall
27、存储过程
说明:
存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,可以接收参数,也可以返回数据。(也就是数据库SQL语言层面的代码封装与重用)
(1)创建
create procedure 存储过程名称([参数列表])
begin
-- SQL 语句
end;
// 例子:
create procedure p1()
begin
select count(*) from student;
end;
注意
在命令行中,执行创建存储过程的SQL时,需要通过关键字delimiter指定SQL语句的结束符。
例子:
先在命令行执行:delimiter 符号为结束符)
然后再执行创建语句:
create procedure p1()
begin
select count(*) from student;
end$$
(2)调用
call 名称([参数]);
// 例子
call p1();
(3)查看
// 查询指定数据库的存储过程及状态信息
select * from information_schema.routines where routine_schema = 'xxx';
// 查询某个存储过程的定义
show create procedure 存储过程名称;
(4)删除
drop procedure [if exists] 存储过程名称;
(5)变量
- 系统变量
- 查看系统变量
// 查看所有系统变量,下面 [] 的意思是二选一
show [session | global] variables;
// 可以通过 like 模糊匹配方式查找变量
show [session | global] variables like 'xxx变量名';
// 查看指定变量的值,两个@表示系统变量
select @@[session | global] 系统变量名;
- 设置系统变量
// 第一种方式
set [session | global] 系统变量名 = 值;
// 第二种方式
set @@[session | global] 系统变量名 = 值;
- 用户自定义变量
说明:
不用提前声明,在用的时候直接用“@变量名” 使用就可以了。(两个@是系统变量,一个@是用户自定义变量)
- 赋值
// 使用set赋值
// 第一种方式
set @var_name = expr [,@var_name = expr]...;
// 第二种方式
set @var_name := expr [,@var_name := expr]...;
// 使用select赋值
// 第一种方式
select @var_name := expr [,@var_name := expr]...;
// 第二种方式
select 字段名 into @var_name from 表名;
- 使用
select @var_name;
- 局部变量
说明:
是根据需要定义在局部生效的变量,访问之前,需要 declare 声明。可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的 begin...end 块。
- 声明
// 变量类型就是数据库字段类型
declare 变量名 变量类型;
- 赋值
set 变量名 = 值;
set 变量名 := 值;
select 字段名 into 变量名 from 表名...;
(6)if语法
if 条件 then
......
elseif 条件2 then -- 可选
......
else -- 可选
......
end if;
例子:
// 根据定义的分数score变量,判定当前分数对应的分数等级
// score >= 85分,等级为优秀
// score >= 60分且 score < 85分为及格
// score < 60分为不及格
// 无参
create procedure p1()
begin
declare score int default 58;
declare result varcher(10);
if score >= 85 then
set result := '优秀';
elseif score >= 60 then
set result := '及格';
else
set result := '不及格';
end if;
select result; // 将结果查询出来
end;
// 有参(是需要将结果返回)
// 下面参数说明:in表示入参,out表示返回结果的参数
create procedure p2(in score int,out result varchar(10))
begin
if score >= 85 then
set result := '优秀';
elseif score >= 60 then
set result := '及格';
else
set result := '不及格';
end if;
end;
// 调用,@result表示 用用户自定义变量接收p2的返回值
call p2(68,@result);
(7)case语法
// 语法格式
// 语法一,如果search_condition1成立,则执行statement_list1
case
when search_condition1 then statement_list1
[when search_condition2 then statement_list2]...
[else statement_list]
end case;
// 语法二,说明:case_value是表达式,如果表达式的结果为 search_condition1,就执行 search_condition1后的 then
case case_value
when search_condition1 then statement_list1
[when search_condition2 then statement_list2]...
[else statement_list]
end case;
// 使用例子
// 根据传入的月份,判定月份所属的季节
// 1-3月份,为第一季度
// 4-6月份,为第二季度
// 7-9月份,为第三季度
// 10-12月份,为第四季度
create procedure p1(in month int)
begin
declare result varchar(10);
case
when month >= 1 and month <= 3 then
set result := "第一季度";
when month >= 4 and month <= 6 then
set result := "第二季度";
when month >= 7 and month <= 9 then
set result := "第三季度";
when month >= 10 and month <= 12 then
set result := "第四季度";
else
set result := "非法参数";
end case;
select concat('您输入的月份为:',month,',所有的季度为:',result); // 查询展示,相当于println输出
end;
// 调用
call p1(4);
(8)while语法
说明:
满足条件后再执行循环体中的SQL语句。
// 语法,先判定条件,如果条件为true,则执行逻辑,否则不执行
while 条件 do
SQL逻辑...
end while;
// 例子:计算从1累加到n的值,n为传入的参数值。
create procedure p(in n int)
begin
declare total int default 0;
while n > 0 do
set total := total + n;
set n := n - 1;
end while;
select total;
end;
// 调用
call p(10);
(9)repeat语法
说明:
当满足条件的时候退出循环。
// 语法,先执行一次逻辑,然后判断逻辑是否满足,如果满足就退出;如果不满足就继续循环
repeat
SQL逻辑...
until 条件
end repeat;
// 例子:计算从1累加到n的值,n为传入的参数值。
create procedure p(in n int)
begin
declare total int default 0;
repeat
set total := total + n;
set n := n - 1;
until n <= 0
end repeat;
select total;
end;
// 调用
call p(10);
(10)loop语法
说明:
简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用来实现简单的死循环。loop配合下面两个语句使用:
- leave:配合循环使用,退出循环
- iterate:必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一个循环
// 语法
[begin_label]:loop
SQL逻辑...
end loop [end_label];
// 退出两个语句的使用
leavel label; //退出指定标记的循环体,label为上面begin_label
iterate label; // 直接进入下一次循环
// 例子:计算从1累加到n的值,n为传入的参数值。
create procedure p(in n int)
begin
declare total int default 0;
sum:loop
if n <= 0 then
leave sum;
end if;
set total := total + n;
set n := n - 1;
end loop sum;
select total;
end;
// 调用
call p(10);
(11)游标cursor
说明:
用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环处理。游标的使用包括游标的声明、open、fetch和close。
- 声明游标
declare 游标名称 cursor for 查询语句; - 打开游标
open 游标名称; - 获取游标记录
fetch 游标名称 into 变量[,变量]; - 关闭游标
close 游标名称;
例如:
// 根据传入的参数 uage,来查询用户表 tb_user 中
// 所有的用户年龄小于等于 uage 的用户姓名和专业
// 并将用户的姓名和专业插入到所创建的一张新表中
create procedure p(in uage int) // 创建存储过程
begin
// 注意:游标的声明必须在普通的声明之后
// 声明两个变量uname、upro
declare uname varchar(100);
declare upro varchar(100);
// 声明一个游标,并把查询结果集赋值给这个游标
declare u_cursor cursor for select name,profession from tb_user where age <= uage;
// 声明一个条件处理程序,如果满足状态02000就关闭游标
declare exit handler for SQLSTATE '02000' close u_cursor
// 如果表 tb_user_pro 存在就删除
drop table if exists tb_user_pro;
// 如果表 tb_user_pro 不存在就创建
create table if not exists tb_user_pro(
id int primary key auto_increment,
name varchar(100),
profession varchar(100)
);
// 开启游标
open u_cursor;
// 循环遍历游标,将游标中的name和profession的值分别赋值给上面声明的uname和upro
// 将uanme和upro插入新创建的表 tb_user_pro 中
while true do
fetch u_cursor into uname,upro;
insert into tb_user_pro values(null,uname,upro);
end while;
// 关闭游标
close u_cursor;
end;
// 调用
call p(40);
(12)条件处理程序handler
说明:
用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤。
// 语法
// handler_action说明:continue:继续执行当前程序 exit:终止执行当前程序
// condition_value说明:SQLSTATE sqlstate_value:状态码
declare handler_action handler for condition_value[,condition_value]... statement;
// 例子在11例子中
28、触发器
- 说明
可以在insert、update和delete之前或者之后,触发并执行触发器中定义的SQL语句的集合。
使用两个 old 和 new 来引用触发器中发生的变化内容。
(1)insert型触发器(只有new)
new表示将要或者已经新增的数据。
(2)update型触发器(有 old 也有 new )
old表示修改之前的数据,new表示将要或已经修改后的数据
(3)delete型触发器(只有old)
old表示将要或者已经删除的数据 - 语法
(1)创建
// trigger_name:触发器名称
create trigger trigger_name
// 选择是之前还是之后,是插入、更新还是删除
before/after insert/update/delete
// table_name:表名。for each row:行级触发器(mysql中只支持行级)
on table_name for each row
begin
trigger_content; // 触发器的逻辑
end;
(2)查看
show triggers;
(3)删除
drop trigger [schema_name.]trigger_name;(如果没有指定 schema_name,默认为当前数据库)
- 例子
想要在插入用户表之后,把信息也插入到 tb_user 表中。
create trigger tb_user_insert_trigger
after insert on tb_user for each row
begin
// 说明:new.id:插入到用户表的id;new.name:插入到用户表的姓名
insert into user_logs(id,operation,operate_time,operate_id,operate_name) values(null,'insert',now(),new.id,new.name);
end;
一、在DAO层模拟创建数据库的方法
- 在dao曾创建一个dao类,例如DepartmentDao类
public class DepartmentDao {
}
2.使用HashMap创建数据库
public class DepartmentDao {
//模拟数据库中的数据
private static Map departmentMap = null;
static {
//创建一个部门表
departmentMap = new HashMap();
departmentMap.put(101,new Department(101,"学交部"));
departmentMap.put(102,new Department(102,"编辑部"));
departmentMap.put(103,new Department(103,"后勤部"));
}
}
- 创建一个员工表
@Repository
public class EmployeeDao {
//模拟创建数据库
private static Map employeeMap = null;
@Autowired
private DepartmentDao departmentDao;
static {
//创建一个员工表
employeeMap = new HashMap();
employeeMap.put(1,new Employee(1,"AA","[email protected]",0,new Department(101,"学交部"),new Date()));
employeeMap.put(2,new Employee(2,"BB","[email protected]",1,new Department(101,"编辑部"),new Date()));
employeeMap.put(3,new Employee(3,"CC","[email protected]",0,new Department(101,"学交部"),new Date()));
employeeMap.put(4,new Employee(4,"DD","[email protected]",1,new Department(101,"后勤部"),new Date()));
}
//主键自增
private static Integer initId = 5;
//增加一个员工
public void add(Employee employee){
if (employee.getEmployeeId() == null){
employee.setEmployeeId(initId ++);
}
employee.setDepartment(departmentDao.getDepartemntById(employee.getDepartment().getDepartmentId()));
employeeMap.put(employee.getEmployeeId(),employee);
}
//删除一个员工
public void deleteEmployee(Integer id){
employeeMap.remove(id);
}
//查找所有员工
public Collection findAllEmployee(){
return employeeMap.values();
}
//查找一个员工
public Employee findEmployeeById(Integer id){
return employeeMap.get(id);
}
}
二、navicat premium连接oracle数据库
jdbc:oracle:thin:@111.205.100.117:1521:dhcctest
1.连接名:可以随便取
2.主机:对应 111.205.100.117
3.端口:对应 1521
4.服务名:对应 dhcctest (SID)
三、Postgresql在linux(虚拟环境中)中安装教程
1、官网下载地址:https://www.postgresql.org/download/
注意:Postgresql15的版本,navicat连接不了,会报错误,原因自查。
2、安装教程官网会给出
# 下载安装rpm仓库(sudo表示使用root用户权限来进行操作)
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 安装
sudo yum install -y postgresql14-server
# 初始化数据库
sudo /usr/pgsql-15/bin/postgresql-14-setup initdb
# 允许自启
sudo systemctl enable postgresql-14
# 启动服务
sudo systemctl start postgresql-14
3、初始化(初始化后会创建一个用户postgres,我们需要重新给它设置密码)
注意:这里的postgres用户就是linux中的用户,属于PostgreSQL Server的用户组。
#删除密码
sudo passwd -d postgres
#设置密码
sudo passwd postgres
#切换成postgres用户(如果报权限不够就使用:su -postgres)
su postgres
#进入postgresql client
psql
#或者使用这个命令直接从别的用户进入postgresql client
sudo -u postgres psql
#修改数据库中postgres用户密码
ALTER USER postgres WITH PASSWORD 'root';
#退出
\q
4、因为我们想通过本地的navicat来进行连接,所以需要关闭防火墙或者打开5432端口
注意:下面的命令可能会让你输入root密码来进行验证,如果不想可以在命令前面加上 sudo,如果出现“postgres 不在 sudoers 文件中。此事将被报告。”,可点击此处来解决。
(1)查看防火墙状态
firewall-cmd --state
(2)停止firewall
systemctl stop firewalld.service
(3)禁止firewall开机启动
systemctl disable firewalld.service
或者
(1)开放指定端口
firewall-cmd --zone=public --add-port=5432/tcp --permanent
(2)关闭指定端口
firewall-cmd --zone=public --remove-port=5672/tcp --permanent
(3)重启防火墙
firewall-cmd --reloadl
5、修改配置文件
(1)用root用户打开配置文件或者在下面命令前加上 sudo
// 注意先看自己的版本是几,然后把下面路径中的14改为自己的版本
vim /var/lib/pgsql/14/data/postgresql.conf
在 postgresql.conf 文件中取消注释,修改listen_addresses为'*'表示监听任意地址
(2)同样修改另一个配置文件
// 注意先看自己的版本是几,然后把下面路径中的14改为自己的版本
vim /var/lib/pgsql/14/data/pg_hba.conf
在 IPv4 local connections下面新增一行:
host all all 0.0.0.0/0 scram-sha-256
(3)重启服务( 需要查看自己的版本号,查看方法请点击)
sudo systemctl restart postgresql-14
6、然后就可以用navicat等工具连接了
7、卸载Postgresql的方法,请点击这里。