30天Python基础(数据库)

⼀、数据库基本概念
数据库是存放数据的仓库。它的存储空间很⼤,可以存放百万条、千万条、上亿条
数据。但是数据库并不是随意地将数据进⾏存放,是有⼀定的规则的,否则查询的
效率会很低。
常⻅的数据库:

  • Oracle - ⽬前世界上使⽤最为⼴泛的数据库管理系统,作为⼀个通⽤的数据库
    系统,它具有完整的数据管理功能;作为⼀个关系数据库,它是⼀个完备关系
    的产品;作为分布式数据库,它实现了分布式处理的功能。在Oracle最新的
    12c版本中,还引⼊了多承租⽅架构,使⽤该架构可轻松部署和管理数据库
    云。
  • DB2 - IBM公司开发的、主要运⾏于Unix(包括IBM⾃家的AIX)、Linux、以
    及Windows服务器版等系统的关系数据库产品。DB2历史悠久且被认为是最早
    使⽤SQL的数据库产品,它拥有较为强⼤的商业智能功能。
  • SQL Server - 由Microsoft开发和推⼴的关系型数据库产品,最初适⽤于中⼩
    企业的数据管理,但是近年来它的应⽤范围有所扩展,部分⼤企业甚⾄是跨国
    公司也开始基于它来构建⾃⼰的数据管理系统。
  • MySQL - MySQL是开放源代码的,任何⼈都可以在GPL(General Public
    License)的许可下下载并根据个性化的需要对其进⾏修改。MySQL因为其速
    度、可靠性和适应性⽽备受关注。
  • PostgreSQL - 在BSD许可证下发⾏的开放源代码的关系数据库产品。

MySQL简介
MySQL最早是由瑞典的MySQL AB公司开发的⼀个开放源码的关系数据库管理系
统,该公司于2008年被昇阳微系统公司(Sun Microsystems)收购。在2009年,
甲⻣⽂公司(Oracle)收购昇阳微系统公司,因此在这之后MySQL成为了Oracle
旗下产品。
MySQL在过去由于性能⾼、成本低、可靠性好,已经成为最流⾏的开源数据库,
因此被⼴泛地应⽤于中⼩型⽹站开发。随着MySQL的不断成熟,它也逐渐被应⽤
于更多⼤规模⽹站和应⽤,⽐如维基百科、⾕歌(Google)、脸书
(Facebook)、淘宝⽹等⽹站都使⽤了MySQL来提供数据持久化服务。

甲⻣⽂公司收购后昇阳微系统公司,⼤幅调涨MySQL商业版的售价,且甲⻣⽂公
司不再⽀持另⼀个⾃由软件项⽬OpenSolaris的发展,因此导致⾃由软件社区对于
Oracle是否还会持续⽀持MySQL社区版(MySQL的各个发⾏版本中唯⼀免费的版
本)有所担忧,MySQL的创始⼈⻨克尔·维德纽斯以MySQL为基础,成⽴分⽀计
划MariaDB(以他⼥⼉的名字命名的数据库)。有许多原来使⽤MySQL数据库的
公司(例如:维基百科)已经陆续完成了从MySQL数据库到MariaDB数据库的迁

  • mysql的安装(linux)
sudo apt-get install -y mysql-server mysql-client
#⾸次安装MySQL,可以使⽤下⾯的命令来找到默认的初始密码。
cat /var/log/mysqld.log | grep password

在实际开发中,为了⽅便⽤户操作,可以选择图形化的客户端⼯具来连接MySQL
服务器,包括:
MySQL Workbench(官⽅提供的⼯具)
Navicat for MySQL(界⾯简单优雅,功能直观强⼤)
SQLyog for MySQL(强⼤的MySQL数据库管理员⼯具)
⼆、SQL
基本可分为:
数据定义语⾔DDL (create、drop)
数据操作语⾔DML(insert、delete、update)
数据查询语⾔DQL(select、where、group by、order by 、limit)
数据控制语⾔DCL(grant、revoke)
事务处理语⾔TPL(commit、rolback)
三、操作数据库

  • 连接mysql数据库的命令
命令:
 mysql -h服务器地址 -u⽤户名 -p #不要再p后⾯直接跟密码
 
如果要远程连接mysql数据库,需要以下步骤:
1.通过mysql -u⽤户名 -p登录mysql数据库
2.创建⼀个新⽤户来远程连接
 create user 'python'@'%' identified by '123'
 GRANT ALL PRIVILEGES ON *.* TO 'python'@'%' IDENTIFIED BY
'123' WITH GRANT OPTION;
3.执⾏命令:flush privileges;
4.退出mysql,到/etc/mysql/mysql.conf.d下,编辑mysqld.cnf
 找到 “bind-address = 127.0.0.1, 这⼀⾏要注释掉,只需在前⾯加个
