数据库-基础

目录

​编辑

基础 

数据库相关概念

MySQL下载及安装​​​​        

MySQL启动与停止

MySQL客户端连接

MySQL数据模型

关系型数据库(RDBMS)

SQL

SQL通用语法

SQL分类​编辑

DDL-数据库操作​编辑

DDL-表操作 

DDL-表操作-查询

DDL-表操作-创建

DDL-表操作-数据类型

DDL-表操作-修改​编辑

DDL-表操作-删除

小结​编辑

MySQL图形化界面

DML

DML-介绍

DML-添加数据

DML-修改数据

DML-删除数据

小结

DQL

DQL-基本查询

DQL-条件查询

DQL-聚合函数

DQL-分组查询

DQL-排序查询

DQL-分页查询

DQL语句编写顺序和执行顺序

总结

DCL

DCL-介绍

DCL-管理用户

DCL-权限控制

小结

函数

函数-介绍

字符串函数

数值函数

日期函数

流程控制函数

小结

约束

介绍

外键约束

 外键删除更新行为

 小结

多表查询

多表关系

多表查询概述

多表查询分类

连接查询

内连接:

外连接:

自连接:

联合查询-union,union all

子查询

标量子查询

列子查询

行子查询

 表子查询

多表查询案例:

小结:

事务

事务简介

事务操作

事务四大特性(ACID)

并发事务问题

事务隔离级别

 基础篇总结


锲而舍之,朽木不折;坚持不懈,金石可镂。 

基础 

数据库相关概念

1.数据库:存储数据的仓库,数据是有组织的进行存储。DataBase(DB)。

2.数据库管理系统:操纵和管理数据库的大型软件。DataBase Managment System(DBSM)

3.SQL:操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。Structured QueryLanhuage(SQL)。

MySQL下载及安装
​​​​        

        MySQL社区版

MySQL启动与停止

方式一:

在windows命令行输入services.msc进入Windows的系统中找到MySQL80,右键点击后选启动或停止。

方式二:

进入cmd,以管理员身份运行,输入net start mysql80启动,输入net stop mysql80停止。

MySQL客户端连接

方式一:MySQL自带的客户端命令行

开始菜单找到mysql,选择mysql客户端--,后输入密码,就连接上了mysql。

方式二:系统自带的命令行工具执行指令

mysql [-h 127.0.0.1 ]  [-P  3306]  -u  root -p

-h指定连接的哪个ip,-P指定连接端口,这两个参数可以省略,默认本地3306.

-u指定root用root用户进行连接,-p输入密码

打开cmd进入后输入mysql -u root -p,后输入密码,就连接上了mysql。

注意:使用这种方式,需要配置PATH环境变量。

MySQL数据模型

DBMS是一个 软件,用来创建、操作数据库。一个数据库中可以包含多张表结构。表才是最终存储数据的。

关系型数据库(RDBMS)

概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。

特点:

1.使用表存储数据,格式统一,便于维护

2.使用SQL语言操作,标准统一,使用方便

通过表来存储数据的数据库就是关系型数据库,不通过表来存储数据的数据库就是非关系型数据库

SQL

  • SQL通用语法
    • 1. SQL语句可以单行或多行书写,以分号结尾

    • 2. SQL语句可以使用空格/缩进来增强语句的可读性。
    •  3,MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
    • 4,注释:
      • 单行注释:--注释内容或#注释内容 (MySQL特有)
      • 多行注释:/*注释内容*/
  • SQL分类
    • DDL-数据库操作

可以按键盘上的上下键来查询之前执行过的语句 

DDL-表操作 
  • DDL-表操作-查询

                     要先进入表中

  • DDL-表操作-创建

                要先想现在在哪个表中

 

  • DDL-表操作-数据类型

                MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型。

  • DDL-表操作-修改

 

 

  • DDL-表操作-删除

                在删除表时,表中的数据也会被删除 

小结
  • MySQL图形化界面

  • DML
    • DML-介绍
      • DML英文全称是 Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增删改操作
    • DML-添加数据
    • DML-修改数据
    • DML-删除数据
    • 小结
  • DQL
    • DQL-介绍
      • DQL英文全称是 Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录。
      • 查询关键字:SELECT
      • DQL-语法
    • DQL-基本查询

                                        

as可以省略 

