第030篇:数据库学习总结

Linux系统启停服务

~ 启动:systemctl start nginx
~ 停止:systemctl stop nginx
~ 重启:systemctl restart nginx
~ 查看状态:systemctl status nginx
~ 开机自启:systemctl enable nginx
~ 禁用自启:systemctl disable nginx

MySQL数据库

  • SQL又叫结构化查询语言,分为三大类:DDL(数据定义语言)、DML(数据操作语言)、DCL(数据控制语言)
    DDL:create(创建数据库和表)、drop(删除数据库和表)、alter(修改数据库和表)
    DML:insert(增)、delete(删)、update(改)、select(查)
    DCL:grant(授权)、revoke(召回授权)
sql的注释是在注释前加--
sql中sql的关键字不区分大小写
sql语句结束后要加分号

1.DDL(数据定义语言)

切换/使用数据库
 use 数据库名; -- 切换到/使用指定数据库,切换后所有数据库相关操作都是针对这个数据库

use school;

创建数据库
 create database 数据库名称; -- 创建指定数据库,如果这个数据可已经存在,会报错
 create database if not exists 数据库名称; -- 当指定的数据库不存在的时候创建对应的数据库
 create database if not exists 数据库名称 default charset utf8; -- 创建数据库的时候指定数据文件编码方式

create database if not exists school default  charset utf8;

删除数据库
 drop database 数据库名; - 若数据库不存在会报错
 drop database if exists 数据库名称; - 如果数据库存在,则删除数据库

drop database school;
drop database if exists school;

创建表(数据库文件是通过表来存数据的)

create table 表名/create table if not exists 表名(
字段名1 类型名1 约束1,
字段名2 类型名2 约束2,
字段名3 类型名3 约束3,
 ...
)

注意:字段中一定要有一个字段来作为主键;主键要求不能为空,并且是唯一的,而且数据类型是整型
类型名:必须是当前数据库支持的数据类型
mysql常用的数据类型:int,float,double,varchar(字符串)/text(字符串),bit(布尔,0和1),date/datetime(日期和时间)
约束:not null(非空约束), unique(唯一约束), default(默认值约束), primary key(主键约束), foreign key(外键约束), auto_increment(自动增加)
注意:约束可以没有也可以有多个


# 演示代码
create table if not exists tb_students
(
stuid int primary key auto_increment,
stuname varchar(4) not null,
stubirth date,
stugender bit default 1,
stutel VARCHAR(11) unique
-- primary key(stuid) -- 主键约束还可以单独约束
);

删除表
 drop table if exists 表名; --删除指定的表

drop table if exists tb_students

修改表
 1)添加字段

alter table 表名 add column 字段名 字段类型 约束;

 2) 删除字段

alter table tb_students add column stuaddr varchar(200);

 3) 修改字段名

alter table tb_students change tel stutel varchar(11);

 4) 添加删除约束
  a.在创建表或者添加字段的时候,直接在字段后面添加约束
  b.通过修改表的方式添加和删除约束。
  alter table 表名 add constraint 约束索引 约束名(字段); - 给指定字段添加指定约束(只能添加唯一约束和主键约束)
  alter table 表名 drop constraint 约束索引名;- 删除指定约束

ALTER TABLE tb_student add constraint unique_colid UNIQUE(cid);
ALTER TABLE tb_student DROP INDEX unique_colid;

2.DML语言

  • 数据库操作语言主要提供表中数据的曾、删、改、查操作
    insert
     insert into 表名 values(值1, 值2, 值3...); - 按表中字段的顺序依次给每个字段赋值,最终形成一条新的记录
     insert into 表名(字段1, 字段2, 字段3...) values(值1, 值2, 值3...); - 按指定顺序给指定字段赋值
     insert into 表名(字段1, 字段2, 字段3...) values(值11, 值21, 值31...),(值12, 值22, 值32...),(值13, 值23, 值33...)...; - 同时插入多条记录