#
5.重启mysql服务
 sudo service mysql restart | start | stop #重启、启动、停⽌
 或者:sudo /etc/init.d/mysql restart | start | stop
6.如果开启了防⽕墙,请添加3306端⼝
 sudo ufw allow 3306
 
#忘记mysql密码:
1./etc/mysql/mysqld.conf.d/,编辑mysqld.conf
sudo vim mysqld.conf
2.[mysqld]下
添加:skip-grant-tables
保存退出
3.重启mysql服务:
 sudo service mysql restart | stop | start
  • 数据库操作命令
#1.查看库
 show databases;
#2. 创建库
 create database 数据库名 default charset=utf8;# 数据库名不要纯数
字,不要⽤汉字
#3. 删除库
 drop database 数据库名;
#4. 选中库
 use 数据库名;
#5. 查看表
 show tables;
#6.查看数据库创建语句
show create database 数据库名
#7.查看选中的数据库
select database()
#8 修改数据库字符集
alter database student default charset=utf8;
  • 注意
    每条命令结束必须使⽤; 或者 \g 结束
    退出mysql使⽤命令quit或exit
    四、数据库表
  • 创建表
create table [if not exists] 表名(
 列名1 类型 [限制],
 列名2 类型 [限制],
 ...
 列名n 类型 [限制] #最后⼀列没有逗号
) [engine=myisam | innodb][ default charset=utf8];
primary key 主键 不允许有重复值,不允许为空
auto_increment ⾃增⻓,只对int型主键起作⽤
#复合主键
mysql> create table grade(
 sid int ,
 cid int,
 score float,
 primary key(sid,cid));
  • 删除表
drop table 表名;
  • 复制表结构
create table 表名 like 其他表名
  • 查看表结构
desc 表名;
  • 查看建表语句
show create table 表名;
  • 修改表
#修改字段类型
 alter table 表名 modify 字段名 类型 [限制] #增加字段
 alter table 表名 add [column] 字段名 类型 [限制];
#删除字段
 alter table 表名 drop [column] 字段名;
修改字段名和类型
 alter table 表名 change [column] 旧字段名 新字段名 类型 [限制];
 
#修改表名
 alter table 表名 rename 新表名
 alter table 表名 [engine=myisam] [default charset=utf8];
 
 # 可以通过first、after指定插⼊位置
 alter table student add sno varchar(3) not null after sid; //在
sid列后插⼊
 alter table student add sid int primary key auto_increment
first;//在第⼀列插⼊
  • 字段限制
primary key 不允许空值,唯⼀
not null ⾮空
unique 唯⼀
default 缺省,默认值

五、数据类型

  • 数值型
    整型 能⽤整型尽量使⽤整型。包括int、smallint tinyint
    int(3) 或者 tinyint(2) :3或者2不会去限制你所存储数据的⻓度 ,只有在配
    合zerofill 零填充的时候 才有意义
    浮点数 double 、decimal

30天Python基础(数据库)_第1张图片

  • 字符型
    30天Python基础(数据库)_第2张图片
    (1) char 和 varchar 的区别:
    char的执⾏效率⾼于varchar ,varchar 相对于 char 节省存储空间
    如果使⽤char 传⼊的数据的⻓度 ⼩于指定的⻓度的时候 存储的实际⻓度
    不够的会拿空格来填充
    如果使⽤ varchar 传⼊的数据的⻓度 ⼩于指定的⻓度的时候 存储的实际
    ⻓度 为传进来的数据的⻓度
  • ⽇期时间型
    30天Python基础(数据库)_第3张图片
  • 枚举enum
#是⾃定义类型,可以多选⼀,实际上存的值是1,2,3...
alter table user add sex enum('男','⼥') default '男';
insert into user(name,password,sex)
values('tom','132','男');
values('tom','132',1);
  • 集合set
类似复选框,可以存多个值
alter table student add hobby set('看电影','玩游戏','敲代码','烫 头')
insert into users(uid,hobby) values(22,1+2+4+8)
insert into users(uid,hobby) values(22,1|2|4|8)
insert into users(uid,hobby) values(22,'看电影,玩游戏,敲代码')
0001
0010
-------
0011

六、数据操作
1. insert

写法⼀:insert into 表名(字段1,字段2...) values(1,2...);
省略了字段列表,则按照建表时的字段顺序进⾏插⼊,每⼀列都要给值
写法⼆:insert into 表名 values(1,2...);
写法三:插⼊多个记录
 insert into 表名(字段1,字段2...)
 values(1,2...),
 (1,2...),
 (1,2...)....
写法四: insert into 表名(name,age,sex)
 select name,age,sex from stars;
 
 insert into histroy_student select * from student;

