一、 sql简介
数据的存储用open打开文件,用read和write写文件
但是文件不利于扩展。用文件记录交易数据不好统计
所以用数据库来存储,读写速度高,修改查找特别快速。
用数据库可以存上百万条也改的快,将来数据库在程序里时政是怎么样呢?持久化存储(不会因为关机就关了)数据库存储在硬盘上,但是要想把东西存储在硬盘上必须是文件。所以数据库是一种特殊的文件。
我怎么知道数据库的文件在哪里存着呢?
/var/lib/mysql
进入到里边可以看到他以文件的形式存储,所以数据库是一个特殊的文件。那怎么操作?
不可以用特殊vim打开,如果不小心改了,那可能打不开。那怎么用文件呢?可知文件用特殊的手段抽象成一个表。可以查看到类似表的数据结构就可以
python数据库库中把列称之为字段,行称之为记录
id1.2.3.4称之为主键可以唯一标记某个字段就是主键(不重复唯一标记)
mysql是关系型数据库
关系型数据库就是两张表有关联
RDMS是一种程序的简称,后面的阶段会用到xxx?
mongoDB是非关系型数据库
rdms自己改可是怎么自己改?源码又不会,所以做成c/s架构。一套软件叫mysql,mysql’自己生成的文件叫做数据库,浏览器和服务器用gttp协议,将来rdbms与服务器通信是用sql语句,可以操作很多种数据库管理系统。
sql是来操作rebms(关系型管理数据库系统)完成增删改查,我们需要学习语言操作数据库管理系统。sql语句特点不区分大小写,支持很多种数据库。
sql语句主要分为:
DQL:数据查询
DML:数据操作
TPL
DCL
其他会简单应用,MYSQL数据库,sun公司是斯坦福大学网络小组的简称。是在做不出来就买了mysql大力发展,很多人都不用oracle了,oracle后来把mysql买了。oracle收费。mysql是开源而且可移植性的。是有c和c++写的。sql数据库引擎 mylsam和innodb
区别innodb支持事务以及行级锁
行级锁:同一时刻修改一行代码的时候很多程序一起修改,谁先抢到这一行谁上锁。
一般数据库引擎都是innodb
二、 sql的安装
更新源更改,如果不是ubantu那么
apt-get install mysql-server
想要查进程则使用ps命令
ps -aux显示很多
ps -aux |grep “mysql”
搜索东西
类型
python里边没有枚举类型:(把可能出现的结果列举出来)
text类型存超过4000字的文字,适合新闻网站
在数据库中图片和影片这种类型的时候不会存储在数据库。而是存储在服务器的路径,可以使用七牛这个免费内存得软件。图片不允许存储在数据库中
约束
约束:default默认 非空not full 唯一 unique 外键存储别的表的主键。同时外键有一个约束,外键必须在另一个表存在。但是外键不是越多越好。
通过这些保证数据稳定可靠
连接数据库
mysql -uroot -p
退出
exit/quit/
查看所有的数据库表
show databases;
使用datagrip连接数据库步骤
确定好端口和驱动后测试数据库是否可以成功连接
连接成功后点应用,完成后的界面如上图,右边为console输入命令
sql语句命令
一、简单语句
查看版本
select version();
查看现在时间
select now();
查看所有数据库
show databases ;
创建数据库
create database 数据库名字;
删除数据库
drop database 新的数据库;
注意:在创建数据库的设置新数据库名字的时候如果数据库名字有-的话得在数据库名字中加入两个丿
create database new-04
;
查看当前使用的数据库
select database();
切换数据库
use 数据库名字;
查看数据库中所有的表
show tables ;
创建表
create table newtable(
id int,
name varchar(30)
);
展示表的结构
desc newtable;
插入语句
insert into students values(0,"郭高高",22,178.4,"女",0);
添加一个字段
alter table students add birthday datetime;
修改一个字段
alter table students modify birthday date;
alter table students change birthday birth date default 19990108;
删除字段
alter table students drop high;
删除数据库中的数据表名
drop table yyyy;
修改全部修改个和按照id修改
update students set gender=1 ;
update students set gender=1 where id = 12;
查询
select * from students where id=2;
select name as 姓名,gender as 性别 from students where id >3;
物理删除
delete from students;
delete from students where name="坚强生活小韩";
逻辑删除
alter table students add is_delete bit default 1;
update students set is_delete=1 where name="休杰克曼"
`查询的语句里有去重,以下代码加入distinct的时候结果只会有不重复的男女和其他而不是所有结果都有
elect distinct gender from students;
二、查询语句
接下来仔细讲解查询语句
查询分为逻辑查询、模糊查询、范围查询。
1. 模糊查询
like
- %替换1个或者多个
- _替换1个
例子:查询姓名中以"小"开始的名字
select name from students where name like "小%"
查询姓名中有小的所有名字
select name from students name like "%小%"
查询有两个字的名字
select name from students name like "__"
查询有三个字的名字
select name from students name like "___"
查询至少有两个字的名字
select name from students name like "__%"
rlike 正则
名字以周开头
select name from students name rlike "^周.*"
名字以周开头以伦结尾
select name from students name rlike "^周.*伦$"
2. 范围查询
in
查询年龄分别为19,29,39,49的人
select name from students age in(18,29,39,49)
not in
查询年龄不为19,29,39,49的人
select name from students age not in(18,29,39,49)
between and
年龄在19到39之间的信息
select * from students where age between 18 and 39
not between and
年龄不在10到30之间的信息
三、排序
年龄设定从小到大
select * from students where
( gender = 2 and age >18) order by age asc ;
从大到小
select * from students where
(gender = 2 and age >18) order by age desc ;
注意加括号
注意:如果排序因素相同的时候会按照主键大小来排相同因素
四、聚合函数
count
select count(*) as 女性人数 from students where gender=1
max
min
avg平均值
round四舍五入
计算所有人的平均年龄,并且保留两位小数
select round(sun(age)/count(*),2)from studesnts
五、分组
分组和聚合搭配用
select gender count(*) from student group by gender
分组想要看组里都有谁’
select gender,gropu_concat(name) from students group by gender
having:和group搭配使用筛选条件
五、分页
limit 限制查询出来的数据个数
select * from students limit 5
同时limit有两个参数 start 和count
*公式:limit (第n页-1)每个的个数,每页的页数
select * from students limit 0,5 # 意味着从0开始查询一共五个
select * from students limit 5,5
select * from students limit 10,5
# 以上代码完成分页,一页五个
六、连接查询
这次有跨表操作
select * from students inner join classes on students.cls_id = classes.id
但是两个表中id有重复,所以去掉第二个表的id 代码如下
selecstudent.* ,classes.name from students inner join classes on students.cls_id = classes.id
结果如下
和group比起来 limit在最后
内连接
select c.name,s.* from students as s inner join classes as c on s.cls_id=c.id order by c.name,s.id;
左连接
select c.name,s.* from students as s left join classes as c on s.cls_id=c.id order by c.name,s.id;
右连接
select c.name,s.* from students as s right join classes as c on s.cls_id=c.id order by c.name,s.id;
七、自关联
自关联一般用在省市县,公司之间人员从属关系
七、子查询
查询身高最高的信息嵌套查询
select * from students where height =(select max(height) from students);
八、数据库设计
设计数据库有一些规范,为范式
第一范式:不能在拆分
第二范式:必须有主键,主键可以有多个字段组成,字段直接依赖于所有主键
第三范式: 在第二范式的基础上不存在传递依赖
ER模型