数据库学习笔记

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
-> //

  1. 多表查询
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
  1. 修改某一列的字段属性
    alter table user modify column sex varchar(50);

  2. 创建一个新表和某一旧表一样
    create table 新表名 like 旧表名;

17.修改某一列的列名
alter table 表名 change 旧列名 新列名 新列名类型;

  1. 删除某一列
    alter table 表名 drop 列名;

  2. 修改表名
    rename table 旧表名 to 新表名;

  3. 蠕虫复制
    insert into 新表 select * from 旧表;
    如果只想复制某几个字段:
    insert into 新表(name,sex) select (name,sex) from 旧表;

  4. 单个升序、降序查询
    select * from 表名 where 查询条件 order by 根据什么字段 【ASC/DESC】;(ASC:升序。DESC:降序)

  5. 多个字段升序、降序查询
    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;

  6. 分页
    limit 跳过几条,当前页显示几条;
    例如:
    limit 0,5; 跳过0条,当前页显示5条,相当于第一页,查找了5条
    limit 5,5; 跳过5条,当前页显示5条,相当于第二页,查找了5条
    limit 2,5; 跳过第1,2条,查找出第3,4,5,6,7五条数据

  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)视图的更新
要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。如果视图包含以下任何一项,则该视图不可更新:

  1. 聚合函数或窗口函数(sum、min、max、count等);
  2. distinct;
  3. group by;
  4. having;
  5. 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)变量

  1. 系统变量
  • 查看系统变量
// 查看所有系统变量,下面 [] 的意思是二选一
show [session | global] variables;

// 可以通过 like 模糊匹配方式查找变量
show [session | global] variables like 'xxx变量名';

// 查看指定变量的值,两个@表示系统变量
select @@[session | global] 系统变量名;
  • 设置系统变量
// 第一种方式
set [session | global] 系统变量名 = 值;

// 第二种方式
set @@[session | global] 系统变量名 = 值;
  1. 用户自定义变量
    说明:
    不用提前声明,在用的时候直接用“@变量名” 使用就可以了。(两个@是系统变量,一个@是用户自定义变量)
  • 赋值
// 使用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;
  1. 局部变量
    说明:
    是根据需要定义在局部生效的变量,访问之前,需要 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层模拟创建数据库的方法

  1. 在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,"后勤部"));
    }
}
  1. 创建一个员工表
@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/

image.png

注意:Postgresql15的版本,navicat连接不了,会报错误,原因自查。
2、安装教程官网会给出
image.png

# 下载安装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为'*'表示监听任意地址


image.png

(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
image.png

(3)重启服务( 需要查看自己的版本号,查看方法请点击)

sudo systemctl restart postgresql-14

6、然后就可以用navicat等工具连接了
7、卸载Postgresql的方法,请点击这里。

你可能感兴趣的:(数据库学习笔记)