Linux系统分类 ^ 数据库的分类
Linux系统
- Centos(获取软件包使用yum、dnf)
- Ubuntu(获取软件包使用apt-get)
- Suse
国产系统
- 华为 欧拉
- 阿里 龙蜥
- 腾讯 tencentOS
- 麒麟(银河麒麟、中标麒麟->基于centos 优麒麟-> 基于Ubuntu )
- 统信 红旗
数据库分类
- 关系型数据库 relational
- Oracle MySQL SQLserver
- 非关系型数据库 NoSQL
- 文档型document【MongoDB】
- 缓存型key-value【Redis Memcached】
- 搜索型search engine【elasticsearch】
- 时序型 【Prometheus InfluxDB】
关系型数据库典型代表
- Mysql(开源免费,应用最广 常用版本5.7/8.0)
- Mariadb(MySQL同作者)
- Oracle(最安全完善,但是操作复杂)
- SQL Server(微软,桌面运维多用)
- DB2(IBM公司,操作不能回退)
- PostgreSQL(由于MySQL轻量级,公司业务扩展后MySQL可能不够用,于是使用体积较大,功能更全的PostgreSQL做高低搭配【一般的公司都不会只用一个数据库】 PostgreSQL也可以实现将oracle数据平移。)
国产数据库代表
- 阿里云 RDB
- 华为 高斯
- 腾讯 TDBA
- 阿里 Oceanbase
- 人大金仓 达梦
你公司用什么数据库?(面试题)
MySQL,再加PostgreSQL做高低搭配
关系型数据库的结构
关系型数据库的存储结构是 二维表格
在每个二维表中
- 每一行称作一条记录:用来描述一个对象的信息
- 每一列称作一个字段:用来描述对象的一个属性
先创建 库 -> 在创建 表 -> 最后创建 列(字段)
常用的数据类型
int :整型 无符号[0,2^32-1],有符号[-2^31,2^31-1]
float :单精度浮点 4字节32位
double :双精度浮点 8字节64位
char :固定长度的字符类型
varchar :可变长度的字符类型
text :文本
image :图片
decimal(5,2) :5个有效长度数字,小数点后面有2位
连接MySQL数据库
更改root用户登录密码 (abc123为密码)
mysqladmin -u root password "abc123"
登录MySQL
mysql -u root -pabc123
给root用户赋权,可用操作所有数据库
grant all privileges on *.* to 'root'@'%' identified by 'abc123'; #privileges 可以省略 grant all on *.* to 'root'@'%' identified by 'abc123';
刷新权限
flush privileges;
数据库表结构查看
显示数据库
show DATABASES;
切换数据库
use mysql
显示数据库中表
show TABLES;
查看表结构
desc user
不进入库查看表
show tables from mysql desc mysql.user
SQL语句语言分类
DDL 数据定义语言 创建数据库对象(库 表 索引)
DML 数据操纵语言 对表中数据进行管理(增删改)
DQL 数据查询语言 从数据库表中查找符合条件的数据记录(查)
DCL 数据控制语言 设置更改数据库用户和角色权限
DDL 数据定义语言 创建和删除数据库和表 修改表名和表结构 CREATE DROP ALTER
创建数据库
create database xue; show DATABASES
删除数据库
drop database xue; show DATABASES
创建新表
create table xue (id int,name char(4),age int,sex char(2)); desc xue
创建新表,设置ID为主键。可以在最后指定primary key(),也可以直接在数据字段后直接跟上primary key
create table xue (id int(4),name char(4),age int,sex char(2),PRIMARY KEY(id) ); create table xue (id int(4) primary key ,name char(4),age int,sex char(2)); desc xue
删除表
drop table xue; show tables
drop table mysql.xue; /*不用切换数据库的写法*/
更改表名
alter table xue RENAME xuexue
扩展表结构(增加字段)
alter TABLE xuexue add hobby varchar(10) DEFAULT '无' /*添加hobby列,格式varchar长度10,默认值‘无’*/ select * from xuexue desc xuexue
修改字段名,添加唯一键
alter table xuexue change name username varchar(5) UNIQUE KEY select * from xuexue /*更改表xuexue 将name列改为varchar长度5的username列,并且唯一值*/
删除字段
alter table xuexue drop hobby; select * from xuexue
案例扩展
create table if not exists xue( id int(4) zerofill primary key auto_increment, name char(6) not null default '不详', phone int unique key )
- if not exists:表示检测要创建的表是否已存在,如果不存在就继续创建
- int(4) zerofill:表示若数值不满4位数,则前面用“0”填充,例0001【只写int(4)若不写zerofill则毫无意义】
- auto_increment:表示此字段为自增长字段,即每条记录自动递增1,默认从1开始递增;自增长字段数据不可以重复;自增长字段必须是主键;如添加的记录数据没有指定此字段的值且添加失败也会自动递增一次
- unique key:表示此字段唯一键约束,此字段数据不可以重复;一张表中只能有一个主键, 但是一张表中可以有多个唯一键
- not null:表示此字段不允许为NULL
DML 数据操纵语言 管理表中的数据记录 INSERT、UPDATE、DELETE
在表中插入数据
INSERT INTO xue (id,name,age,sex) VALUES (1,'xue',20,'男'); INSERT INTO xue VALUES (2,'OXU',21,'女'); /*不指定字段*/ SELECT * FROM xue
INSERT INTO KY08(id,name,score,passwd) values(1,'zhangsan',70.5,PASSWORD('123456')); #PASSWORD('123456'):查询数据记录时,密码字串以加密形式显示;若不使用PASSWORD(),查询时以明文显示。
修改表中数据
UPDATE xue set sex='女' WHERE id=1;
UPDATE xue set age=30,sex='男' where id = 4 or id = 5; SELECT * FROM xue
删除表中数据
delete from 表名; 一条一条的删除,效率较低(高负载使用CPU没准服务器就崩了,别用),自增长字段仍然会按照清空前的顺序自增
truncate table 表名; 直接重置表,清空效率快,自增长字段会从1重新开始
更改表中数据
UPDATE xuexue set hobby='GAMING' where name='xue'; select * from xuexue
DQL 数据查询语言 SELECT
查询2-4行数据
SELECT * FROM xue where id>=2 and id<=4
查询头三行内容(limit)1-3行
SELECT * FROM xue LIMIT 3
查询name age列
SELECT name,age FROM xue
查询第3行后的4行内容(limit)4-7行 【不包括第3行】面试题
SELECT * FROM xue LIMIT 3,4
查询第9行后的10行内容(limit)10-20行 【不包括第9行】面试题
SELECT * FROM xue LIMIT 9,11
查询第99行后的100行内容(limit)100-200行 【不包括第99行】面试题
SELECT * FROM xue LIMIT 99,101
在查询时纵向排列数据(避免命令行方式查询导致的排版错乱)
SELECT * FROM xue\G
DCL 数据控制语言 管理用户和权限 GRANT和REVOKE
创建用户
create user '用户名'@'源地址' identified by '密码'; localhost/%
下面两个用户,虽然看起来一样都是root用户
但是在MySQL中,这两个是区分开的,作为两个整体。如果只授权了'root'@'%','root'@'localhost'仍然无权限,需要授权。同时这两个用户密码也可以不一样。
在MySQL本地使用命令 mysql -uroot -p 默认使用'root'@'localhost'用户登录 在远程主机使用命令 mysql -uroot -p -h 192.168.xx.xx -P 3306 默认使用'root'@'%'用户登录 在MySQL本地使用命令 mysql -uroot -p -h 192.168.xx.xx -P 3306 默认使用'root'@'%'用户登录
'用户名':指定将创建的用户名
'来源地址':指定新创建的用户可在哪些主机上登录,可使用IP地址、网段、主机名的形式,本地用户可用localhost,允许任意主机登录可用通配符%
'密码':若使用明文密码,直接输入'密码',插入到数据库时由Mysql自动加密;
若使用加密密码,需要先使用SELECT PASSWORD('密码'); 获取密文,再在语句中添加 PASSWORD '密文';
若省略“IDENTIFIED BY”部分,则用户的密码将为空(不建议使用)查看abc123明文密码的密文显示
SELECT PASSWORD('abc123') SELECT PASSWORD('123456')
添加新账户,语句中添加刚刚获取的password密文
create user 'xue'@'%' identified by password '*6691484EA6B50DDDE1926A220DA01FA9E575C18A' create user 'xue'@'localhost' identified by password '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' # 'xue'@'%' 'xue'@'localhost' 虽然都是xue但是MySQL认为是两个不同的账户,对应xue用户名不同终端登录,可以有不同密码
查询user表中用户密码
select user,host,authentication_string from mysql.user;
更改用户名
rename user '旧用户名'@'源地址' to '新用户名'@'源地址'; rename user 'xue'@'localhost' to 'xuexuexue'@'localhost'; select user,host,authentication_string from mysql.user;
删除用户
drop user '用户名'@'源地址'; drop user 'xuexuexue'@'localhost'; select user,host,authentication_string from mysql.user;
修改当前密码
set password [for '用户名'@'源地址'] = password('.....'); set password for 'xue'@'%' = password('1234568790'); #password('.....')明文转换为密文 select user,host,authentication_string from mysql.user;
找回root密码(面试题)
1)修改配置文件,在[mysqld]下添加skip-grant-tables
vim /etc/my.cnf [mysqld] skip-grant-tables 跳过MySQL的授权表认证
2)重启mysqld服务,使用 mysql 命令直接进入免密进入mysql
systemctl restart mysqld
3)此时set password命令无法修改。通过更改表数据的方法更改root密码。
select user()
update mysql.user set authentication_string=password('abc123') where user='root'; /*password('.....')明文转换为密文*/ update mysql.user set authentication_string=password('abc123') where user='root' and host='localhost'; #也可以指定root用户同时指定客户端
FLUSH PRIVILEGES; #刷新权限
4)还原配置文件,重启服务,使用账号密码验证登录
vim /etc/my.cnf [mysqld] #skip-grant-tables 删除
systemctl restart mysqld
#shell中输入root密码登录 mysql -u root -pabc123
权限管理
1.授予权限
GRANT语句:专门用来设置数据库用户的访问权限。当指定的用户名不存在时,GRANT语句将会创建新的用户;当指定的用户名存在时, GRANT 语句用于修改用户信息。若/etc/my.cnf设置了NO_AUTO_CREATE_USER,则不会自动创建用户。
grant 权限1,权限2,... on 库名.表名 to '用户名'@'源地址' [identified by '密码']; all *.*
#权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔,如“select,insert,update”。使用“all”表示所有权限,可授权执行任何操作。
#数据库名.表名:用于指定授权操作的数据库和表的名称,其中可以使用通配符“*”。例如,使用“xue.*”表示授权操作的对象为 xue数据库中的所有表。
#'用户名@来源地址':用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。来源地址可以是域名、IP地址,还可以使用“%”通配符,表示某个区域或网段内的所有地址,如“%.xue.com”、“192.168.80.%”等。
#IDENTIFIED BY:用于设置用户连接数据库时所使用的密码字符串。在新建用户时,若省略“IDENTIFIED BY”部分,则用户的密码将为空。#允许用户 zhangsan 在本地查询 xue 数据库中 所有表的数据记录,但禁止查询其他数据库中的表的记录。 GRANT select ON xue.* TO 'zhangsan'@'localhost' IDENTIFIED BY '123456';
#允许用户 lisi 在所有终端远程连接 mysql ,并拥有所有权限。 GRANT ALL [PRIVILEGES] ON *.* TO 'lisi'@'%' IDENTIFIED BY '123456';
#允许用户 xue 在本地查询 xue 数据库中 增 改 查 权限 GRANT select,insert,update ON xue.* TO 'xue '@'localhost' IDENTIFIED BY '123456';
#刷新权限 flush privileges; quit #使用zhangsan用户登录MySQL测试权限 mysql -u zhangsan -p123456 use xue; show tables; select * from xue;
2.查看权限
show grants for '用户名'@'源地址';
SHOW GRANTS FOR 'lisi'@'%';
3.撤销权限
revoke 权限1,权限2,... on 库名.表名 from '用户名'@'源地址'; all
REVOKE select ON xue.* FROM 'zhangsan'@'%'; /*收回zhangsan对xue库的select权限*/ REVOKE ALL ON *.* FROM 'lisi'@'%'; /*收回lisi所有权限*/ SHOW GRANTS FOR 'zhangsan'@'%'; SHOW GRANTS FOR 'lisi'@'%'; #USAGE权限只能用于数据库登陆,不能执行任何操作;USAGE权限不能被回收,即 REVOKE 不能删除用户。 flush privileges; /*刷新权限*/
mysql 6大常见的约束
主键约束 primay key 主键字段不允许有重复的记录,不允许为null,一个表只能有一个主键 唯一性约束 unique key 唯一键字段不允许有重复的记录,但允许为null,一个表可以有多个唯一键 非空约束 not null 字段不允许空 默认值约束 default 如果没有设置值 用默认值填充 自增约束 auto_increment 如果字段值没有指定 从1开始每次自增1。要求自增字段必须为主键字段
外键约束 foreign key 保证相关联表的数据完整和一致 int(4)指定显示4位,搭配zerofill,可以实现写入1,填充为0001【(4)若不写zerofill则毫无意义】
SQL语言高级操作
克隆表 (面试题【区别】)
create table 新表 like 源表; insert into 新表 (select * from 源表); 数据一样,表结构一样
create table 新表 (select * from 源表); 数据一样,表结构可能不一样
清空表 (面试题【区别】)
delete from 表名; 一条一条的删除,效率较低(高负载使用CPU没准服务器就崩了,别用),自增长字段仍然会按照清空前的顺序自增
truncate table 表名; 直接重置表,清空效率快,自增长字段会从1重新开始
创建临时表
create temporary table 表名 (....); 临时表只能在当前会话中有效,且退出当前会话则会失效外键约束 show tables看不到 desc 表名 看得到 并且也可以insert插入
示例 create temporary table test03 ( id int(4) zerofill primary key auto_increment, name varchar(10) not null, cardid int(18) not null unique key, hobby varchar(50)); insert into test03 values(1,'zhangsan',123456,'running'); select * from test03; show tables; quit select * from test03;
创建外键表(外键了解即可,生产环境中为了不扰乱业务逻辑一般不会用)
外键的定义:如果同一个属性字段X在表一中是主键,而在表二中不是主键,则字段X称为表二的外键。
主键表和外键表的理解:
(1)以公共关键字作主键的表为主键表(父表、主表)
(2)以公共关键字作外键的表为外键表(从表、外表)注意:与外键关联的主表的字段必须设置为主键。要求从表不能是临时表,主从表的字段具备相同的数据类型、字符长度和约束。
主键表: alter table 表名 add primary key (主键字段); 外键表: alter table 表名 add foreign key (外键字段) references 主键表 (主键字段); alter table 表名 [constraint FK_外键别名] add foreign key (外键字段) references 主键表名 (主键字段); /*指定约束名,若不指定也会自动创建*/ 插入数据时,是先主表再外表;删除数据时,是先外表再主表
#创建主表 profession create table profession (pid int(4),proname varchar(50)); #为主表 profession 添加一个主键约束。主键名建议以“PK_”开头。 alter table profession add constraint PK_pid primary key (pid); /*直接在创建表时候设定主键更方便*/ #创建从表 student create table student (id int(4) primary key auto_increment,name varchar(10),age int(3),proid int(4)); #为从表 student 表添加外键,并将 student 表的 proid 字段和 profession 表的 pid 字段建立外键关联。 #外键名建议以“FK_”开头。 alter table student add constraint FK_pro foreign key (proid) references profession (pid); desc student; show create table student; /*更加明显*/ #插入新的数据记录时,要先主表再从表 insert into profession values(1,'云计算'); insert into profession values(2,'大数据'); insert into student values(1,'zhangsan',18,1); insert into student values(2,'lisi',19,1); insert into student values(3,'wangwu',20,2); #删数数据记录时,要先从表再主表,也就是说删除主键表的记录时必须先删除其他与之关联的表中的记录。 delete from student where proid=1; delete from profession where pid=1; #查看和删除外键约束 show create table student; desc student; alter table student drop foreign key FK_pro; alter table student drop key FK_pro;