数据库

1.初识Mysql

1.1javaee:企业级Java开发web
  前端:页面展示数据
  后台:()连接点:连接数据库JDBC,连接前端:控制,(控制视图跳转,和给前端传递数据))
  数据库:存数据,Txt,Excel,word
  只会写代码,学好数据库,基本混饭吃
  操作系统,数据结构与算法!当一个不错的程序员
  离散数学,数字电路,体系结构,编译原理。+实战经验,高级程序员,优秀程序员
为什么学习数据库库
1.2.岗位需求
  2.1.现在世界大数据时代,得数据得天下
  2.2.被迫需求:存数据,去IO
  2.3.数据库是所有软件体系最核心的---DBA数据库管理员
1.3.什么是数据库
  数据库(DB,DataBase)
  概念:数据仓库,软件,安装在操作系统上(window,linux,mac..)SQL是操作数据库的语句,可以存大量的数据,500万
  作用:存数据,管理数据,
1.4.数据库分类

1.4.1.关系型数据库(sql)

  代表:Oracle、SQL Server、MySQL、DB2、SQLlite

  通过表和表之间,行和列之间的关系数据库进行存储,学员信息表,考勤表,.......

 1.4.2非关系型数据库(nosql) Not 

  随着时代的进步与发展的需要,非关系型数据库应运而生。

  代表:Redis、Mongodb、nosql、

  NoSQL数据库在存储速度与灵活性方面有优势,也常用于缓存

  非关系数据库,对象存储,通过自身的属性来决定

1.5.DBMS数据库管理系统

  数据库的管理软件,科学有效的管理我们的数据。维护和获取数据

  Mysql,数据库管理系统

1.6Msql简介

  MySQL是一个关系型数据库管理系统

  前世瑞典MySQL AB 公司

  今生:属于 Oracle 旗下产品

  MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

  体积小、速度快、总体拥有成本低,找人成本比较低

  中小型网站,或者大型网站,集群

1.7数据库的列类型

  数值

    tinyint      十分小的数据       1个字节

    smallin      较小的数据     2个字节

    mediumint 中等大小的数据   3个字节

    int     标准的整数   4个字节   常用的 int

    bigint    较大的数据   8个字节

    float      浮点数     4个字节

     double    浮点数     8个字节

     decimal     字符串形式的浮点数   金融计算的时候,一般是使用 decimal

  字符串

    char       字符串固定的大小  0~255

    varchar   可变字符串      0~65535    常用的变量   String

    tinytext     微型文本      2^8-1

    text      文本串       2^16-1    保存大文本  

  时间日期

    java.util.Date

    

    date      YYYY-MM-DD,日期格式

    time      HH:mm:ss    时间格式

    datetime    YYYY-MM-DD   HH:mm:ss    最常用的时间格式

    timestamp   时间戳,1970.1.1 到现在的毫秒数  也较为常用!

    year        年份表示

    null

    没有值,未知

    == 注意,不要使用NULL进行运算,结果为null

1.8MYISAM和INNODB的区别

 

  MYISAM INNODB
事务支持 不支持 支持
数据行锁定 不支持 支持
外键约束 不支持 支持
全文索引 支持 不支持
表空间的大小 较小 较大,约为2倍

 

 

 

 MYISAM:   节约空间,速度较快

 

INNODB:  安全性高,事务的处理,多表多用户操作

1.9外键:创建表的时候没有外键关系    

   ALTER table 表 add constraint 约束名 foreign key(作为外键的列)REFERENCES 那个表(哪个字段) 

      删除有外键关系的表的时候,必须要先删除引用别人的表(从表),在删除被引用的表(主表)

   物理外键是数据库级别的外键,我们不建议使用(避免数据库过多造成困扰)

   数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)

   我们想使用多张表的数据,想使用外键(程序去实现)

 

2.数据库语言四大类