去除重复 

  • DQL-条件查询
  • DQL-聚合函数
    • 介绍
      • 将一列数据作为一个整体,进行纵向计算。
    • 常见的聚合函数
    • 语法
  • DQL-分组查询
    • 语法
    • where与having区别
      • 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
      • 判断条件不同:where不能对聚合函数进行判读,而having可以。
    • 注意
      • 执行顺序:where>聚合函数>having
      • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
  • DQL-排序查询
    • 语法
    • 排序方式
      • asc :升序(默认)
      • desc::降序
    • 注意:
      • 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
  • DQL-分页查询
    • 语法
    • 注意:
      • 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数。
      • 分页查询是数据库的方言,不同的数据库有不同的事项,MySQL中是LIMIT
      • 如果查询的时第一页数据,起始索引可以省略,直接简写为 limit10.

  • DQL语句编写顺序和执行顺序
    • 编写顺序
  • 执行顺序
  • 总结

  • DCL
    • DCL-介绍
      • DCL英文全称是(Data Control Language)(数据控制语言),用来管理数据库用户。控制数据库的访问权限
    • DCL-管理用户
      • 查询用户可以直接查询user表
      • localhost 代表当前主机可以访问,%代表任意主机可以访问
      • 注意:
        • 主机名可以使用%统配
        • 这类SQL开发人员操作的比较少,主要是DBA(Database  Administratorv数据库管理员)操作。
    • DCL-权限控制
      • MySQLz中定义了很多种权限,但是常用的就以下几种
      • 注意:
        • 多个权限之间,使用逗号分隔
        • 授权时,数据库名和表名可以使用*进行通配
    • 小结

  • 函数

    • 函数-介绍
      • 函数是指一段可以直接被另一段程序调用的程序或代码
    • 字符串函数
      • MySQL中内置了很多字符串函数,常用的几个如下:
    • 数值函数
      • 常见的数值函数如下:
    • 日期函数
      • 常见的日期函数如下:
        • datediff 是用第一个时间减去第二个时间
  • 流程控制函数
    •       流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率。

    •                                   

         

  • 小结
  • 约束

    • 介绍
      • 概述:约束是作用于表中资源上的规则,用于闲置存储在表中的数据。
      • 目的:保证数据库中数据的正确。有效性和完整性。
      • 分类:

  • 外键约束
    • 概念:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。
    • eg:
    • 语法:
  •  外键删除更新行为
    • 前两个为默认行为

eg:cascade

  •  小结

多表查询

  • 多表关系
  • 概述:项目开发中,在进行数据库表结构设计时,会根据业务需求即业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:
    • 一对多(多对一)
    • 多对多
    • 一对一
  • 多表查询概述
    • 概述:指从多张表中查询数据
    • 笛卡尔积:在数学中,两个集合A集合和B集合的所有组合情况(在多表查询中,需要消除无效的笛卡尔积)
  • 多表查询分类
    • 连接查询
      • 内连接:
        • 相当于查询A、B交集部分数据

        • -- 内连接演示...注:如果连接外键de指为null,则查询不出来
          -- 1.查询每个员工的姓名,及关联的部门的名称(隐式内连接实现)
          select emp.name , dept.name from dept,emp where emp.dept_id=dept.id;
          -- 如果表名长的话,可以起别名,起别名后,不能再使用表名
          select e.name , d.name from dept d,emp e where e.dept_id=d.id;
          
          -- 显示内连接
          -- 2.查询每个员工的姓名,及关联的部门的名称
          select e.name , d.name from emp e inner join dept d on e.dept_id = d.id;
          select e.name , d.name from emp e join dept d on e.dept_id = d.id;
          
      • 外连接:
        • 左外连接:查询左表所有数据,以及两张表交集部分数据
        • 右外连接:查询右表所有数据,以及两张表交集部分数据
        • -- 外连接演示。。注:如果连接外键的指为null,可以查询出来
          -- 1.查询emp表的所有数据,和对应的部门信息(左外连接)
          select e.* , d.name from emp e left outer join dept d on e.dept_id=d.id;
          
          select e.* , d.name from emp e left join dept d on e.dept_id=d.id;
          
          -- 2.查询dept表的所有数据,和对应的员工信息(右外连接)
          select d.name ,e.* from dept d right join emp e on d.id = e.dept_id;
          
          select d.name ,e.* from dept d join emp e on d.id = e.dept_id;

      • 自连接:
        • 当前表与自身的连接查询,自连接必须使用表别名

        • -- 自连接
          -- 1.查询员工及其领导
          select a.name,boss.name from emp a,emp boss where a.managerid=boss.id;
          
          -- 2.查询所有员工emp及其领导的名字emp,如果员工没有领导,也需要查询出来
          select  a.name,boss.name from  emp a left join emp boss on a.managerid=boss.id;
    • 联合查询-union,union all
      • 对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。
    • 子查询
      • 概念:SQL语句中嵌套SELECT语句,称为嵌套查询,又称为子查询。
      • 子查询外部的语句可以是INSERT/UPDATE/DELETE/SELECT的任何一个。
      • 根据子查询的结果不同,分为:
        • 标量子查询(子查询结果为单个值)
        • 列子查询(子查询结果为一列)
        • 行子查询(子查询结果为一行)
        • 表子查询(子查询结果为多行多列)
      • 根据子查询位置,分为LWHERE之后、FROM之后、SELECT之后。

