数据分析面试-数据库基本概念知识点(持续更新)

数据分析面试

数据库基本概念知识点

概念

数据库服务器(多个数据库(多个表(信息)))
服务器是不是mysql:
国际上有sql标准规定数据库存储数据格式语法等
数据库管理系统(服务器):采用sql标准的数据库软件
例如:mysql oracle IBM DB2 sqlide postgresql(类似不同浏览器)
mysql:lamp架构:mysql,linux,php,apache
开源免费
安装
beta版
stable版:稳定版(5.1,5.5)

补充规则

大小写一样
分号命令结束 逗号隔行命令
quit退出 use使用无;
c取消上次命令
数据文件存储位置: show global variables like “%datadir%”;

1064语法错误
显示当前mysql版本和当前日期
select version(),current_date;

  1. 连接服务器mysql -uroot -p
  2. 先选库 use 库名(show databases;)
  3. 选择表 表的操作
    中文乱码:数据库使用utf编码与客户端框编码jbk不一样
    setname jbk;//告诉服务器客户端编码方式
    tee D:/1022.sql //记录所有命令到日志
  • mysql引擎(创建表的时候)
    数据是一样的 但是不同的引擎存储数据格式是不一样的

Myisam:粗而快
批量插入速度快 不检查数据
事务安全低(插入数据不检查)
支持全文索引
空间使用低
innoDB 细而慢
检查数据 事务安全高 批量插入速度慢 空间使用高

事务

事务:实现事务要用innodb引擎支持事务安全
事务:原子性 一致性 隔离性 持久性

  • 原子性
    原子性:逻辑上不可分割:要么成功要么不成功(如银行转账)
    #start transaction
    原子操作
    #commit
    实现原理:当只有一部分操作成功的时候 rollbacl回滚至初始状态
  • 一致性
    操作前后,值的变化在逻辑上成立(+500 -300失败不一致)
  • 隔离性
    事务结束前,每一步带来的影响对其他人是不可见的(一方在没有结束全部操作的时候(即没commit),数据库内部虽更改了但对其他会话不可见)
  • 持久性
    事务一旦完成,无法撤销,若是错误交易 则只能用补偿性事务进行重新修改操作

MySQL数据库文件介绍

MySQL的每个数据库都对应存放在一个与数据库同名的文件夹中,MySQL数据库文件包括
①MySQL(server)所建数据库文件
.frm文件:存储数据表的框架结构,文件名与表名相同,每个表对应一个同名frm文件,与 操作系统和存储引擎无关,即不管MySQL运行在何种操作系统上,使用何种存储引擎 都有这个文件。
②除了必有的.frm文件,根据MySQL所使用的存储引擎的不同(MySQL常用的两个存储引擎是MyISAM和InnoDB),存储引擎会创建各自不同的数据库文件。

  • MyISAM数据库表文件:
    .MYD文件:即MY Data,表数据文件
    .MYI文件:即MY Index,索引文件
    .log文件:日志文件
  • InnoDB采用表空间(tablespace)来管理数据,存储表数据和索引,
    InnoDB数据库文件(即InnoDB文件集,ib-file set):
    ibdata1、ibdata2等:系统表空间文件,存储InnoDB系统信息和用户数据库表数据和索引,所有表共用
    .ibd文件:单表表空间文件,每个表使用一个表空间文件(file per table),存放用户数据库表数据和索引
    日志文件: ib_logfile1、ib_logfile2

基本语句

create database name [charset utf8]; 创建数据库
use databasename; 进入数据库
drop database name 直接删除数据库,不提醒
mysqladmin drop databasename 删除数据库前,有提示。
mysql 中database不能改名(表可以)phpMyAdimin(复制重建改名)

show tables; 显示所有表
select * from stu;//查看表内容
drop table name;//表结构删除
truncate name;//删除表再重建相同结构的空表(快)
delete name;//删除所有数据行
rename table stu to stuu;
describe tablename; 查看表的结构
select 中加上distinct去除重复字段(显示)
desc class;//查看表结构

  • 增删改查:
    1.增行数据:表 列项 值
    insert into class (id,name,salary) values (1,张三,19999);

    //列值完全对应 ,可以增加多行values 逗号隔开
    

2.改变数据(注明改哪行):表 值 哪行
update class set name=‘hh’ ,salary=456 where id =4
where 后面为表达式 检验每行 为真 执行
【and or > < <> =】 wherer BINARY:筛选条件区分大小写
3.删除数据: 表 删哪行
(只能删除行数据 否则个别列为修改操作)
delete from class where salary>100;
4.查询数据 :表 哪列 查询行条件 //需要啥查啥不要老是用*
select name ,salary from class where id=9;
select *(所有列) from class
5.列修改
增列:alter table name add 名字 类型 参数 ;//alter 修改结构 updat 更改值
alter table name add 名字 类型 参数 after 列名字(指定加在哪列之后)
first 加在第一列
减列:alter table 表名 drop 列名
alter table 表名 rename column A to B
修改列:alter table 表明 modify 列名字 新类型 新参数
alter table 表名字 change 旧的列名字 新的列名字 类型 参数
修改列类型的注意 有些数据不能兼容改类型后会丢失

建表

建表:就是建表头
字段类型:规定每个列标题大小(适宜 容纳又不浪费)=》空间效率存储空间
列类型学习:
存储空间1字节=8位
无符号数:

二进制
十进制表示数字
0000 0000
0
1111 11111
2^8-1=255