2.1数据定义语言(DDL)

  2.1.1.创建、删除、使用、查看数据库里面的数据结构

  如:创建和删除数据库(创建数据库:create database 数据库名/删除数据库 :drop create database 数据库名)

     使用和查看数据库(使用数据库:use 数据库名 /查看数据库 show databases /查看指定的数据库 show create database 数据库名  )

   2.1.2创建、删除、修改、查看表

     创建表 :create table[if  not exists] 表名()   primary key 主键 auto_increment 自增

     删除表 :drop[if exists]table 表名    删除表的字段 alter table 表名 drop 字段名

     修改表:alter table 表名  rename 新表名     增加表的字段:alter table 表名 add  字段名  列属性 

     修改表的字段 :alter table 表名  modify 字段名 列属性  --修改类型和约束     alter table 表名 change 字段名 新字段名 列属性  --修改字段名

     查看表:查看一个数据库中的表:show tables    查看表的结构 show create table 表名      ,desc  表名  

2.2 DML语句

数据库意义:数据存储,数据管理

DML语言:数据操作语言

增删改    insert    delete   update

增 

  插入语句(添加)
     insert into 表名([字段名1,字段2,字段3,])values ('值1'),('值2'),('值3'),.....('值4');

    一般插入语句,我们一定要数据和字段一一对应!

    由于主键自增我们可以省略(如果不写表的字段,他就会一一匹配)

  注意事项:

    1.字段和字段之间使用英文逗号隔开

    2.字段可以省略

操作符 含义 范围 结果
= 等于 5=6 false
<>或!= 不等于 5<>6 true
> 大于 5>6 false
< 小于 5<6 true
<= 小于等于 5<=6 false
>= 大于等于 5>=6 false
Between... and... 在某个范围内 [2,5]  
and 我和你&& 5>1and1>2 false
or 我或你|| 5>1or1>2 true

 

  语法
     update 表名 set 字段名=value,[字段名=value,....] where[条件]

  修改多个属性,逗号隔开

  通过多个条件定位数据,无上限
  条件, 筛选的条件,如果没有条件指定,则会修改所有的列

  value,是一个具体的值,也可以是一个变量

  多个设置属性之间,使用英文逗号隔开


 delete 命令

  语法:delete from 表名 [where 条件] 

  删除数据(避免这样写,会全部删除)  delete from 表名;

  删除指定数据             delete from 表名 where 条件;

  delete 与trucate区别
    相同点:都能删除数据,多不会删除表结构
    不同:
    truncate 重新设置 自增列 计数器会归零
    truncate 不会影响事务

  DELETE 删除问题 重启数据库

      INNODB 自增列会从1 开始(存在内存当中的,断电即失)

      MyISAM 继续从上一个自增量开始(存在文件中的,不会丢失)

2.3DQL语句(重点)

Data Query LANGUAGE:数据查询语言

    所有的查询操作都用它  select

    简单的查询,复杂的查询它都能做

    数据库中最核心的语言,最重要的语句

    使用频率最高的语句

  语法: select 字段1,[字段2,字段3......]from 表名

  有的时候,列名字不是那么的见名知意。我们起别名  as 字段名  as 别名   表名  as  别名

  去重 distance 

    作用:去除select 查询出来的结果中重复的数据,重复的数据只显示一条

    比如:select distinct 字段名 from 表名;

  数据库的列(表达式)   

    select VERSION();-- 查询系统版本(函数)
    select 100*3-1 as 计算结果; -- 用来计算(表达式)
    select @@auto_increment_increment; -- 查询自增的步长(变量)
    select studentNo ,studentResult from result;
    select studentno ,studentResult+1 as 提分后 from result;

    语法 :select 表达式 from 表

   数据库中的表达式:文本值,列,null,函数,计算表达式,系统变量

  where条件字句

    作用检索数据中符合条件的值

  搜索的条件由一个或者多个表达式组成!结果 布尔值

运算符 语法 描述
and   &&

a and b  a&&b

逻辑与,两个都为真,结果为真
or || a or b   a||b 逻辑或,其中一个为真,则结果为真
not  ! not a  ! a 逻辑非,真为假,假为真!

    查询成绩90~100之间的成绩
    select studentNo ,studentResult from result where studentResult between 90 and 100;
    select studentNo ,studentResult from result where studentResult>=90 and studentResult<=100;

    查询除了1000号学生之外的同学的成绩

    select studentNo ,studentResult from result where not studentNo=1000 and not studentNo=1001 and not studentNo=1002 ;

  模糊查询:比较运算符

    

