段志伟 发表于 2021-8-15 21:26:05

数据库汇总

1、什么是数据库?
是存放数据的电子仓库。以某种方式存储百万条,上亿条数
据,供多个用户访问共享。

数据库如何保存数据?
每个数据库的数据都是通过一个或多个api用于创建、访问、管理、复制保存数据
系统中有很多动态的数据存在数据库中,需要通过访问数据库才能显示。

数据库的原理?
客户端查询,修改,删除,添加操作,通过sql语句对数据库服务器进行操作
然后将数据展示在客户端

数据库分:(关系型数据库)和(非关系型数据库)

什么是关系型数据库?
依据关系模型创建的数据库,把数据保存在不同的表中,表与表存在着
某些关系。
如:db2、oracle、mysql

什么是非关系型数据库?
非关系型数据库也叫nosql数据库,全称not only sql。通常数据以对象
的形式存储在数据库中,不固定结构,例如列模型,键值对模型。
如:redis(键值对),hbase(列模型),mongodo(文档类模型)

========================================

关系型数据库特点
1.安全
2.保持数据的一致性
3.实现对表与表进行复杂的数据查询
非关系型数据库特点
1.效率高
2.容易扩展
3.使用更加灵活
=================================

认识 mysql
mysql是指mysql数据库管理系统 术语关系型数据库
瑞典公司mysql      db开发的oracle收购的
mysql是一种关系型数据库将数据保存在不同的表汇总,而不是将所有的数据放在一个大仓库增加了速度和灵活性
mysql数据库是目前web端应用最广泛的,也是bs架构常用的数据库

mysql优点:
1、开源、免费
2、体积小、安装简单、维护成本低
3、支持多系统
4、支持多语言:python、java、php、c++
5、支持多种引擎
6、与其他工具组合可以搭建免费的网站系统
      lamp=linux+apache+mysql+php
       lnmp=linux+nginx+mysql+php

mysql应用架构:
单点数据,适用于小规模应用;(学的)
复制,适用与中小规模应用
集群,适合大规模应用
(mgr集群,三主三从,一主三从)

数据库术语:
行、列、数据、表、冗余(多余)、单表、多表、临时表、试图、索引、主键、外键

新建数据库与进入数据库

登录linux系统
改为管理员用户
yum修改为阿里镜像源
第一步:修改yum镜像配置文件:
sed -i "s|enabled=1|enabled=0|g" /etc/yum/pluginconf.d/fastestmirror.conf
第二步:将系统自带的repo文件改名
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
第三步:将阿里镜像源的文件内容写入新的repo文件中(会自动创建一个新得repo文件)
curl -o /etc/yum.repos.d/CentOS-Base.repo https://www.xmpan.com/Centos-6-Vault-Aliyun.repo
第四步:清除缓存(两个命令)
yum clean all
rm -rf /var/cache/yum
第五步:生成新的yum缓存文件
yum makecache
第六步:安装工具
yum install lrzsz

linux安装mysql

rpm -qa|grepmysql查询linux中的数据库
yumremove    服务名称   删除linux中的数据库指定的包
yumremovemysql*    删除linux中所有的数据库包
yum   erase   数据库包   删除linux中的数据库
rpm-e --nodeps   数据包   删除linux中的数据库

yuminstall   mysql   安装数据库客户端
yuminstall   mysql-server   安装数据库服务端

安装好后
servicemysqld   stop关闭数据库服务
servicemysqld   start开启数据库服务
servicemysqld   restart重启数据库服务
servicemysqld   status查看服务器状态
mysqladmin-uroot    password   ‘123456’   设置登录密码
mysql-u root -p   进入mysql操作界面

show databases                         显示所有的数据库
create database   库名               创建数据库
drop   database   库名               删除数据库
use库名               使用库
showtables   显示库里面所有的表
create table 表名(字段1字符类型1(字符长度1),字段1字符类型1(字符长度1))   建表语句
grantallprivilegeson*.* toroot@"%" identifiedby "123456";    授权
flushprivileges ;刷新权限

第三方工具连接数据库检查:
(1)防火墙关闭   serviceiptablesstop
(2)数据库服务是否启动:service    mysqldstart
(3)连接ip地址是否正确
(4)账号和密码是否正确
(5)是否设置权限,并刷新

建表
步骤:
第一步 :新建一个库 createdatabses库名 ;
第二步:use 库名    库(linux界面)或点击选择navicat中一个库
第三步:建createtable 表名(字段名1   字符类型1(字符长度1),字段名2字符类型2(字符长度2))
第四步:insertinto   插入数据
==============================================================
知识点:
一个汉字 占多少长度和编码有关(utf-8,gbk)