insert into tb_students values(1001, '宝儿姐', '2019-10-20', 0, '13345678941');
insert into tb_students(stuname,stutel,stubirth) values('张楚楠', '18912345678', DATE(NOW()));
insert into tb_students(stuname,stutel,stubirth, stugender) values
('徐三', '18965432171', '1987-3-25', 1),
('徐四', '18965432145', '1990-9-13', 1),
('夏禾', '18965432134', '1993-2-1', 0),
('柳妍妍', '18912345659', '2000-10-20', 0),
('龚庆', '18965432132', '1998-4-9', 1),
('吕良', '18965432133', '1987-8-25', 1),
('窦梅', '18965432124', '1980-3-24', 0),
('沈冲', '18965432135', '1991-2-19', 1),
('高宁', '18965432136', '1985-6-20', 1);

补充1:值的问题
字符串  -  用引号引起来
日期  -  1)日期字符串  2)date(now()) - 当前日期  year(now())-当前年 month(now())-当前月 day(now())-当前日
布尔  -  0或1

delete
 delete from 表名; - 删除当前表中的所有记录(清空表)
 delete from 表名 where 条件; - 删除所有满足条件的记录

delete from tb_students where stuname='宝儿姐';
delete from tb_students where not stuname='夏禾';  -- 删除stuname不是夏禾的所有记录
delete from tb_students where stuid>1014; -- 删除stuid值大于1014的所有记录
delete from tb_students where stuid>1012 and stugender=0; -- 删除stuid大于1012并且stugender是0的所有记录
delete from tb_students where stuname in ('宝儿姐','徐三','许思','徐四'); -- 删除stuname的值在('宝儿姐','徐三','许思','徐四')中的所有记录
delete from tb_students where stubirth between '1980-0-1-1' and '1989-12-31'; -- 删除stubrith在'1980-0-1-1'到'1989-12-31'之间的所有记录
delete from tb_students where stubirth is null; -- 删除stubrith为空的记录
delete from tb_students where stuname like '徐%'; -- 删除stuname是徐开头的所有记录
delete from tb_students where stutel like '%8'; -- 删除stutel最后一位是8的所有记录
delete from tb_students where stutel like '__8%'; -- 删除stutel第三位是8的所有记录


补充:mysql条件语句的写法(筛选)
比较运算:=,<>(不等于),>,<,>=,<=
逻辑运算: and, or, not
集合包含:in
范围: BETWEEN...and
判断是否为空:is null, is not null
筛选:like(% - 任意个任意字符,% - 一个任意字符)

update
 update 表名 set 字段1=值1,字段2=值2,字段3=值3...; -- 将指定表中所有记录中指定的字段修改成指定的值

update tb_students set stuaddr='成都';

 update 表名 set 字段1=值1,字段2=值2,字段3=值3... where 条件; -- 将满足条件的记录的指定字段设置为指定的值

update tb_students set stuaddr='重庆' where stugender=0;

select
 select * from 表名; - 获取指定表中所有记录中所有字段的数据

SELECT * FROM tb_students;

映射
  select 字段1,字段2,字段3...from 表名; - 获取表中所有记录指定字段的数据

SELECT stuname,stutel FROM tb_students;

列重命名
  select 字段1 as '新字段名1',字段2, 字段3...from 表名;

SELECT stuname as '姓名',stutel as '电话' FROM tb_students;

结果重新赋值(主要针对布尔)
  select if(字段1,值1,值2) from 表名; - mysql特有写法,如果if中对应的字段的值是1,最后结果是值1,否则是值2
  SELECT if(stugender, '男', '女') as '性别' FROM tb_students;

select case 字段 when 1 then 值1 else 值2 end from 表名;  - 通用写法
SELECT CASE stugender WHEN 1 THEN '男' else '女' end as '性别' FROM tb_students;

列合并(查询的时候,将多个字段合并成一个数据返回结果)
  select concat(字段1, 字段2...) from 表名;

SELECT CONCAT(stuid,stuname) FROM tb_students;

筛选
  select * from 表名 where 条件;

select stuname,stutel from tb_students where stugender=0;
SELECT * FROM tb_students where stuname LIKE '徐%';

