数据库简介

  • IO流数据存储弊端
  1. 效率低
  2. 存取都麻烦
  3. 一般只能保存小量数据
  4. 只能保存文本数据

什么是DB

  • Database:数据库
  • 数据库本质上就是一个文件集合 数据库就是存储数据的仓库,本质上是一个文件系统,数据会按照特定的格式保存到文件中,用户可以对数据库中的数据进行增删改查操作

什么是DBMS

  • Database Management System: 数据库管理系统
  • DBMS就是管理数据库文件的软件
  • 常见的DBMS有: MySQL、oracle、sqlserver、DB2、Sqlite
    DBMS是指一种管理数据库的大型软件,用于创建、管理、维护数据库文件,对数据库文件进行统一的管理和控制,用户通过数据库管理系统
    访问数据库中的数据

数据库软件的分类

  • 关系型数据库: 经过数学理论验证,可以将现实生活中任意关系保存关系型数据库中,关系型数据库中以表为存储单位
  • 非关系型数据库: 用来解决一些特定场景,比如解决缓存问题,解决高并发问题 Redis数据库(以键值对的形式保存数据)

主流关系型数据库介绍

  • MySQL: 08年被Sun收购 09年Sun被Oracle收购,开源 ,由于被Oracle收购后性能大幅提升导致MySQL用户量大增,Oracle用户减少,公司计划把MySQL闭源,原MySQL程序员离开Oracle公司,创建了MariaDB数据库(Maria是公司老板的女儿名字) 市场排占有率第一
  • Oracle: Oracle公司,最贵,性能最高,市场占有率排第二,闭源,拉里艾莉森32
  • SQLServer:微软公司,闭源,市场占有率第三,主要应用在.net开发的网站中
  • DB2:IBM公司产品,闭源
  • sqlite:轻量级数据库 只有几十k,应用在嵌入式设备中(包括移动设备)

开源和闭源

  • 开源:开放源代码 免费,盈利方式靠卖服务 用户多,有大牛程序员会无偿的维护和升级
  • 闭源:源代码私有 盈利方式靠卖软件+服务 来钱快,会有大牛们攻击,但是公司内部会花钱雇人维护升级

安装数据库软件

  • 端口号使用默认的3306
  • 字符编码选择utf8

什么是SQL

  • Structured(结构化) Query(查询) Language(语言):结构化查询语言
  • 用于用户和数据库软件(DBMS)交流的语言,不管是增删还是改查都需要使用SQL语言和DBMS交流
  • SQL是写在客户端中或Java代码中,发送给DBMS,由DBMS解析执行

数据库服务器

  • 服务器是高配置的电脑
  • 数据库服务器就是在电脑上安装了DBMS
  • DBMS(mysql) 具备网络访问能力

如何连接MySQL数据库 Linux下打开终端 Windows里面打开命令行

  • 在终端或命令行中输入 mysql -uroot -p 然后回车 ,有密码的写密码 如果没有密码的直接敲回车
  • 退出命令 exit

SQL规范

  • 以;结尾
  • 关键字之间要有空格 可以有多个空格
  • SQL语句中可以1个或多个换行
  • 关键字不区分大小写

1. 数据库相关sql

  • 查看所有数据库:
show databases;
  • 创建数据库:
create database db1;
  • 删除数据库:
drop database db1;
  • 查看单个数据库详情:
show create database db1;
  • 指定字符集:
create database db1 character set utf8/gbk;
  • 使用数据库:
use db1;

2. 表相关sql

  • 创建表:
create table t1(id int,name varchar(10));
  • 查看所有表:
show tables;
  • 删除表:
drop table t1;
  • 查看单个表:
show create table t1;
  • 创建表指定引擎和字符集:
create table t1(id int) engine=myisam/innodb charset=utf8/gbk;
  • 查看表字段信息:
desc t1;
  • 修改表:
修改表名 rename table t1 to t2;
  • 修改表字符集和引擎:
alter table t1 engine=myisam/innodb charset=utf8/gbk;
  • 添加表的字段:
alter table t1 add age int first/(after xxx)
  • 删除表字段:
alter table t1 drop age;
  • 修改表字段名称和类型:
alter table t1 change age abc int;
  • 修改表的类型和位置:
alter table t1 modify age int first/(after xxx);

3. 数据相关sql

  • 插入数据:
insert into t1 values(值1,值2),(值1,值2),(值1,值2)
insert into t1 (字段名1,字段名2) values (值1,值2),(值1,值2);
  • 查询数据:
select * from t1;  select name from t1;
select name,age from t1 where id<100;
  • 修改数据:
update t1 set age=100 where id=10;
  • 删除数据:
delete from t1 where id<10;

主键约束

什么是主键:表示表中数据唯一性的字段称之为主键(主键只有一个)
什么是约束: 约束就是创建表的时候给表中字段添加的限制条件
主键约束:添加了主键约束的字段,保存的数值必须唯一而且非空

  • 格式:
create table t1(id int primary key,name varchar(10));
  • 测试唯一: 以下代码会报错 主键值不能重复
insert into t1 values(1,'刘备');
insert into t1 values(1,'张飞');
  • 测试非空:
insert into t1 values(null,'关羽');

主键+自增约束

  • 格式:
create table t2(id int primary key auto_increment,name varchar(10));
  • 测试自增:
insert into t2 values(null,'关羽');
insert into t2 values(null,'悟空');
insert into t2 values(10,'八戒');
insert into t2 values(null,'沙僧');
delete from t2 where id>5;
insert into t2 values(null,'二郎神');
  • 自增的特点:
  1. 值为null时会自动赋值
  2. 以表中曾出现的最大值基础上+1;
  3. 删除数据自增值不减
  4. delete清空表 自增数值不变
  • 如何让自增数值清零? 使用truncate关键字 ,相当于:drop+create truncate table t2;

注释 comment

  • 创建表的时候可以通过comment关键字对字段进行描述
  • 格式: create table t3(id int primary key auto_increment comment ‘这个字段是主键’,ename varchar(10),sal int comment ‘这是工资’);
  • 通过 show create table t3; 查看字段的注释

`和’的区别

  • `的作用:是用来修饰表名和字段名的,可以省略
  • '的作用:是用来修饰字符串的

数据冗余

由于表设计不够合理,出现大量的重复数据,称为数据冗余。可以通过拆分表的形式,把可能重复的数据保存到一张新的表中,在原表中只需要通过一个id建立关系即可。这种建立关系的字段称之为外键。

练习一: 保存商品的信息包括(商品id,商品名称,商品价格,库存,分类名称,上级分类)
  1. 创建商品表(item):商品id, 商品名称(name),商品价格(price),库存(num),分类id(category_id)
create table item(id int primary key auto_increment,name varchar(10),price int,num int,category_id int);
  1. 创建分类表(category):分类id ,分类名称(name),上级分类
create table category(id int primary key auto_increment,name varchar(10), parent_id int);
  • 以上表中插入数据:
    一、电器分类下的电视机分类下的康佳电视价格4480,库存38
    二、第二条数据 鞋分类下的男鞋分类下的男运动鞋分类下的耐克运动鞋价格380,库存99
  • 插入第一条数据:
insert into category values(null,'电器',null);
insert into category values(null,'电视机',1);
insert into item values(null,'康佳电视',4480,38,2);
  • 插入第二条数据:
insert into category values(null,'鞋',null);
insert into category values(null,'男鞋',3);
insert into category values(null,'男运动鞋',4);
insert into item values(null,'耐克运动鞋',380,99,5);
练习二:请设计表保存以下数据:保存教学部下java教研部的老师信息:苍老师工资200 年龄18岁,然后再保存集团总部下销售部,销售A部的员资50,年龄28岁工李白工
  1. 创建部门表:
create table dept(id int primary key auto_increment,name varchar(10),parent_id int);
insert into dept values(null,'集团总部',null);
insert into dept values(null,'教学部',1);
insert into dept values(null,'Java教研部',2);
insert into dept values(null,'销售部',1);
insert into dept values(null,'销售A部',4);
  1. 创建员工表:
create table emp(id int primary key auto_increment,name varchar(10),sal int,age int,dept_id int);
insert into emp values(null,'苍老师',200,18,3),(null,'李白',50,28,5);

事务

什么是事务:事务是数据库中执行sql语句的最小工作单元,把多条sql语句放在事务中可以保证多条sql要么全部成功,要么全部失败。

  • 测试事务:
  1. 创建person表::
create table person(id int primary key auto_increment,name varchar(10),money int);
  1. 插入数据:
insert into person values(null,'超人',200),(null,'钢铁侠',1000);
  • 查看数据库的自动提交状态
show variables like '%autocommit%';
  • 关闭自动提交 0 打开自动提交 1
set autocommit=0;

转账验证过程

  • 把自动提交关掉: set autocommit=0;
  • 让超人+300 : update person set money=500 where id=1;
  • 此时打开另外一个终端use db2; 查询数据select * from person;(数据库中的数据此时并没有修改)
  • 回到第一个终端窗口,让钢铁侠300 update person set money=700 where id=2; (当前窗口查询数据时因为查询的是内存中的数据,所以数据变了,但是此时去第二个窗口查看数据库中的数据并没有发生改变)
  • 在第一个窗口中执行手动提交commit; 此时会把内存中的多次SQL在内存中的执行结果 同时提交到数据库中(此时两个终端全部发生改变)

is null

  • 查询奖金为null的所有员工信息
select * from emp where comm is null;
  • 查询没有上级领导(mgr)的员工信息
select * from emp where mgr is null;

is not null

  • 查询emp表中有奖金的员工信息
select * from emp where comm is not null;

别名

  • 查询emp表中所有的姓名,把ename改成姓名
select ename as '姓名' from emp;
select ename '姓名' from emp;
select ename 姓名 from emp;

去重:distinct

  • 查询所有员工从事的工作
select distinct job from emp;

比较运算符 >,<,>=,<=,=,!=和<>

  • emp:comm奖金、job工作职位、sal工资、mgr领导编号、deptno部门编号
  • t_item:price单价、num库存
  1. 查询工资小于等于1600的所有员工姓名和工资
select ename,sal from emp where sal<=1600;
  1. 查询部门编号是20的所有员工姓名、职位job、部门编号
select ename,job,deptno from emp where deptno=20;
  1. 查询职位是manager的所有员工的姓名和职位
select ename,job from emp where job='manager';
  1. 查询部门不是10号部门的所有员工的姓名和部门编号 使用两种写法
select ename,deptno from emp where deptno!=10;
select ename,deptno from emp where deptno<>10;
  1. 查询t_item表中单价等于23的商品名称和价格
select title,price from t_item where price=23;
  1. 查询单价不等于8443的商品信息
select * from t_item where price!=8443;

and 和 or

  • and和java中的&&效果一样
  • or和java中的||效果一样
  1. 查询不是10号部门并且工资小于3000的员工信息
select * from emp where deptno!=10 and sal<3000;
  1. 查询部门编号是30或者上级领导为7698的员工姓名,职位,上级领导编号和部门编号
select ename,job,mgr,deptno from emp where deptno=30 or mgr=7698;

in

  • 查询工资等于5000,1500,3000的员工信息
select * from emp where sal=5000 or sal=1500 or sal=3000;
select * from emp where sal in (5000,1500,3000);

between x and y 查询x和y之间的数值(包含x和y)

  • 查询工资在2000和4000之间的员工信息
select * from emp where sal>=2000 and sal<=4000;
select * from emp where sal between 2000 and 4000;

