zoukankan      html  css  js  c++  java
  • mysql

    MySQL数据库

    数据分类:

    - 关系型数据库:sqllite,db2,oracle,access,sql server,MySQL
    - 非关系型数据库:MongoDB,redis
    

    以上软件都是DBMS。

    MySQL数据库是用于管理文件的一个软件,包括两部分:

    服务端
    	- socket服务端
    	- 本地文件操作
    	- 解析指令【sql规则】
    
    客户端
    	- socket客户端
    	- 发送指令
    	- 解析指令【sql规则】 
    
    PS:
    	- 其中socket功能、文件操作、指令发送可以由DBMS(数据库管理系统)实现
    

    下面介绍内容:

    - MySQL安装(服务端 和 客户端)
    - 连接
    - SQL语句
    

    MySQL安装

    linux

    - 语句安装
    	yum install mysql-server
    

    windows

    - 执行文件安装:
    	下一步,下一步
    	
    - 压缩包安装:	
    	- 解压
    	- 初始化(初始化后默认用户名为root,密码为空)
    		E:...mysql-5.x.x-winx64inmysqld --initialize -insecure
    	- 启动服务端
    		E:...mysql-5.x.x-winx64inmysqld
    	- 客户端连接服务端
    		E:...mysql-5.x.x-winx64inmysql -u root -p
    		
    	配置环境变量:
    		- 将MySQL解压路径,加入配置环境path,可以在终端直接运行
    
    	windows服务:
    		- 将MySQL服务端作为windows服务
    			E:...mysql-5.x.x-winx64inmysqld --install
    		- 去除MySQL的windows服务
    			E:...mysql-5.x.x-winx64inmysqld --remove
    		
    		- 启动命令
    			net start MySQL 
    		- 停止命令
    			net stop MySQL
    

    初始化:--initialize -insecure
    连接服务: mysql -u root -p
    windows服务:
    --install
    --remove
    MySQL服务启动停止命令:
    net start MySQL
    net stop MySQL

    mac

    - dmg安装
    

    ps:各种报错处理

    连接

    数据库结构

    数据库
    	|--表1
    	|	|--行1(数据)
    	|	|--行2
    	|
    	|--表2
    	|	|--行1
    	|	|--行2
    

    连接

    - 连接数据库
    	$ mysql -u root -p
    - 显示数据库们
    	mysql> show databases;
    - 使用名称为mysql的数据库
    	mysql> use mysql;
    - 显示表们
    	mysql> show tables;
    - 显示全部行(数据)
    	mysql> select * from user;
    

    创建用户

    规则:create user '用户名'@‘ip地址’ identified by '密码';
    百分号可以表示ip地址范围;

    - 创建用户tom,密码为123,访问ip地址只能是192.168.11.1~255范围
    	mysql> create user 'tom'@'192.168.11.%' identified by '123';
    

    授权

    规则:grant 权限1[,权限2,...] on 数据库名.表名 to '用户名'@'ip地址';
    全部权限,grant除外:all privileges

    - 给用户tom 授权 数据库db1 表t1 权限select,inster,update
    mysql> grant select,inster,update on db1.t1 'tom'@'192.168.11.%';
    
    解除权限规则:revoke 权限1[,权限2,...] on 数据库名.表名 from '用户名'@'ip地址'; 此处使用from
    - 给用户tom 解除 数据库db1 表t1 全部权限
    	mysql> revoke all privileges on db1.t1 from 'tom'@'192.168.11.%';
    

    mysql语句

    操作数据库

    - 创建数据库db1
    	create database db1;
    - 创建数据库db2带有utf8编码识别
    	create database db2 default charset utf8;
    
    - 删除数据库db1
    	drop database db1;
    
    - 查全部数据
    	show databases;
    

    推荐创建数据库方式:create database db2 default charset utf8;

    操作表

    规则:

    create table 表名(
    	列名1 类型 [null | not null] [auto_increment] [primary key],
    	列名2 ...
    	...
    ) [engine = innodb | myisam] [default charset = utf8];
    

    innodb: 支持事务,原子性操作,sql操作失败回滚
    primary key: 表示 约束(不能重复且不能为空); 加速查找
    not null: 不能为空

    - 创建表名为t1 包括列id,name utf8编码 
    	create table t1(id int,name char(10)) default charset=utf8;
    - 创建表名为t2 表示支持事物,原子性操作engine=innodb
    	create table t2(id int,name char(10)) engine=innodb;
    - 创建表名为t3 列id不为空,自增,主键
    	create table t3(
    		id int not null auto_increment primary key,
    		name char(10));
    

    推荐写法:

    create table t3(
    	id int not null auto_increment primary key,
    	name char(10)
    )engine=innodb default charset=utf8; 
    

    - 清空表t1中数据
    	delete from t1;	
    - 清空表t1数据,同时自增id清空
    	truncate table t1;
    	
    - 删除表t1
    	drop table t1;
    

    - 查看全部表
    	show tables;
    

    操作表(补充)

    - 查看创建表的sql语句,横表
    	show create table t1;
    
    - 查看创建表的sql语句,纵表
    	show create table t1 G;
    	
    	# 结果:
    	CREATE TABLE `t1` (
    			  `nid` int(11) NOT NULL AUTO_INCREMENT,
    			  `pid` int(11) NOT NULL,
    			  `num` int(11) DEFAULT NULL,
    			  PRIMARY KEY (`nid`,`pid`)
    	) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
    
    - 查看表信息
    	desc t1;
    
    - 修改表自增主键的值从2开始
    	alter table t1 auto_increment=2;
    

    MySQL可以设置自增主键n开始,但是不可以像SqlServer那样可以在建表时设置自增步长
    所以,MySQL设置步长方式有两种方式基于会话级别基于全局级别

    基于会话级别
    在本终端设置步长后,效果只有在本中端起作用,关闭后失效

    - 查看会话变量
    	show session variables like 'auto_inc%';
    	
    	# 结果:
    	+--------------------------+-------+
    	| Variable_name            | Value |
    	+--------------------------+-------+
    	| auto_increment_increment | 1     |
    	| auto_increment_offset    | 1     |
    	+--------------------------+-------+
    
    - 设置会话步长为10,自增主键从10开始
    	set session auto_increment_increment=2; # 步长
    	set session auto_increment_offset=10; # 起始
    	
    	# 结果:
    	+--------------------------+-------+
    	| Variable_name            | Value |
    	+--------------------------+-------+
    	| auto_increment_increment | 2     |
    	| auto_increment_offset    | 10    |
    	+--------------------------+-------+
    

    基于全局级别
    设置步长后,永久有效

    - 查看全局变量
    	show global variables like 'auto_inc%';
    
    - 设置全局步长
      set global auto_increment_increment=2;  # 步长
      set global auto_increment_offset=10;  # 起始
    

    操作数据(行)

    - 插入数据
    	insert into t4(id,name) values(1,'tom'); 
    - 插入多条数据
    	insert into t4(id,name) values(2,'alex'),(3,'peter');
    - 插入一张表的查询结果
    	insert into t4(id,name) select id,name from tb3;
    
    - 删
    	delete from t4 where id = 1 ;
    	
    - 改
    	update t4 set name = kirs;
    	update t4 set name = alex where id = 2;
    	
    - 查
    	selet * from t1;
    

    数据类型

    数字

    - tinyint
    - int
    - bigint
    - FLOAT 
    - DOUBLE
    - decimal 绝对精确
    

    字符串

    - char(10)  查询速度快
    - varchar(10)  可变长,节省空间
    - text 用于存放多媒体文件url
    

    PS:创建数据表通常把可以确定长度的字段至于前列,变长至于后面

    时间类型

    - DATETIME
    	YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59    Y)
    

    枚举类型

    表中数据只可以是规定内容

    - enum
    	CREATE TABLE shirts (
                    name VARCHAR(40),
                    size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
                );
        INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');
    

    集合类型

    SET类型的值可以取列表中的一个元素或者多个元素的组合
    规则:属性名 SET('值1','值2','值3'...,'值n')

    -set
    	CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
        INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
    

    外键

    本表引入其他表的主键作为列
    规则:[constraint <关系名>] foreign key (列名) references <外键表名>(外键列名)

    create table userinfo(
    		uid bigint auto_increment primary key,
    		name varchar(32),
    		department_id int,
    		constraint fk_user_depar foreign key (department_id) references department(id)
    	)engine=innodb default charset=utf8;
    	
    create table department(
    		id bigint auto_increment primary key,
    		title char(15)
    	)engine=innodb default charset=utf8;
    

    主键:
    一张表只可以有一个主键,主键不一定只是一列,可以是多列组成,且不能重复,不能为空
    所以,联合主键作为外键引入时是多列

    - 当表中的外键是联合主键时,引入外键也是多列
    	create table t1(
    		id int not null auto_increment,
    		num int not null,
    		primary key(id,num),
    	)engine=innodb default charset=utf8;
    	
    	create table t2(
    		id int not null auto_increment primary key,
    		t1_id int not null,
    		t1_num int not null,
    		constraint fk_t2_t1 foreign key(t1_id,t1_num) t1(id,num)
    	)engine=innodb default charset=utf8;
    

    唯一索引:
    唯一索引是一种约束,创建表时对表中的某一列或者某几列设置,在数据插入表中时,别标记为唯一索引的几列不能重复,可以为空,对于表的查询有加速功效
    规则:
    create table 表名(
    列名1 类型 ...,
    列名2 类型 ...,
    列名3 类型 ...,
    unique 唯一索引名称(列名1,列名2),
    cconstraint ...
    );

    唯一索引通常与外键联用,对应表与表之间的一对一、一对多、多对多关系

    - 一对多关系 
    	适用于用户表与部门表情况【部门:用户 = 1:n】
    
    - 一对一关系
    	用户开通博客模式【用户:博客  = 1:1】
    	用户id作为博客表的外键,并需唯一
    	
    - 多对多关系
    	用户权限模式,用户表与权限表之间需要关系表【用户:权限 = n : n】
    	用户id与权限id作为关系表的外键,并且联合唯一
    

    操作数据-查询

    通配符

    - %  通配a开头
    	select * from tb4 where name like "a%";
    	
    - _  通配a开头,只有两个字符
    	select * from tb4 where name like "a_";
    

    limit

    - limit  查询前10条信息
    	select * from tb4 where limit 10;
    - 分页效果  从0开始,每次查询10条信息
    	n = 页码
    	x = (n-1) * 10
    	select * from tb4 where limit x,10;
    	
    - offset  以下效果一样
    	select * from tb12 limit 10 offset 20;
    	select * from tb4 where limit 20,10;
    

    排序

    - order by 
    	select * from tb4 order by id desc; # 从大到小
    	select * from tb4 order by id asc; # 从小到大
    
    - 从后取10条信息
    	select * from tb4 order by id desc limit 10;	
    

    分组

    - 聚合函数
    	- count
    	- max
    	- min
    	- sum
    	- avg
    
    - group by  通过id分组
    	select count(id),name from tb4 group by id;
    	
    - having ****  如果对于聚合函数结果进行二次筛选时,必须使用having ****
    	select count(id),name from tb4 group by id having count(id) > 1;
    

    连表

    - left join  左连接,左侧表内容全部显示,右侧表没有对应显示null
    	select * from tb4 left join tb5 on tb4.id = tb5.t_id;
    	
    - right join  右连接,右侧表内容全部显示,左侧表没有对应显示null
    	select * from tb4 right join tb5 on tb4.id = tb5.t_id;
    	
    	select * from tb5 left join tb4 on tb4.id = tb5.t_id; # 与上条结果一样色儿的
    	
    - inner join  将出现null时一行隐藏
    	select * from tb4 inner join tb5 on tb4.id = tb5.t_id;
    

    备份

    数据库备份
    - 【表结构+数据】
    	mysqldump -u root db1 > Users/.../db1.sql -p 
    - 【表结构】
    	mysqldump -u root -d db1 > Users/.../db1.sql -p
    
    数据库还原
    - 导入 【表结构】
    	mysql -u root -d db1  < Users/.../db1.sql -p
    

    临时表

  • 相关阅读:
    java网络请求工具类
    MySql 日期比较大小
    JAVA泛型整理
    循环list从list中移除数据
    MySql UNION字段
    session理解
    IDEA鼠标悬停提示变量值
    JAVA常用的RPC框架
    字符串查找重复字符最多的
    java List分组
  • 原文地址:https://www.cnblogs.com/sunqim16/p/6961281.html
Copyright © 2011-2022 走看看