mysql基础
MySQL
python2 安装MySQLdb
python3 安装pymysql或者mysql-connector
MySQL:是用于管理数据的一个软件
-服务端软件
-socket服务端
-本地文件操作
-解析指令【SQL语句】
-客户端软件
-socket服务端
-发送指令
-解析指令【SQL语句】
PS:
-DBMS数据库管理系统
-SQL语句
技能:
-安装 服务端和客户端
-连接
-学习SQL语句规则:指示服务端做任意操作
其他类似软件:
关系型数据库:sqllite,db2,oracle,sql server MySQL
非关系型数据库: MongODB,redis
MySQL安装
windows:
可执行文件:exe
按照流程一步步选择。
压缩包:
放置任意目录
初始化:
服务端:安装目录bin\mysqld-initialize-insecure
#用户名:root 密码:空
启动服务端:双击bin下的mysqld.exe
客户端连接:mysql -u root -p
连接成功后可以输入指令:
show databases;
show tables;
环境变量的配置:
将安装路径添加到环境变量
windows服务:
生成服务:
安装路径\bin\mysqld --install
删除服务:
安装路径\bin\mysqld --remove
启动和停止服务:
net start MySQL
net stop MySQL
MySQ连接
mysql -u 用户名 -p
-p:表示该用户需要输入密码,下一行就会弹出一个password:让输入密码,如果用户名没有密码,则可以不写-p回车直接就能登录
也可以用管理工具连接:如navicat
MySQL:SQL语句
新建用户及权限
创建用户
create user "用户名"@"允许在哪些IP上使用" identified by "密码";
create user "gaoyue"@"192.168.31.24" identified by "123456";
PS:
IP地址那可以写%, 表示所有的都可以用
192.168.31.% 表示在192.168.31的网段都可以用。以此类推
授权
权限 人
grant select,insert,update on 数据库名.表名 to "用户名"@"允许在哪些IP上使用"
grant all privileges on 数据库名.表名 to "用户名"@"允许在哪些IP上使用" ----全部权限
revoke all privileges on 数据库名.表名 to "用户名"@"允许在哪些IP上使用" -----删除权限
数据库名.表名:
*表示所有的。如数据库名.* 表示指定数据库下所有的表。同理*.*表示全部的数据库和表。
数据库和表
show databases; 显示数据库名字信息
use 数据库名 : 使用输入的数据库
show tables; 显示选择数据库的表信息
创建数据库和表
create database 数据库名;
create database 数据库名 default charset utf8;设置默认编码为utf8
drop database 数据库名; 删除数据库
create table 表名;
create table 表名(键 类型,键 类型) default charset=utf8; 设置默认编码是UTF8,这样可以输入中文
create table 表名(键 类型 auto_increment primary key,键 类型)engine=innodb default charset=utf8;
auto_increment:表示该键值自增
primary key :表示约束,主键(不能重复且不能为空)
innodb:支持事物,原子性操作 如果两个表在做数据交换,突然断电,为避免数据错误,可以恢复表到还未交换之前的状态
create table t1(
列名 类型 null,可为空
ID int not null,
列名 类型 not null, 不可为空
列名 类型 not null auto_increment primary key,
id int,
name char(10)
)engine=innodb default charset=utf8;
主键和外键和自增
主键
primary key :表示约束,主键(不能重复且不能为空)
一个表中只能有一个主键,但是主键并不是指的是一列,如果要多列组合成一个主键,可以在新的一行
写,primary key (A_id,B_id) 这样A_id 和 B_id 就组合成了一个主键
唯一索引
create table a(
id int primary key,
num int,
xx int,
unique uq1 (num), #num设置成唯一索引
unique up2 (num,xx) #num和xx组成唯一索引,以后2个组合不能完全重复
)
主键:
不能重复且不能为空
索引:
不能重复 能为空
外键
constraint 别名 foreign key ("需要建立外键的键名",) references 外键所在表名('外键值'),
例如现在有2张表。表1是学生表,表中内容有,学生ID,学生姓名,学生班级。表2是班级表,表中内容有。班级ID,班级姓名。
如果学生表中班级都要打中文的话,不仅花费时间,还占用空间,后期维护还不方便,那么我们把学生表中的班级,设置成外键连接到班级表中的ID一行,让这两列相互对应,这样不仅节省空间,后期维护还很方便。所以在学生表中加入。
constraint stu_class foreign key ("class",) references class_one('id'),
给已创建的表添加外键:
alter table 需加外键的表 add constraint 外键名 foreign key(需加外键表的字段名) references 关联表名(关联字段名);
外键名不能重复。
扩展:一对一,多对多。
一对一
例子:
博客园:注册完用户后,还需要开通博客才能拥有博客。
用户表
ID USERNAME PASSWORD
1 高1 123
2 高2 123
3 高3 123
4 高4 123
上述用户表中,只有高2 和 高4 开通了博客表,所以
博客表
ID BOKEURL USER
1 /GAO2/ 2
2 /GAO4/ 4
博客表中的USER和用户表中的ID建立外键关系,并设置唯一unique,这样博客表中最多只能拥有4条数据,实现了一对一的关系。
多对多
例子:
百合相亲网:2张表,一张男生表,一张女生表
用户表men:
ID USERNAME sex
1 高1 man
2 高2 man
3 高3 man
用户表wommen:
ID USERNAME sex
1 跃1 woman
2 跃2 woman
3 跃3 woman
相亲记录表:
ID USERman userwoman
1 1 1
2 1 2
3 1 3
4 2 1
5 1 1
相亲记录表中,userman和userwoman,分别和两张表的ID设置外键连接。但是会出现重复现象,比如1和5就重复了。如何避免这种情况。这就需要给userman和userwoman组合添加一个唯一索引。
unique man_woman (userman,userwoman),这样就避免了重复约会相同对象的情况了。
自增
auto_increment:
desc 表名;查看表的描述信息
show create table 表名;显示当前表创建时候的SQL语句
show create table 表名 \G; 显示当前表创建时候的SQL语句,能查看到当前auto_increment的值
alter table 表名 auto_increment=0;给auto_increment 设置值。
mysql自增的步长,基于会话级别;
show session variables lick "auto_inc%" 查看全局变量
set session auto_increment_increment=2;设置步长为2
set session auto_increment_offset=2;设置起始值为2
全局变量:session变成global
sql server自增的步长,基于表级别;
数据类型
数字:
bit:[(M)]
二进制位(101001),m表示二进制位的长度(1-64),默认m=1
tinyint:[(m)] [unsigned] [zerofill]
小整数,数据类型用于保存一些范围的整数数值范围:
有符号:
-128 ~ 127.
无符号:
0 ~ 255
特别的: MySQL中无布尔值,使用tinyint(1)构造。
int :[(m)][unsigned][zerofill]
整数,数据类型用于保存一些范围的整数数值范围:
有符号:
-2147483648 ~ 2147483647
无符号:
0 ~ 4294967295
特别的:整数类型中的m仅用于显示,对存储范围无限制。例如: int(5),当插入数据2时,select 时数据显示为: 00002
bigint:[(m)][unsigned][zerofill]
大整数,数据类型用于保存一些范围的整数数值范围:
有符号:
-9223372036854775808 ~ 9223372036854775807
无符号:
0 ~ 18446744073709551615
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
decimal:[(m[,d])] [unsigned] [zerofill]
准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。
特别的:对于精确数值计算时需要用此类型
decaimal能够存储精确值的原因在于其内部按照字符串存储。
字符串:创建数据表,定长放前面,不定长放后面,如果是大型文件,图片或者视频。数据库中存放的是文件存放的路径
char(m) 定长,查询快
char数据类型用于表示固定长度的字符串,可以包含最多达255个字符。其中m代表字符串的长度。
PS: 即使数据小于m长度,也会占用m长度
varchar(m) 不定长,节省空间
varchars数据类型用于变长的字符串。其中m代表该数据类型所允许保存的字符串的最大长度,只要长度小于该最大值的字符串都可以被保存在该数据类型中。
注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡
text
text数据类型用于保存变长的大字符串,可以组多到65535 (2**16 − 1)个字符。
mediumtext
A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters.
longtext
A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters.
时间类型:
date:YYYY-MM-DD 年-月-日
time:HH:MM:SS 时-分-秒
year:YYYY 年
datetime:YYYY-MM-DD HH:MM:SS 年月日时分秒
timestamp:YYYYMMDD HHMMSS
其他类型:
enum:枚举类型
示例:create table user(
id int(5),
name varchar(10),
sex enum("man","woman")
)
这张user表中sex只能填写man或者woman,如果填写其他数据,会报错
set:集合类型
作用和enum类似,不同的是,enum只能填给了的组合中的某一个值,而set集合,可以填一个值,也可以填多个符合要求的值。
对表进行操作:增删改查
增
insert into 表 (列名,列名...) values (值,值,值...)
insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...)
insert into 表 (列名,列名...) select (列名,列名...) from 表
删
delete from 表 清空表
delete from 表 where id=1 and name='alex'
改
update 表 set name = 'alex',age=19 where id>1
查
select * from 表
select * from 表 where id > 1
select nid,name,gender as gg from 表 where id > 1
查询条件
条件
select * from 表 where id > 1 and name != 'alex' and num = 12;
select * from 表 where id between 5 and 16;[5-16]
select * from 表 where id in (11,22,33)
select * from 表 where id not in (11,22,33)
select * from 表 where id in (select nid from 表)
通配符
select * from 表 where name like 'ale%' - ale开头的所有(多个字符串)
select * from 表 where name like 'ale_' - ale开头的所有(一个字符)
限制
select * from 表 limit 5; - 前5行
select * from 表 limit 4,5; - 从第4行开始的5行,5 6 7 8 9
select * from 表 limit 5 offset 4 - 从第4行开始的5行
排序
select * from 表 order by 列 asc - 升序
select * from 表 order by 列 desc - 降序
select * from 表 order by 列1 desc,列2 asc - 根据 “列1” 降序,如果相同则按列2升序
分组
select num from 表 group by num
select num,nid from 表 group by num,nid
select num,nid from 表 where nid > 10 group by num,nid order nid desc
select num,nid,count(*),sum(score),max(score),min(score) from 表 group by num,nid
select num from 表 group by num having max(id) > 10
特别的:group by 必须在where之后,order by之前
如果对于聚合函数结果进行二次筛选时,就必须使用having,而不使用where.
count(id):计数,有几个ID显示几
sum():求和
max():最大的值
min():最小的值
avg():平均值
连表
无对应关系则不显示
select A.num, A.name, B.name
from A,B
Where A.nid = B.nid
无对应关系则不显示
select A.num, A.name, B.name
from A inner join B
on A.nid = B.nid
A表所有显示,如果B中无对应关系,则值为null
select A.num, A.name, B.name
from A left join B
on A.nid = B.nid
B表所有显示,如果B中无对应关系,则值为null
select A.num, A.name, B.name
from A right join B
on A.nid = B.nid
组合
组合,自动处理重合
select nickname
from A
union
select name
from B
组合,不处理重合
select nickname
from A
union all
select name
from B