2.update

 update 表名 set 字段1=1,字段2=2... where 条件 #不加where修改的是所
有的记录

3. delete

删除表中的数据,⾃增主键的值不会重新开始
delete from 表名 where 条件;#如果不加条件,会删除表中所有数据,慎重使⽤
alter table 表名 auto_increment = 5 # 设置⾃增主键开始值
清空表,⾃增主键的值重新开始编号
truncate
 truncate table 表名,清空表中所有记录,等价于delete from 表名;
 delete和truncate差别,truncate后,表中⾃增主键值从1开始

七、数据查询
基本结构: select 字段名列表 from 表名
1 基础查询

select username,password from user;
select usernname as ⽤户名, password as 密码 from user; #可以给字段起
别名
select * from user; #查询所有字段,慎⽤,⼀般不建议使⽤,会导致⽆法优化
sql语句
select 2018,username,password from user; #可以有常量,表达式
select sname,2018-year(sbirthday) from student; #year是mysql的内置函数
select distinct username from user; #去除重复记录 distinct 针对查询结
果去除重复记录,不针对字段

2 条件查询(where)
关系运算
关系运算符:> 、 >=、 <、 <=、 =、!=、<>、 between and

select username,password from user where uid <10
select username,password from user where uid != 10
select username,password from user where uid between 10 and 20

逻辑运算
逻辑运算符:and 、or、not

select username,password from user where uid < 100 and uid > 20;
select username,password from user where uid > 100 or uid < 20;

集合运算
集合运算符:in、not in

select username,password form user where uid in (2,3,4)
select username,password form user where uid not in (2,3,4)

判空
判空运算:is null、is not null

select username,password from user where username is null

字符串的模糊查询(like)
通配符 _代表⼀个字符,%代表任意⻓度字符串

select * from user where username like '王_';
select * from user where username like '王%';

3. 排序(order by)
asc 升序(默认)、desc 降序、

select * from user order by age asc;
select * from user order by age desc;
多字段排序
 select name,age from php_user_history order by age desc,name;#
如果在第⼀列上有相同的值,在具有相同的age的记录上再按name升序排列

4.限制结果集(limit)
limit n #取前n条记录
limit offset,n #从第offset条开始取,取n条

select * from php_user_history limit 3;
select * from php_user_history limit 4,2;
注意结果集中记录从0开始数数,offset相对于0开始
实现分⻚必须的技术点
limit (page-1)*num,num

5.集合函数
count统计结果集中记录数
max 最⼤值
min 最⼩值
avg 平均值,只针对数值类型统计
sum 求和,只针对数值类型统计
注意,集合函数不能直接使⽤在where后⾯的条件⾥,但可以在⼦查询中

select count(*) num from user;
select count(distinct age) num from user; //去除重复记录
select * from student where sno = max(sno);//错误

6.分组(group by)
将结果集分组统计,规则:

  • 出现了groub by的查询语句,select后⾯的字段只能是集合函数和group by后
    ⾯有的字段,不要跟其它字段
  • 对分组进⾏过滤,可以使⽤having
select uid, count(*) num from php_forum group by uid;
select uid,title, count(*) num from forum group by uid having
count(*) >=2;
having和where的区别:
 where针对原始表进⾏过滤
 having 是针对分组进⾏过滤

查询⼩结

  • 整体顺序不能颠倒
  • []表示可选,可以有也可以没有
    select 字段 from 表名 [where 条件][group by ] [having][order by ] [limit]
    ⼋ 字符集和存储引擎
  • 修改字符集
    为了能够正常显示中⽂,必须把数据库的字符集设置为utf8
mysql> show variables like 'character%'; #查看字符集
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |需要修改
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |需要修改
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)
修改mysql的配置⽂件
cd /etc/mysql/mysql.conf.d
sudo cp mysql.cnf mysql.cnf.bak
sudo vim mysql.cnf
在[mysqld]下增加⼀句:
character_set_server = utf8
保存并重启服务
sudo systemctl restart mysql.service #重启服务
  • 数据库引擎
    可以使⽤show engines命令查看数据库引擎
show engines \G

下⾯的表格对MySQL⼏种常⽤的数据引擎进⾏了简单的对⽐。
30天Python基础(数据库)_第4张图片
通过上⾯的⽐较我们可以了解到,InnoDB是唯⼀能够⽀持外键、事务以及⾏
锁的存储引擎,所以我们之前说它更适合互联⽹应⽤,⽽且它也是较新的
MySQL版本中默认使⽤的存储引擎

  • myisam和innodb的区别
    myisam查询速度快,不⽀持事务、不⽀持外键、⽀持表锁
    innodb增删改效率⾼,⽀持事务、⽀持外键,⽀持⾏锁

你可能感兴趣的:(学习专栏)