表示一个负数,左边最高位为符号位(0 正 1负)
计算机负数换算是按照补码规则来算的,不是按照2^n-1算的:负数=七位绝对值位数-128
(0-127往后移128位->-128->-1)

带符号二进制
十进制
0 000 0000
0 111 1111
0
2^7-1=127
1 000 0000
1 111 1111
-128
2^7-1-128=-1
2的次方

1,2,4,8,16,32,64,128,256
n位 :无符号 0-2^n -1 有符号-2^(n-1) ->2^(n-1) -1
1.数值型
整型: 默认为有符号数
Tinyint:空间:一个字节,存储范围:-128-127(有符号)/0-255(无符号)
smallint(2)0-65535 mediumint(3)int(4)(40多亿)bigint(8)()
声明参数:unsigned(无符号): int unsigned
(M):补零宽度与 ZEROFILL:0填充 一起使用 自动无符号 int(3)zerofill
2.浮点型数据:
float(M,D) (自动定长度)
M 叫精度 小数的总位数 D 是标度 代表小数点右边的位置
定点decimal(M,D):把整数与小数部分分开存储比float精确
float精度有时候会损失(1234.23与1234.23)-》float显示1234.25 decimal(1234.23)
3.字符串类型;
char varchar text blob
char(4)定长度类型 每个数据存储长度一定的 不够空格补齐(取出时候删除空格因此本身空格也会丢失) 索引快直接算第几个数据的位置但h会浪费 4-》4个字符利用率《=100%
varchar (20) 变长类型 最长为20个字符 存储时前面有1-2个字节存储存每个数据长度 利用率《100%
单位时以字符为单位
text :较大文本段几万字那种文章内容 不要加默认值
blob二进制类型用来存储图像音频等二进制信息 防止因为字符集问题导致信息丢失
4.日期时间:加‘ ‘存储空间小固定字节
date time datetime
date:年月日(0000-00-00):1000-01-01 到9999-12-31 允许全0 ‘2019-08-12’
time 00:00:00‘20:21:29’
datetime:‘yyyy-mm-dd hh:mm:ss’
timestamp 显示格式与datatime相同 不填的时候自己根据系统生成值 default current_timestamp
year 只占一个字节 最多256种可能 可以存0000年 和1901-2155(可以写2位 有换算规则 但不推荐)

建表方法:

  • 先分析
    sns社交网站:
    会员表(主键id,名字,性别,体重(KG),生日,工资,上次登录时间,个人简介)
    int unsigned not null,名字 char(20) 性别(char(1),tinyint) 体重(tinyint(255) unsigned)生日 date 工资 deciamal(8,2),datetime,varchar(1000)
    优化-》除了username与介绍都是定长,都定长 极大提高效率:char还是varchar速度和空间找一个平衡
    username用char 速度比较重要浪费也浪费不了多少
    但是intro介绍 改成定常浪费空间太多,又想都保持定常因此 把intro的单独拿出来列一个表
    频繁用到的信息存在一个表中注重优化效率 不常用和很长的信息优先考虑空间存储在辅助表格中
    因此加一个附表
    id,username,intro
    创建表格的时候 表明名字 字段名直写不加引号
    看错误要看具体在哪行

主键外键

  1. 主键:

主键是数据表的唯一索引,比如学生表里有学号和姓名,姓名可能有重名的,但学号确是唯一的,你要从学生表中搜索一条纪录如查找一个人,就只能根据学号去查找,这才能找出唯一的一个,这就是主键;如:id int(10) not null primary key auto_increment ;自增长的类型 ;

  1. 外键:

面为两张表之间建立前面所述的那种“约束”。因为pc的CPU型号必须参照parts表中的相应型号,所以我们将Pc表的cpumodel字段设置为“外键”(FOREIGN KEY),即这个键的参照值来自于其他表。
ALTER TABLE pc ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel)
REFERENCES parts(model);
  第一行是说要为Pc表设置外键,给这个外键起一个名字叫做fk_cpu_model;第二行是说将本表的cpumodel字段设置为外键;第三行是说这个外键受到的约束来自于Parts表的model字段。
  这样,我们的外键就可以了。如果我们试着CREATE一台Pc,它所使用的CPU的型号是Parts表中不存在的,那么MySQL会禁止这台PC被CREATE出来。 ON UPDATE CASCADE; 即在主表更新时,子表(们)产生连锁更新动作,似乎有些人喜欢把这个叫“级联”操作。😃
  如果把这语句完整的写出来,就是:
ALTER TABLE pc ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel)
REFERENCES parts(model)
ON UPDATE CASCADE;
  除了 CASCADE 外,还有 RESTRICT(禁止主表变更)、SET NULL(子表相应字段设置为空)等操作

  1. 索引

索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。

  • 普通索引

这是最基本的索引类型,而且它没有唯一性之类的限制。普通索引可以通过以下几种方式创建:

创建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
创建表的时候指定索引,例如CREATE TABLE tablename ( […], INDEX [索引的名字] (列的列表) );

  • 唯一性索引

这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。唯一性索引可以用以下几种方式创建:
索引名字单独创建

创建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
创建表的时候指定索引,例如CREATE TABLE tablename ( […], UNIQUE [索引的名字] (列的列表)
);

查询

五种句子:
where 条件
group by分组
having筛选
order by排序
it限lim制结果条数
where>group 聚合函数>having
having =>分组后的where

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值