标量子查询

子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。

常用的操作符:= <> >   >= < <=

-- 标量子查询
-- 1.查询“ 研发部”的所有员工信息
-- a.查询“研发部”部门ID
select id from dept where name='研发部';
-- b.根据研发部门ID,查询员工信息
select * from emp where dept_id=1;
-- 合并后:
select * from emp where dept_id=(select id from dept where name='研发部');


-- 2.查询在“杨逍”入职之后的员工信息
-- a.查询“杨逍”入职年龄
select age from emp where name='杨逍';

-- b.查询年龄比杨逍小的员工信息
select * from emp where age<33;
-- 合并后:
select * from emp where age<(select age from emp where name='杨逍');
列子查询

子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。

常用的操作符:IN 、NOT IN  、ANY 、SOME 、ALL

-- 列子查询
-- 1.查询”销售部“和”研发部“的所有员工信息
-- a.查询"销售部"和“研发部”的部门ID
select id from dept where name='销售部' || name='研发部';
-- b.查询id=4,1的员工的信息
select * from emp where dept_id=1 ||emp.dept_id=4;
-- 总和
select * from emp where dept_id in(select id from dept where name='销售部' || name='研发部');

-- 2.查询比研发部所有年龄大的员工的信息
-- a.查询研发部员工的年龄
select age from emp where dept_id=(select id from dept where name='研发部');
-- b.查询比研发部年龄大的员工信息
select * from emp where  age> all(select age from emp where dept_id=(select id from dept where name='研发部'));

-- 3.查询比研发部其中一人年龄大的员工信息
-- a.查询研发部年龄
select age from emp where dept_id=(select id from dept where name='研发部');
select * from emp where age>any(select age from emp where dept_id=(select id from dept where name='研发部'));
行子查询

子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。

常用的操作符:=、<>、IN、NOT IN

-- 行子查询
-- 1.查询年龄与“张无忌”相同且直属领导也相同的员工信息
-- a.查询“张无忌”的年龄及直属领导
select age,managerid from emp where name='张无忌';
-- b.查询信息
select * from emp where (age,managerid)=(20,1);
-- 总和
select * from emp where (age,managerid)=(select age,managerid from emp where name='张无忌');
 表子查询

子查询返回的结果是多行多列,这种子查询称为表子查询

常用操作符:IN

-- 表子查询
-- 1.查询与“张无忌”或“常遇春”的年龄和职位相同的员工信息
-- a.查询职位和年龄
select job,age from emp where name='张无忌'or name='常遇春';
-- b.查询相同的
select * from emp where (job,age)in(select job,age from emp where name='张无忌'or name='常遇春');
-- 2.查询入职年龄22之后的员工信息,及部门信息
select * from emp where age>22;
select e.*,d.* from (select * from emp where age>22) e left join dept d on e.dept_id=d.id;
多表查询案例:
-- ----------------多表查询案例
create table salgrade(
    grade int,
    losal int ,
    hisal int
)comment '薪资等级表';
insert into salgrade values (1,0,3000),(2,3001,5000) ,
                           (3,5001,8000),(4,8001,10000),(5,10001,15000),
                           (6,15001,20000),(7,20001,25000),(8,25001,30000);