utf-8:一个汉字=3个字节
gbk:一个汉字=2个字节
认识字符类型:
int数值类型
char   或varchar字符类型
float    浮点型数据类型
data      时间类型
数值格式:
int   整数    2的负31次方~2的31次方   字节4
bigint      超大整数          字节:8
loat      浮点型数据   字节 :4

字符类型:
char   固定长度的字符串    最大字符255
varchar   具有最大限制的可变长量         最大65535 字符

时间格式类型:
date   yyyy--mmmm--dddd         格式的日期    字节3
time    hh:mm:ss   格式的时间    字节3
datetime   日期+时间    字节:8
year    年    字节1

=========================================
建表:
建表语句:
createtable表名(字 段名1字符类型1(字符长度),字段名2   字符类型2(字符长度),字段名3字符类型3(字符长度))defaultcharset=utf8 ;
defaultcharset=utf8 ;默认编码格式,当插入中文数值显示???解决
案例:createtablehz10(idint(10),name char(20),ageint(10))defaultcharset=utf8 ;
desc   表名    查看结构 ;
建表约束:
表中的限制条件
作用:表在的时候加入约束的目的是为了保证表中的记录完整和有效。
(1)非空约束    (not   null)   非空,用于保证字段的值不能为空,
(2)唯一约束(unique)         保证字段值具有唯一性(不能重复),可以为空,唯一约束可以有多个
(3)主键约束(primarykey) 保证字段值具有唯一性(不能重复),不能为空 ,一个表中只有一个主键
(4)外键约束 (forrignkey) 两个表之间的主键建立关系
(5)默认 :(default)          当字段不填数据,默认数据
(6)自增长 :auto _increment    当添加一条数据,自动增长+1

(1)与主键约束一起使用,一般针对id
(3)每插入一条数据,指定的字段值+1

drop   table   表名   删除表 ;
例如:DROP   table   aa;
表字段:
添加字段:add
格式:altertable   表名add 字段名 字符类型(字符长度);
altertable   hz10addfs int(10);
修改字段:change
格式:altertable   表名   change原字段名    新字段名   字符类型(字符长度);
altertable   hz10changefstz int(10);
删除字段:drop
格式:altertable表名   drop 字段名 ;
altertable   hz10 drop tz ;
重命名:rename
格式:altertable原表名 rename 新表名;
altertable   hz10 rename hzdcs10 ;
调换字段顺序:modify      after      在......后面
格式:altertable   表名 MODIFY移动的字段名   字段类型(字符长度)after   字段名 ;
altertable   hzdcs10 MODIFYage int(10)after id ;
将字段添加到首行:
格式:altertable 表名 add字段名 字符类型(字符长度)      first ;
altertable   hzdcs10 addnoint(10) first ;
将字段添加到指定字段的后面:
格式:altertable   表名   add新字段名    字符类型(字符长度) AFTER    原表名 ;
altertable   hzdcs10 addtzint(10) AFTER age ;

========================================================
表中插入数据:
(1)表中插入数据:insertinto   表名    values(插入值1,插入值2)   注入:插入的值,只有数值不需要加引号,字符要加上引号
如:INSERTinto hz10 VALUES(1,"文琪",18);
(2)表中插入数据:insertinto   表名 (id)   values(插入值1)   
INSERTinto hz10(id) VALUES(2);

----------------------------------------------------------------------------------------------------

单表语句:
1、查询一个表中所有的数据
select * from表名;
例:select *fromhz10   
注:* 表示所有 每个语句后面加上分号

2、查询表中具体的字段
select字段名1,字段名2   from表名;
例:select   name,age   fromhz10 ;

3、查询表中具体的字段取名(别名是为了查看数据方便)
selectnameas “姓名”,age“年龄”fromhz10;
注:as可以省略不写as表示取别名

4、查询指定内容,用where+条件
select   *from表名where    字段名=字段
例:select*fromempwhere   dept2=101;

where条件使用注意:
比较运算符
1、where +条件(=(等于),!=(不等于),<>(不等),<(小于),>(大于),>=,<=)

and(与)同时满足所有条件
例:select*frromhz10wheretz=多少and   sg=多少;

or(或)有多个条件时满足其中一个

between.......and.............(在什么范围之间)
例:select * from 表名where    表字段   between   值的范围   and   值得范围;

in(在一组数据中匹配)从一组数据中匹配已有数据
select   *   from   表名   where字段名 in(数组数据);

is null(为空)或者 is not nulll (非空)
select*from   表名   where   +字段名+   条件;