排序
  select * from 表名 order by 字段; - 将查询结果按指定字段的值从小到大排序
  select * from 表名 order by 字段 asc; - 将查询结果按指定字段的值从小到大排序

SELECT * FROM tb_students ORDER BY stubirth;
SELECT * FROM tb_students WHERE stugender=1 ORDER BY stubirth;

  select * from 表名 order by 字段 desc; - 将查询结果按指定字段的值从大到小排序

SELECT * FROM tb_students ORDER BY stubirth DESC;
SELECT * FROM tb_students WHERE stugender=1 ORDER BY stubirth DESC;

3. DCL(数据控制语言)

  • DCL主要提供授权和召回授权以及事务等相关功能
    用户管理
     创建用户(root账号登录数据库后才能有创建用户的权限)
create user '用户名'@'登陆地址';  - 创建数据用户,该用户登陆不需要密码
create user '用户名'@'登陆地址' identified by '密码';
说明:用户名-随便命名;登陆地址 - ip地址/localhost(本机)/%(任意位置)

CREATE USER 'user1'@'localhost';
CREATE USER 'user2'@'%' IDENTIFIED BY '123456';

 删除

drop user 用户名;
DROP USER user2;

授权管理
 授权

grant 权限类型 on 数据库.表 to 用户名;
说明:权限类型:insert,delete,update,select,create,drop...,add privileges(所有权限)

grant SELECT on school.tb_student to 'user1'@'localhost';
grant DELETE,UPDATE on school.tb_student to 'user1'@'localhost';
GRANT SELECT ON hrs.* to 'user1'@'localhost';

 召回授权

revoke 授权类型 on 数据库.表 from 用户名;

revoke DELETE on school.tb_student FROM 'user1'@'localhost';
REVOKE SELECT on hrs.* FROM 'user1'@'localhost;

4.外键约束

1.E-R实体关系图

 E-R实体关系图是通过图表的形式来表示数据库中的表和字段以及表和表之间的关系
 表和表之间的关系主要有四种: 1对1,1对多,多对1,多对多

2.外键约束

 外键约束:让字段的值取值范围在另外一张表的主键中
 怎么添加外键约束:
  1)保证当前表中有一个字段能够保存另外一张表的主键
  2)添加外键约束
 不同对应关系外键的添加要求不同:
 一对一:可以添加到任意一张表中,只能添加到一张表中
 一对多和多对一:添加到多的那张表中
 多对多:两张表没有办法建立多对多的对应关系,需要一个第三张表才行

ALTER TABLE tb_student ADD COLUMN cid int COMMENT '所在学院';
-- 在学生表中添加新的字段,保存学院表的主键

3.添加约束的方式
 在创建表或者添加字段的时候,直接在字段后面添加约束
  通过修改表的方式添加和删除约束。

alter table 表名 add constraint 约束索引 约束名(字段);  - 给指定字段添加指定约束(只能添加唯一约束和主键约束)
alter table 表名 drop constraint 约束索引名;- 删除指定约束

ALTER TABLE tb_student add constraint unique_colid UNIQUE(cid);
ALTER TABLE tb_student DROP INDEX unique_colid;

 添加外键约束

alter table 表名 add constraint 约束索引名 foreign key(字段1) references 表2(字段2);
给表1中的字段1添加外键约束,并且字段1的值以来表2的字段2:注意字段1和字段2不能同名

ALTER TABLE tb_student ADD CONSTRAINT fk_col_stu FOREIGN KEY(cid) REFERENCES tb_college(collid);

ALTER TABLE tb_teacher ADD COLUMN cid int COMMENT '所在学院';
ALTER TABLE tb_teacher ADD CONSTRAINT fk_col_tea FOREIGN KEY(cid) REFERENCES tb_college(collid);

ALTER TABLE tb_course ADD COLUMN tid int COMMENT '所属老师';
ALTER TABLE tb_course add CONSTRAINT fk_tea_cou FOREIGN KEY(tid) REFERENCES tb_teacher(teaid);

4 删除外键约束

alter table 表名 drop foreign key 外键索引;