运算符 语法 描述
is null a is null 如果操作符为null,结果为真
is not null  a is not null 如果操作符不为null ,结果为真
between a between b and  c 若a 在b 和c之间,则结果为真
like a like b sql 匹配 如果a匹配b 则结果为真
in a in (a1,a2,a3.....) 假设a在a1,或者a2....其中的某一个值中,结果为真

      

    -- 查询姓刘的同学
    -- like 结合 %(代表0到任意个字符) 、_(一个字符)
    seleCt studentNo ,studentname from student where studentname LIKE '刘%';

    -- 查询姓刘的同学后面名字只有一个字的
    seleCt studentNo ,studentname from student where studentname LIKE '刘_';

    -- 查询姓刘的同学后面名字只有两个字的
    seleCt studentNo ,studentname from student where studentname LIKE '刘__';

    -- 查询名字中带有人字的同学%人%
    seleCt studentNo ,studentname from student where studentname LIKE '%人%';

    -- =============in(具体的一个或者多个值)===========
    -- 查询1001,1002,1003号学员
    select studentNo ,studentname from student WHERE studentNo in(1001,1002,1003);

    -- 查询在北京的学生
    select studentNo ,studentname from student WHERE address in('北京海淀区');

    -- ===================null not null==============

    -- 查询地址为空的学生null
    select studentNo ,studentname from student WHERE address='' or address is null;

    -- 查询有出生日期的同学 不为空
    select studentNo ,studentname from student WHERE borndate is not null;

    -- 查询没有出生日期的同学 为空
    select studentNo ,studentname from student WHERE borndate is null;

   联表查询

    -- ===================联表查询=========================

    -- 查询参加了考试的同学(学号,姓名,科目编号,分数)
    SELECT from student;
    SELECT from result;
    /*思路
    1.分析需求,分析查询的字段来自哪些表(连接查询)
    2.确定使用哪种连接查询? 7种
    确定交叉点(这两个表中哪个数据是相同的)
    判断的条件:学生表中的 studentno = 成绩表 studentno
    */

    -- jion(连接的表) on(判断的条件) 连接查询
    -- where 等值查询
    SELECT s.studentno, studentname, subjectno, studentresult FROM
    student s INNER JOIN result r on s.studentno=r.studentno;

    -- RIGHT JOIN
    SELECT s.studentno, studentname, subjectno, studentresult FROM
    student s right JOIN result r on s.studentno=r.studentno;

    -- LEFT JOIN
    SELECT s.studentno,studentname,subjectno,studentresult FROM
    student s left JOIN result r on s.studentno=r.studentno;