create  table dept(
    id int auto_increment primary key  comment 'ID',
    name varchar(50) not null comment '部门名称'
)comment '部门表';
insert into dept (id, name) values (1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总裁办');


create table emp(
    id int primary key auto_increment comment 'id',
    name varchar(50) not null comment '姓名',
    age int check( age>0 && age<=120 ) comment '年龄',
    job varchar(50) comment '职位',
    salary int comment'薪资',
    entrydate  date comment '入职时间',
    managerid int  comment '直属领导ID',
    dept_id int  comment '部门id'
)comment '员工表';


insert into emp(id,name,age,job,salary,entrydate,managerid,dept_id)values(1,'金庸',66,'总裁',20000,'2000-01-01',null,5),
                                                        (2,'张无忌',20,'项目经理',12500,'2005-12-05',1,1),
                                                        (3,'杨逍',33,'开发',8400,'2000-11-03',2,1),
                                                        (4,'韦一笑',48,'开发',11000,'2002-02-05',2,1),
                                                        (5,'常遇春',43,'开发',10500,'2004-09-07',3,1),
                                                       (6,'小昭',19,'程序员鼓励师',6600,'2004-10-12',2,1),
                                                       (7,'灭绝',60,'财务总监',8500,'2002-09-12',1,3),
                                                       (8,'周芷若',19,'会计',4800,'2006-06-02',7,3),
                                                       (9,'丁敏君',23,'出纳',5250,'2009-05-13',7,3),
                                                       (10,'赵敏',20,'市场部总监',12500,'2004-10-12',1,2);

alter table emp add constraint fk_emp_dept_id foreign key emp(dept_id) references dept(id);

-- 1.查询员工的姓名、年龄、职位、部门信息(隐式内连接)
select emp.name,emp.age,emp.job,dept.name from emp,dept where emp.dept_id=dept.id;

-- 2.查询年龄小于30岁的员工的姓名、年龄、只为、部门信息(显式内连接)
select e.name,e.age,e.job,d.name from emp e join dept d on e.dept_id = d.id&&e.age<30;

-- 3.查询拥有员工的部门ID、部门名称
select id,name from dept where dept.id in (select dept_id from emp);

insert into emp values (11,'陈友量',42,NULL,2000,'2011-10-12',1,NULL);
-- 4.查询所有年龄大于40岁的员工,及其归属的部门名称;如果员工没有分配部门,也需要展示出来
select ee.*,d.name from (select * from emp where age>40) ee left join dept d on d.id =ee.dept_id;
-- 5.查询所有员工的工资等级--隐式内连接
select e.name,s.grade from emp e,salgrade s  where e.salary>=s.losal && e.salary<=s.hisal;
select e.name,s.grade from emp e,salgrade s  where e.salary between s.losal and s.hisal;
-- 6.查询研发部所有员工的信息及工资等级
select e.*,s.grade from emp e,salgrade s  where e.dept_id=(select id from dept where dept.name='研发部') && e.salary between s.losal and s.hisal;
select e.name,s.grade from  emp e,salgrade s ,dept d  where d.name='研发部' and e.dept_id=d.id and  e.salary between s.losal and s.hisal;

-- 7.查询研发部的平均工资
select avg(e.salary) from emp e, dept d where d.name='研发部'and e.dept_id=d.id ;

-- 8.查询工资比灭绝高的员工信息
select e.salary from emp e where e.name='灭绝';
select a.* from emp a where a.salary>(select e.salary from emp e where e.name='灭绝');

-- 9.查询比平均薪资高的员工信息
select avg(e.salary) from emp e;
select * from emp a where a.salary>(select avg(e.salary) from emp e);

-- 10.查询低于1部门平均工资的员工信息
select avg(e.salary) from emp e where e.dept_id=1;
select * from emp e where e.dept_id=1 and e.salary<(select avg(e.salary) from emp e where e.dept_id=1);

-- 11. 查询所有的部门信息,并统计部门的员工人数
-- a.查询所有部门信息
select d.id,d.name,d.id '人数'from dept d;
-- b.统计某一部门的员工人数
select count(*) from emp e where e.dept_id=1;
select d.id,d.name,(select count(*) from emp e where e.dept_id=d.id) '人数'from dept d;
小结:

事务

事务简介

事务是一组操作的集合,它是不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败

默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务

事务操作

-- ------------------事务
-- 更新数据
update account set money=2000 where name='李四'or name='王五';

-- 转账操作
select @@autocommit;

set @@autocommit=0;-- 手动操作

-- 1.查询李四余额
select * from account where name='李四';

-- 2.将李四余额-1000
update account set money=money-1000 where name ='李四';

-- 3.将王五余额+1000
update account set money=money+1000 where name ='王五';

-- 提交事务  程序执行成功执行
commit ;
-- 回滚事务 程序执行失败
rollback ;

-- 方式二
-- 开启事务
start transaction ;

-- 1.查询李四余额
select * from account where name='李四';

-- 2.将李四余额-1000
update account set money=money-1000 where name ='李四';
程序报错。。
-- 3.将王五余额+1000
update account set money=money+1000 where name ='王五';

-- 提交事务
commit ;
-- 回滚事务
rollback ;

事务四大特性(ACID)

原子性(Atomicity):事务是不可分割的最小单元,要么全部成功,要么全部失败

一致性(Consistency):事务完成时必须使所有的事务都保持一致状态

隔离性(Isolation):数据可系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行

持久性(Durability):事务一旦提交或回滚,它对数据库中数据的改变是永久的。

并发事务问题

事务隔离级别

 从上到下:事务隔离级别越高,数据越安全,性能越差。

 

 基础篇总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值