多行注释:ctrl+/
取消多行注释:ctrl+shift+/
单行注释:#


排序:
对表中的数据进行排序:orderby      ass 升序(可以省略) desc降序
升序:
格式:select*from   表名   orderby    字段名   asc;

降序:
格式:select*from   表名   orderby    字段名desc;


二次排序:
格式:select*from表名 orderby字段1 desc,字段二asc;


模糊匹配查询 like
%:表示匹配0个字符或多个字符
_:表示一个字符
例:
select* from   empwheredept2 like "1%"#匹配1开头的部门编号数据
select* from   empwheredept2 like "%2%" #匹配的部门包含2编号数据
select* from   empwheredept2 like "%2" #匹配结尾包含2编号数据
select* from   empwheredept2 like "__2" #匹配固定的字符2编号数据

限制查询(limit)后面接两个值
第一个值 表示下标(索引),第二个值是步长
注:一个表的索引是从0开始
格式:select * from 表名limit索引,行数;


分组查询 groupby
groupby和 having组合
案例:
SELECTdept2,max(age) from   empgroupbydept2 ;
group by一般不会单独使用个,通常都是和函数组合使用。
gtoupby 后查询出来的结果,在需要的条件下可以接having
案例:SELECTdept2 ,max(age)ass from   empgroupbydept2 HAVINGs>50 ;
having +条件和where+条件用法一样,但是场景不一样,一般group   by 的后面接having
备注:函数求出以后,需要设置成别名,设置别名的字段,进行语句的操作。
错误案例:
(1)SELECTname,max(age) from   emp
(2)SELECTname,max(age) from   emp GROUP BYdept2
C:\Users\dzw\AppData\Local\YNote\data\qq2CE6E06613DFC0686050CB26675F52A3\1fd1e5b505954973a45d09132767142c\08b7333b5444.png

sql语句函数:
max最大值
案例:SELECTdept2,max(age) from   emp
min最小值
案例:SELECT min(age) from   emp
avg 平均值
案例:SELECT avg(age) from   emp
count统计总数
案例:SELECT count(age) from   emp
sum求和
案例:SELECT sum(age) from   emp
distinct去重
案例:SELECTdistinct(dept2) from   emp
====================================
改:
update    ......set   改
格式:update   表名set   修改的字段名=字段新值   where条件 ;
案例:update   empset   name="成全"wheresid=1789 ;
====================================
删:
delete   删
truncate   快速删除表内数据
drop删除
删除数据速度 :drop>truncate>delete
注意:
1、drop是删除表和数据
2、truncate 删除无法恢复
3、delete删除是可以恢复

delete:
(1)删除表中所有数据
格式:deletefrom表名:
案例:deletefromhz13;
(2)删除表中指定条件的数据
格式: deletefrom表名where条件
案例: deletefromempwhere dept2=103;
(3)快速删除表数据
格式:truncate表名;
案例:truncatehz15 ;
====================================
表取别名:
格式: 表名设置别名,
案例:SELECTs.dept2,s.name from   emp as s ;(把emp表设置成临时表s)
====================================
备份表结构:
格式:createtable新表名 like备份原表名 ;
createtablehz110 likeemp ;

备份数据:
insertinto    新表 有表结构   select   * from   备份表的原表
案例:INSERTinto   hz110select*fromemp ;

备份部分数据:
格式:INSERTinto表名(s字段名1,字段名2)selectsid ,dept2fromemp ;
INSERTinto   hz110110(sid,dept2)selectsid ,dept2fromemp ;

备份表结构和数据:
格式:createtable 表名 as(select* from   备份原表 )
案例:createtablehzdcs110 as(select* from   emp )

---------------------------------------------------------------------------------------------------------------------

多表查询
什么是多表关联查询?
定义:查询数据来源于多张表。

1、内连接(基本内连接与隐藏内连接)
2、左链接(左外链接)
3、右链接(右外链接)
4、全链接(全外链接)
C:\Users\dzw\AppData\Local\YNote\data\qq2CE6E06613DFC0686050CB26675F52A3\18fe4641c70841e7bd36d4ae3d8973fd\7b14216a5220fc5ee4733ee3143afb4.png


1、笛卡尔积查询(了解)
根据两张表想乘得到的结果,包含大量错误结果,通常不会使用
格式:seleect * from 表1,表2;

2、内连接
格式:select * from 表1 inner join 表2 on关联数据=关联数据;
例:select * fromdeptinner join   emp on dept.dept1=emp.dept2;

隐藏内链接:
格式:select * from 表1,表2 where 关联字段=关联字段;