操作 描述
inner join 如果表中最少有一个匹配,就返回行
left  join 会从左表中返回所有的值,即使右表中没有匹配
right join 会从右表中返回所有的值,即使左表中没有匹配

   自连接:自己的表和自己的表连接,核心:一张表拆为两张一样的表即可

   分页和排序:分页limit 排序order by

    排序:

    order by 语法:select *from 表名 order by 字段名 ; desc 降序 ,asc 升序

    分页:

    应用:网页应用 当前,总的页数,页面的大小

    limit  语法:select *from 表名 order by 字段名 limit (n-1)*pagesize,pagesize;

    第一页 limit 0~5 (1-1)*5
    第二页 limit 5~5 (2-1)*5
    第三页 limit 10~5 (3-1)*5
    第n页 limit 0~5 (n-1)*pagesize,pagesize
    [pagesize: 页面大小]
    [(n-1)*pagesize:起始值]
    [n: 当前页]
    [数据总数/页面大小=总页数]

  子查询:本质:在where语句中嵌套一个子查询语句

           嵌套查询:在嵌套一条查询语句where  字段名 in(查询字段名对应的语句)

  函数:

      数学计算
      select ABS(-8); -- 绝对值
      select CEILING(9.4); -- 向上取整
      select FLOOR(9.4); -- 向下取整
      select RAND(); -- 返回一个0~1的随机数
      select SIGN(10) -- 判断一个数的符号 0-0 负数返回-1 正数返回1

      字符串函数

      select CHAR_LENGTH('即使在小的帆也能远航') -- 字符串长度

      select CONCAT('我','爱','变成'); -- 拼接字符串
      select `INSERT`('我爱编程helloword',1,2,'超级热爱'); -- 查询,从某个位置开始替换某个长度
      select LOWER('KuangSheng') -- 小写字母
      select UPPER('KuangSheng') -- 大写字母
      select INSTR('kuangsheng','h') -- 返回第一次出现的字符串索引
      select REPLACE('狂胜说坚持就能成功','坚持','努力'); -- 替换出现的指定字符串
      select SUBSTR('狂胜说坚持就能成功',4,6) -- 返回指定的字符串(源字符串,截取的位置,)
      select REVERSE('清晨我上马') -- 反转

      查询姓 周的同学,名字 邹
      SELECT REPLACE(studentname,'周','邹')FROM student WHERE studentname like '周%'

      时间和日期函数

      select CURRENT_DATE() -- 获取当前日期
      select CURDATE() -- 获取当前日期
      select NOW() -- 获取当前的时间
      SELECT LOCALTIME() -- 本地时间
      select SYSDATE() -- 系统时间


      -- ==========================聚合函数============================
      -- 都能统计表中的数据(想查询一个表中有多少个记录,就使用这个count())
      select count(address) from student; -- count(字段),会忽略所有的null值
      SELECT count(*) from student -- count(*),不会忽略null值 ,本质 计算行数
      select COUNT(1) from student -- count(1),不会忽略所有的null值 本质 计算行数

      select SUM(studentresult) as 总和 from result
      select avg(studentresult) as 平均分 from result
      select max(studentresult) as 最高分 from result
      select min(studentresult) as 最低分 from result

    

    MD5:

      什么是MD5

      主要增强算法复杂度补课逆性

      Md5 不可逆,具体的值的md5 一样的

      MD5破解网站,背后有一个字典,MD5加密后的值  加密前的值

  3.事务

    事务原则:ACID原则 原子性 持久性 一致性 隔离性(脏读,幻读........)

     原子性(Atomicity):

      要么都成功,要么都失败

     一致性(Consistency):

      事务前后的数据完整性要保持一致

     持久性(Durability)--事务提交

      事务一旦提交则不可逆,被持久化到数据库中

     隔离性(Isolation)

      事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他的事务操作数据所干扰,事务之间要相互隔离。

     隔离所导致的一些问题

      脏读:指一个事务读取了另外一个事务未提交的数据

     不可重复读

      在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)

     虚读(幻读)

      是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

     mysql 是默认开启事务自动提交的

       set autocommit=0 -- 关闭

      set autocommit=1 -- 开启(默认的)

      commit 提交事务 rollback 回滚事务,回滚到原来的样子

     索引:索引在小数据量的时候,用处不大,但在大数据的时候,区别非常明显

      索引原则

        1.索引不是越多越好

        2.不要对进程变动数据加索引
        3.小数据的表也不需要加索引
        4.索引一般加在常用来查询的字段上

     mysql备份:

       为什么要备份:

       保证重要的数据不丢失

       数据转移

         使用命令行到处 mysqldump 命令行使用

       备份数据库

        mysqldump  -hlocalhost -uroot -p密码 数据库 >物理磁盘位置\文件名

       备份数据库中的表格

        mysqldump  -hlocalhost -uroot -p密码 数据库 表名>物理磁盘位置\文件名 

       还原数据

        mysql  -hlocalhost -uroot -p密码  jdsc_new<物理磁盘位置\文件名

         登陆的状态下

        source d:/a.sql

     三大范式

        第一范式(1NF)

        原子性:保证每一列不可再分
        第二范式(2NF)
        前提:满足第一范式
        每张表只描述一件事
        第三范式(3NF)
        前提:满足第一范式和第二范式
        第三范式需要确保数据表中的每一列都和主键有关,而不能间接相关

    (规范数据库的设计)

    规范性和性能的问题
    关联查询不能超过3个表
        1.考虑商业化的需求和目标,(成本,用户体验!)数据库的性能更重要
        2.在规范性能的问题的时候,需要适当的考虑一下 规范性
        3.故意给某些表加一些冗余的字段(从多表查询变为单表查询)
        4.故意增加一些计算列(从大数据量降低为小数据量的查询:索引)

 

posted @   pengrq  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示