like

  • like:用于模糊查询
  • _: 代表单个未知字符
  • %:代表0个或多个未知字符
  • 举例
  1. 包含字符a:%a%
  2. 以a开头:a%
  3. 以a结尾:%a
  4. 第二个字符是a:_a%
  5. 倒数第三个字符是a:%a__
  6. 第二个字符是a 最后一个字符是b:_a%b

like案例

  • 查询标题中出现笔记本的商品标题
select title from t_item where title like '%笔记本%';
  • 查询单价在50到200之间的得力商品(title中出现得力)
select * from t_item where price between 50 and 200 and title like '%得力%';
  • 查询有图片的得力商品(image字段不为null)
select * from t_item
where image is not null and title like '%得力%';
  • 查询标题中不包含得力的商品信息
select * from t_item
where title not like '%得力%';
  • 查询有赠品的的商品信息(在sell_point字段中包含赠字)
select * from t_itemwhere sell_point like '%赠%';

排序

  • order by写在where的后面
  • order by后面写排序的字段名,可以写一个或多个
  • 默认排序规则为升序,也可以指定规则: 升序(asc)降序(desc)
  • 举例:select name,money from person where money>5000 order by money asc/desc;

分页查询:limit

  • limit x,y x代表跳过的条数 y代表查询的条数(每页的条数)

  • limit,写在最后

  • 举例1:查询第一页的10条数据limit 0,10

  • 举例2:查询第五页的8条数据limit 32,8

  • 举例3:查询第三页每页3条数据limit (3-1)*3,3

  • 查询所有商品的价格,价格升序,显示第二页,每页7条数据

select price from t_item order by price limit 7,7;
  • 查询工资前三名的员工信息
select * from emp order by sal desc limit 0,3;
  • 查询20部门中工资最高的员工信息
select * from emp where deptno=20 order by sal desc limit 0,1;
  • 查询dell商品中价格最便宜的商品名称和价格
select title,price from t_item where title like '%dell%' order by price limit 0,1;

日期相关函数

select 'helloworld';
  • 获取当前日期+时间 now()
select now();
  • 获取当前的日期
select curdate();
  • 获取当前时间
select curtime();
  • 从年月日时分秒中提取年月日 和提取时分秒
select date(now());
select time(now());
  • 从年月日时分秒中提取年,月,日,时,分,秒
select extract(year from now());
select extract(month from now());
select extract(day from now());
select extract(hour from now());
select extract(minute from now());
select extract(second from now());

