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
posted @ 2017-06-06 16:29  高跃  阅读(234)  评论(0编辑  收藏  举报