5 多对多关系的外键约束

CREATE TABLE if not EXISTS tb_record
(
reid int auto_increment,
sid int COMMENT '学生外键',
cid int COMMENT '课程外键',
redate date comment '选课日期',
score FLOAT comment '分数',
PRIMARY KEY(reid),
foreign key(sid) references tb_student(stuid),
FOREIGN KEY(cid) REFERENCES tb_course(couid)
);

高级查询

去重

select distinct 字段名 from 表名;

SELECT distinct redate FROM tb_record ORDER BY redate DESC;
SELECT DISTINCT sid FROM tb_record;

限制和分页

  • 限制:SELECT * FROM 表名 LIMIT N; - 查询时只获取前N条的数据
 SELECT * FROM 表名 limit M offset N;  -  跳过前N条数据,获取M条数据(从N+1条数去开始,获取M条数据)
 SELECT * FROM 表名 limit M,N;         -  跳过前M条数据,获取N条数据(从M+1条数去开始,获取N条数据)

SELECT * FROM tb_record LIMIT 5;  -- 获取前5条数数据
SELECT * FROM tb_record LIMIT 7 OFFSET 3;  -- 跳过前3条,获取7条数据
SELECT * FROM tb_record LIMIT 3,7;
SELECT distinct score FROM tb_record ORDER BY score DESC LIMIT 3;  -- 获取成绩前3的记录

聚合

  • max(),min,sum(),avg(),count(),若某一个记录为空,那么这条记录不参与运算 - mysql
SELECT MAX(score) FROM tb_record

分组

  • 注意:分组后,除了分组字段以外,其他字段只能进行聚合操作
  • 在分组后如果加条件,需要用having代替where
select 聚合操作 from 表名 group by(字段); 

SELECT sid,avg(score) FROM tb_record GROUP BY(sid);  -- 获取每个学生的平均分
SELECT cid,AVG(score) FROM tb_record GROUP BY(cid);  -- 获取每个学科的平均分
SELECT sid,COUNT(cid) FROM tb_record GROUP BY(sid);  -- 获取每个学生选课数量

子查询

  • 将一个查询的结果作为另外一个查询的条件或者查询对象
     第一种子查询:将查询的结果作为另外一个查询的条件
获取成绩是最高分的所有的学生的id

SELECT sid,score from tb_record where score=(SELECT MAX(score) FROM tb_record);

获取所有选了两门课以上的学生id
SELECT sid FROM tb_record GROUP BY(sid) HAVING COUNT(cid)>2;

获取所有选了两门课以上的学生id
SELECT stuname FROM tb_student WHERE stuid in (SELECT sid FROM tb_record GROUP BY(sid) HAVING COUNT(cid)>2);
  • 第二种子查询:将一个查询的结果作为另一个查询的查询对象
     注意:如果要将查询结果作为查询对象,那么查询结果对应的查询必须重命名
SELECT stuname FROM (SELECT * FROM tb_student LIMIT 3,5) as t1 WHERE stusex=1;

SELECT sname,saddr FROM(SELECT stuname as sname,stuaddr as saddr FROM tb_student WHERE stusex=0) as t1 WHERE saddr='四川成都';

连表查询/连接查询

  • 注意:如果既有连接条件,又有查询条件,查询条件必须放在连接条件的后面
  • 同时查多张表的数据
    SELECT 字段 FROM 表名1, 表名2, 表名3... WHERE 连接条件 查询条件;
# 查询所有学生的名字和学院名称
SELECT stuname,collname FROM tb_student,tb_college WHERE tb_student.cid=tb_college.collid;

 查询每个学生的每个学科的成绩
SELECT stuname,couname,score FROM tb_student,tb_course,tb_record WHERE tb_record.cid=tb_course.couid and tb_student.stuid=tb_record.sid and score>70;

内连接

  • 注意:如果不写连接条件,最后会形成笛卡尔积现象;在方法二中,中间表必须放在前面
写法1:select * from 表1,表2,表3... where 连接条件 查询条件;
写法2: select * from 表1 inner join 表2 on 表2连接条件 inner join 表3 on 表3连接条件... where 查询条件;