3、左连接
以左表为主(显示完整的左表)右表有关联的数据就显示,没有的数据就以null显示
格式:select * from 表1left join 表2 on关联数据=关联数据;
例:select * fromdept leftjoin   emp on dept.dept1=emp.dept2;

4、右连接
以右表为主(显示完整的右表)左表有关联的数据就显示,没有的数据就以null显示
格式:select * from 表1right join 表2 on关联数据=关联数据;
例:select * fromdept rightjoin   emp on dept.dept1=emp.dept2;

5、左表独有数据
左表中独有的数据显示,(方法,左独有,以右表字段为空查询)
格式:select * from 表1left join 表2 on关联数据=关联数据 where 右表字段 is null;
例:select * fromdept leftjoin   emp on dept.dept1=emp.dept2 wherename is null;

5、右表独有数据
右表中独有的数据显示,(方法,右独有,以左表字段为空查询)
格式:select * from 表1right join 表2 on关联数据=关联数据 where 左表字段 is null;
例:select * fromdept rightjoin   emp on dept.dept1=emp.dept2 wherename is null;

6、左表独有数据+右表独有数据:
union 拼接
左独有 union 右独有

7、全链接
“+”=union
方法一:内连接+左独有+右独有
方法二:左链接+右独有
方法三:右链接+左独有

总结:
普通内连接:select * from 表1 inner join 表2 on表1的关联字段=表2的关联字段;
隐藏内连接:select * from 表1,表2 where 表1的关联字段=表2的关联字段;
左连接:select * from 表1left join 表2 on表1的关联字段=表2的关联字段;
右链接:select * from 表1right join 表2 on表1的关联字段=表2的关联字段;
左独有:select * from 表1left join 表2 on表1的关联字段=表2的关联字段 where 右表字段 is null;
右独有:select * from 表1right join 表2 on表1的关联字段=表2的关联字段 where 左表字段 is null;

-------------------------------------------------------------------------------------------------------------------

三表连接:
方法一:三表隐藏内连接
格式:select*from   表1 , 表2 ,表3   where表1.关联的字段=表3.关联字段and   表2.关联字段=表3.表3字段
select*fromstudent as a , course as b , scasc wherea.stu_no=c.stu_no and b.c_no=c.c_no
方法二:三表普通内连接
格式:
select*from表1 INNER JOIN表3   on   表1.关联的字段=表3.关联字段    inner join 表2on   表2.关联字段=表3.表3字段
select*fromstudent as a INNER JOINscasc on a.stu_no=c.stu_noinner joincourse asbon    b.c_no=c.c_no
方法三:三表普通左连接
格式:select*from表1   left   JOIN表3   on   表1.关联的字段=表3.关联字段    left    join 表2on   表2.关联字段=表3.表3字段
select*fromstudent as a left JOINscasc on a.stu_no=c.stu_noleft joincourse asbon    b.c_no=c.c_no
方法四:三表普通右连接
格式:select*from表1   rightJOIN表3   on   表1.关联的字段=表3.关联字段    right    join 表2on   表2.关联字段=表3.表3字段
select*fromstudent as a   right JOINscasc on a.stu_no=c.stu_noright    joincourse asbon    b.c_no=c.c_no
方五:先合两表,在两表合并成一表与第三个表合并

selects.stu_no ,s.stu_name from ( selecta.stu_no ,stu_name,c_nofromstudent a,sc c wherea.stu_no=c.stu_no )s,courseas bwheres.c_no=b.c_no

============================================
解题思路:
(1)写一个SQL语句,查询选修了“计算机原理”的学生学号和姓名
条件: c_name =“计算机原理”   course表
结果:stu_no , name          student表
方法一:
SELECT   a.stu_no, a.stu_name   from   student a   join sc c on a.stu_no = c.stu_no   join course b on c.c_no = b.c_nowhere    b.c_name = "计算机原理"

(2)写一个SQL语句,查询“小明”同学选修的课程名称
方法一:
SELECT b.c_name FROM student a ,course b , sc cWHERE a.stu_no=c.stu_noand b.c_no=c.c_noand a.stu_name="小明";
方法二:
select c.stu_name,b.c_namefrom sc ajoincoursebon a.c_no = b.c_nojoinstudent3 con a.sc_no = c.stu_nowherec.stu_name = '小明' ;

方法三:

(3)写一个SQL语句,查询选修了5门课程的学生学号和姓名
SELECT a.stu_no,stu_name FROM student a,course b,sc c WHERE a.stu_no=c.stu_no AND c.c_no=b.c_no GROUP BY stu_no HAVING COUNT(c_name)=5;

页: [1]
查看完整版本: 数据库汇总