床前明月光,MySQL知多少?举头望明月,删库跑路咯!相关推荐

  1. binlog日志_【删库跑路】使用Binlog日志恢复误删的MySQL数据

    前言 "删库跑路"是程序员经常谈起的话题,今天,我就要教大家如何删!库!跑!路! 开个玩笑,今天文章的主题是如何使用Mysql内置的Binlog日志对误删的数据进行恢复,读完本文, ...

  2. 【删库跑路】使用Binlog日志恢复误删的MySQL数据

    前言 "删库跑路"是程序员经常谈起的话题,今天,我就要教大家如何删!库!跑!路! 开个玩笑,今天文章的主题是如何使用Mysql内置的Binlog日志对误删的数据进行恢复,读完本文, ...

  3. 数据库周刊54丨2020 年度报告:PingCAP、腾讯云数据库、人大金仓、GoldenDB ;CPU 100% SQL优化案例;Mysql内存溢出处理;避免删库跑路黑天鹅……

    热门资讯 [1.PingCAP 2020 年度报告|相信开放的力量 [摘要]本文为PingCAP 2020年度报告.盘点了PingCAP里程碑大事件:完成D轮2.7亿美元融资,创造全球数据库历史新的里 ...

  4. 京东到家程序员删库跑路 ! 讲一讲 MySQL 数据备份杀手锏 binlog

    我们都知道,数据非常重要 网上也经常看到一些段子,某公司程序员对工作不满,删库跑路,老板损失惨重,欲哭无泪.这不最近又爆出一例,京东到家程序员离职当天删库跑路! 那么有没有什么解决方案? 即使数据库真 ...

  5. 关闭删库跑路的后门,打造高可用的MySQL

    0 MySQL HA/Scalability 如何关上"删库跑路"的后门,维护我们的数据安全呢? 数据是当今Web,移动,社交,企业和云应用程序的流行货币.确保数据始终可用是任何组 ...

  6. mysql data目录 清空_Mysql binlog备份数据及恢复数据,学会这个,我在也不怕删库跑路啦~...

    导读 我一直都主张,技多不压身(没有学不会的技术,只有不学习的人),多学一项技能,未来就少求人一次.网上经常听到xxx删库跑路,万一真的遇到了,相信通过今天的学习,也能将数据再恢复回来~~~ 介绍 记 ...

  7. 几万年前,有一只猴子大闹地府后删库跑路...

    话说几万年前,有一只猴子在大闹地府删库跑路,导致地府几百年没缓过劲儿来...... 在知乎上冒出这么一个问题:"孙悟空无姓无名的时候,阎王生死簿是怎么写的呢?" 生死薄技术上如何实 ...

  8. 微盟“删库跑路”事件给我们的启示!

    往期热门文章: 1.<往期精选优秀博文都在这里了!> 2.开发属于自己的第一款 IDEA 插件! 3.Nginx为什么快到根本停不下来? 4.又一个程序员跑路删库跑路被抓了,导致服务器瘫痪 ...

  9. 删库跑路大神「后悔」了?我只不过犯了大家都会犯的编程错误!

      视学算法报道   编辑:好困 袁榭 [新智元导读]在开源程序界惹出「删库跑路」大新闻的开发者Marak Squires,最近发声:「人无完人,编程错误而已,GitHub你就不用再封我号了嘛!」 2 ...

最新文章

  1. 【struts2+hibernate+spring项目实战】Jfreechart工具使用(ssh项目实战)
  2. 请问当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?
  3. 中职学校计算机教学中论文,中职学校计算机教学论文
  4. linux下编辑某个文件,linux下修改以某个字母开头的文件后戳
  5. shell常用命令总结总结
  6. 通过查看__cplusplus的值查看编译器的C++标准
  7. 华为开启位置服务器,android 开启位置服务器
  8. Flutter视频播放、Flutter VideoPlayer 视频播放组件精要
  9. Hibernate向MySQL插入中文数据--乱码解决
  10. 限时抢购促销海报设计没想法,看这里!眼见的倒计时紧迫感
  11. html5经纬度 ios,iOS 如何根据经纬度来定位位置(示例代码)
  12. 经典神经网络 -- ResNet : 设计原理与pytorch实现
  13. linux下的软件管理
  14. linux日志按日期生成器,Cron表达式生成器
  15. mysql数据库木马查杀_服务器木马后门怎么查杀
  16. C++中++cnt1[s1[i]-‘a‘]的意思
  17. 战神网络 战神引擎 手游研究院 获取该区补丁失败 如何解决
  18. 技术前沿---5G技术的实现原理
  19. LVS负载均衡集群服务搭建详解
  20. ARMv8 Cortex-a 编程向导手册学习_2.ARMv8-A 寄存器

热门文章

  1. Luogu P1879玉米田题解
  2. java文本框背景_文本框和组合框不显示主题的背景颜色
  3. 斐波那契数列的两种实现思想
  4. DS-第五章-二叉树的遍历
  5. 微信公众平台模板消息 C# 操作
  6. 华为P20PRO怎样开通云闪付_华为手机POS机云闪付操作流程和手机型号
  7. 温故而知新系列:正则表达式
  8. 正负分数计算机在线算使用,计算器的负数怎么按|excel中,怎样把负数的百分数标为红色字体 ?...
  9. 安全有保障,效率大提升 | 超千点麒麟信安云在长沙某银行稳定运行!
  10. 希尔顿集团大中华区第500家酒店开业;Bose和沃尔沃汽车合作推出新款音响系统 | 美通企业日报...