外连接

  • 在mysql中外连接只支持左外连接(left join)和右外连接(right join)
表1 left join 表2;  - 先将表1中的记录全部取出来,按连接条件去依次来连接表2中的记录。
如果表1中的记录找不到满足连接条件的表2记录,那么连接的内容就是空

表1 right join 表2;  - 先将表2中的记录全部取出来,按连接条件去依次来连接表1中的记录。
如果表2中的记录找不到满足连接条件的表1记录,那么连接的内容就是空

redis数据库

基本命令的整合

redis-cli -p         端口 -h ip地址
netstat -ntlp       查看当前运行的端口
redis-server    启动redis服务器
命令 &            将命令放到后台运行
jobs              查看后台运行的命令
fg %编号          把后台运行的命令放到前台运行
bg %编号      将的命令放到后台运行
Ctrl+z            将前台命令暂停并放到后台

Redis基本命令

save    保存
bgsave  后台保存(适用于数据量过大)
flushdb     清空当前所在的数据库
flushall    清空所有数据库的数据
select N    切换数据库(默认开启16个数据库)
shutdown nosave/save    关闭Redis服务器(默认nosave)
Redis的核心数据

1.字符串

set key value   添加键值对
mset key1 value1 key2 value2    添加多组键值对

get key     通过键查看值
mget key1 key2  查看多个键对应的值

strlen key      获取字符串的长度
append key value    给字符串追加内容

incr key    值加1
incrby key value    值加上value
decr key    值减1
decrby key value    值减去value

getrange key start end      获取字符串指定范围内的子串
setrange key offset value       修改字符串指定位置的内容    

2.哈希(表) - hash

  • hash就相当于python里面的字典
hset key field value    添加hash类型键值对
hmset key filed1 value1 filed2 value2   添加多组hash类型键值对
hget key filed      查看hash类型字段对应的值
hmget key filed1 filed2     获取hash类型多个字段对应的值
hgetall key     获取hash类型所有的字段和对应的值
hkeys key       获取hash类型所有的字段
kvals key       获取hash类型所有的字段对应的值
hexists key filed   判断hash类型某个字段是否存在

type key    查看键对应的数据类型

3.列表

lpush key value1 value2 value3 ...  往左边添加元素
rpush key value1 value2 value3 ...  往右边添加元素

lindex key index    根据下标查看元素
lrange key start end    查看列表指定范围的元素

llen key    查看列表元素的个数

lpop key    从左边移除一个元素
rpop key    从右边移除一个元素
lrem key N value    从列表删除N个value

4.集合 - set

sadd key value1 value2 value3   添加元素
srem key value  删除元素
spop key    获取随机元素
scard key   查看元素个数
smembers key    查看所有元素
sismember key value     查看集合中是否存在指定元素
sinter key1 key2    求交集
sunion key1 key2    求并集
sdiff key1 key2     求差集

5.有序集合 - zset

zadd key score1 mem1 score2 mem2 ...    添加元素
zrem key mem    删除元素
zrange key start end    按score升序查看元素
zrevrange key start end     按score降序查看元素
zscore key mem  查看元素对应的score
zincrby key score mem   修改元素的score值
zcard key   查看集合长度
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,171评论 0 9
  • 1.MySQL数据库 2.SQL语句 第一节课 ###1(MySQL数据库)数据库概念.avi 5...
    码了个农啵阅读 1,194评论 1 16
  • 一、数据库概述 什么是数据库数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户...
    圣贤与无赖阅读 3,847评论 0 4
  • 第一节:数据库入门 数据库系统架构图: 数据库: 数据库 提供 了 一个 存储 空间 用来 存储 各种 数据, 可...
    White_Li阅读 364评论 0 0
  • 醉里卧雪浊宵霜,不觉凉,觅花藏。抱月凌风,可笑我痴狂。本知此生应不念,还笑我,愁满觞。 当年春深誓化琅,却茫茫,千...
    欢令阅读 271评论 0 2