数据库汇总
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]