mysql 总结

mysqld --initialize-insecure 初始化

mysql -u root -p 启动一个客户端并且连接MySQL服务器

mysqld(路径) --install 安装window服务
mysqld --remove 移除window服务
net start mysql : 开启服务端
net stop mysql :关闭服务端

忘记密码的解决方案

先关闭掉之前的mysql服务器的进程

查看进程号:tasklist |findstr mysql
杀死进程:taskkill /F /PID 进程号

跳过授权表开启mysql的服务端 mysqld --skip-grant-tables (开启服务端的 约束条件跳过授权)

客户端连接 mysql -uroot -p

更改密码:update mysql.user set authentication_string =password('') where User='root';

刷新权限 flush privileges;

select user();查看当前用户

C:\Users\mjj>mysqladmin -uroot -p password "123" 设置初始密码 由于原密码为空,因此-p可以
不用 注意这句话不起作用,请使用
update mysql.user set authentication_string =password('') where User='root';

C:\Users\mjj>mysqladmin -uroot -p"123" password "456"
修改mysql密码,因为已经有密码了,所以必须输入原密码才能设置新密码

create user 'mjj'@'192.118.1.1' identified by '123';创建用户和密码

drop user '用户名'@'IP地址'; 删除用户

rename user '用户名'@'IP地址' to '新用户名'@'IP地址';修改用户

set password for '用户名'@'IP地址'=Password('新密码');修改密码

SELECT User FROM mysql.user; 查看所有用户

select * from mysql.user where user='laodage' \G 查看某个用户权限
show grants for '用户'@'IP地址' 查看权限

grant select ,insert,update on db1.t1 to "mjj"@'%'; 授权 mjj用户仅对db1.t1文件有查询、插入和更新的操作

grant all privileges on db1.t1 to "mjj"@'%';
表示有所有的权限,除了grant这个命令,这个命令是root才有的。mjj用户对db1下的t1文件有任意操作

grant all privileges on db1.* to "mjj"@'%'; mjj用户对db1数据库中的文件执行任何操作

grant all privileges on *.* to "mjj"@'%'; mjj用户对所有数据库中文件有任何操作

revoke all on db1.t1 from 'mjj'@"%"; 取消mjj用户对db1的t1文件的任意操作

revoke all on db1.* from 'mjj'@"%"; 取消来自远程服务器的mjj用户对数据库db1的所有表的所有权限

revoke all privileges on *.* from 'mjj'@'%'; 取消来自远程服务器的mjj用户所有数据库的所有的表的权限

SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。SQL语言分为3种类型:

1、DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER

2、DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT

3、DCL语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE

sql 命令

information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、
列信息、权限信息、字符信息等

performance_schema: MySQL 5.5开始新增一个数据库:主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件、锁等现象

mysql: 授权库,主要存储系统用户的权限信息

test: MySQL数据库系统自动创建的测试数据库

mysql 支持的数据引擎

show engines\G; 查看所有支持的引擎

show variables like 'storage_engines%'; 查看正在使用的存储引擎

InnoDB 存储引擎 主要面向联机事务处理(OLTP)的应用 特点是行锁设计、支持外键,并支持类似 Oracle
的非锁定读,即默认读取操作不会产生锁。 从 MySQL 5.5.8 版本开始是默认的存储引擎。

MyISAM 存储引擎 不支持事务、表锁设计、支持全文索引,主要面向一些 OLAP 数 据库应用,在
MySQL 5.5.8 版本之前是默认的存储引擎(除 Windows 版本外)。

NDB 存储引擎 NDB 存储引擎的特点是数据全部放在内存中(从 5.1 版本开始,可以将非索引数据
放在磁盘上),因此主键查找(primary key lookups)的速度极快

Memory 存储引擎 ,Memory 存储引擎中的数据都存放在内存中,数据库重 启或发生崩溃,表中的数据都将
消失。它非常适合于存储 OLTP 数据库应用中临时数据的临时表,也可以作为 OLAP 数据库应用中数据仓
库的维度表

Infobright 存储引擎 第三方的存储引擎。其特点是存储是按照列而非行的,因此非常 适合 OLAP 的数据库
应用

NTSE 存储引擎 网易公司开发的面向其内部使用的存储引擎。目前的版本不支持事务, 但提供压缩、行级缓存等特性,不久的将来会实现面向内存的事务支持。

BLACKHOLE 黑洞存储引擎,可以应用于主备复制中的分发主库。

http://www.runoob.com/mysql/mysql-data-types.html
类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值

SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值

MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值

INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值

BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615)极大整数值

FLOAT 4 字节 (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度
浮点数值

DOUBLE 8 字节 (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度浮点数值

DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

int类型后面的存储是显示宽度,而不是存储宽度

常用的数据概括

数字:tinyint int bigint
小数:float :在位数比较短的情况下不精准
double:在位数比较长的情况下不精准
decimal:(如果用小数,则用推荐使用decimal) 精准 内部原理是以字符串的形式去存
字符串:
char(10):简单粗暴,浪费空间,存取速度快 root root000000
barchar:精准,节省空间,存取速度慢
sql优化:创建表时,定长的类型往前放,变长的往后放
比如性别 比如地址或者描述信息
>255个字符,超了就吧文件路径放在数据库中
比如如片,视频等,数据库中只存路径或者url

时间类型: 最常用 datetime

枚举类型和集合类型:
enum和set

char 和 varchar
char填充空格来满足固定长度,但是在查询时却会很不要脸地删除尾部的空格
(装作自己好像没有浪费过空间一样),然后修改sql_mode让其现出原形。
create table t1(x char(5),y varchar(4)); 字段x 为char 类型, 字段y 位varchar类型

insert into t1 values('你瞅啥 ','你瞅啥 '); char 存放5个字符,varchar 存4个字符

select x,char_length(x),y,char_length(y) from t1;在检索时char很不要脸地将自己浪费的2个字符给删掉了,
装的好像自己没浪费过空间一样,而varchar很老实,存了多少,就显示多少

SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'; 改变sql的mode磨石

select @@sql_mode; 查看sql当前的mode模式

select x,char_length(x) y,char_length(y) from t1; 查看字符个数

length():查看字节数
char_length():查看字符数

create table t1(id int)engine=innodb; 指定表类型/存储引擎 ,默认不写就是innodb

show databases 查看所有数据库

create database db1 创建数据库

select database(); 查看所在库

use 数据库名 选择数据库

DROP DATABASE 数据库名; 删除数据库

alter database db1 charset utf8; 修改数据库

create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
create table a1(
  id int,
  name varchar(50),
  age int(3)
); 创建表


insert into a1 values(1,'mjj',18),(2,'wusir',28); 插入表的记录

desc 表名; 查看表的结构

show create table 表名\G; 查看表的详细结构

create table 复制者的表名 select * from 被复制者的所属数据库.被复制者的表名; 复制表 结构和记录

create table 复制者的表名 select * from 被复制者的所属数据库.被复制者的表名 where 1>5;
复制表,只复制结构 不复制记录

create table 复制者的表名 like 被复制者的所属数据库.被复制者的表名; 只复制表结构 不复制记录

drop table 表名; 删除表

enum单选 只能在给定的范围内选择(多选一)
set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3)
create table consumer(
-> id int,
-> name varchar(50),
-> sex enum('male','female','other'),
-> level enum('vip1','vip2','vip3','vip4'),#在指定范围内,多选一
-> fav set('play','music','read','study') #在指定范围内,多选多
-> );

insert into consumer values
-> (1,'赵云','male','vip2','read,study'),
-> (2,'赵云2','other','vip4','play');

完整性约束

not null 和 default
sex enum('male','female') not null default 'male' not null 不允许为空 默认值是'male' unsigned 必须为正直(无符号)

unique(不同的,单列唯一)
第一种创建 unique的方式
create table department(
id int,
name char(10) unique
);
第二种创建 unique的方式
create table department(
id int,
name char(10) ,
unique(id),
unique(name)
);

联合唯一,只要两列记录,有一列不同,既符合联合唯一的约束
create table services(
-> id int,
-> ip char(15),
-> port int,
-> unique(id),
-> unique(ip,port)
-> );


primary key (主键)
一个表可以,单列做主键,多列做主键(复合主键) 字段的值不为空且唯一
存储引擎默认是(innodb):对于innodb存储引擎来说,一张表必须有一个主键。

创建t14表,为id字段设置主键,唯一的不同的记录
create table t14(
id int primary key,
name char(16)
);
not null + unique的化学反应,相当于给id设置primary key
create table t15(
id int not null unique,
name char(16)
);

auto_increment 自动增长

create table student(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') default 'male'
);

也可以指点id
insert into student values(4,'asb','female');

对于自增的字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长
步长auto_increment,默认为1
起始的偏移量auto_increment_offset, 默认是1

设置步长 为会话设置,只在本次连接中有效
set session auto_increment_increment=5;

全局设置步长 都有效。
set global auto_increment_increment=5;

设置起始偏移量
set global auto_increment_offset=3;

查看可用的 开头auto_inc的词(查看步长和起始位置) 设置完步长需要重新登录
show variables like 'auto_inc%';


清除表区 delete 和trucate 的区别

delete from t1; #如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。

truncate table t1;数据量大,删除速度比上一条快,且直接从零开始。


foreign key 外键

先创建被关联表,在创建关联表
dep_id int,
constraint fk_dep foreign key(dep_id) references dep(id)
随便起的 关联表创建 被关联表名(被关联id)
on delete cascade 同步删除
on update cascade 同步更新


因为有foreign key的约束 使得表形成了三种关系 多对一 多对多 一对一

单表查询的语法
select 字段1,字段2... from 表名
where 条件
group by field
having 筛选
order by field
LIMIT 限制条数

关键字的执行优先级
from where group by having select distinct order by limit


where子句中可以使用
1.比较运算符:>、<、>=、<=、<>、!=
2.between 80 and 100 :值在80到100之间
3.in(80,90,100)值是10或20或30 not in
4.like 'xiaomagepattern': pattern可以是%或者_。%小时任意多字符,_表示一个字符
5.逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not

group by 分组查询

为何要分组呢?
取每个部门的最高工资
取每个部门的员工数
取男人数和女人数

小窍门:‘每’这个字后面的字段,就是我们分组的依据
由于没有设置ONLY_FULL_GROUP_BY,于是也可以有结果,默认都是组内的第一条记录,但其实这是没有意义的
如果想分组,则必须要设置全局的sql的模式为ONLY_FULL_GROUP_BY
set global sql_mode='ONLY_FULL_GROUP_BY'; (设置成功后,退出登录方可生效)

通过group by分组之后,只能查看当前字段,如果想查看组内信息,需要借助于聚合函数
select post from employee group by post;

聚合函数

max()求最大值 min()求最小值 avg()求平均值sum() 求和 count() 求总个数

having 过滤

HAVING与WHERE不一样的地方在于

执行优先级从高到低:where > group by > having
1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。

2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数


order by 查询排序

SELECT * FROM employee ORDER BY age;
SELECT * FROM employee ORDER BY age ASC;
SELECT * FROM employee ORDER BY age DESC;


limit 限制查询的记录数:

默认初始位置为0
LIMIT 0,5; #从第0开始,即先查询出第一条,然后包含这一条在内往后查5条
LIMIT 5,5; #从第5开始,即先查询出第6条,然后包含这一条在内往后查5条


多表查询

外链接查询语法
select 字段列表
from 表1 inner|left|right join 表2
on 表1字段 = 表2.字段

交叉链接 不适用任何匹配条件 生成笛卡尔积


内连接:只连接匹配的行 找两张表共有的部分,相当于利用条件从笛卡尔积结果中筛选出了匹配的结果
select employee.id,employee.name,employee.age,employee.sex,department.name from employee
inner join department on employee.dep_id=department.id;
等同于

select employee.id,employee.name,employee.age,employee.sex,department.name from
employee,department where employee.dep_id=department.id;

外链接之左链接 : 优先显示左表全部记录
以左表为准,即找出所有员工信息,当然包括没有部门的员工
本质就是:在内连接的基础上增加左边有,右边没有的结果
select employee.id,employee.name,department.name as depart_name from employee left join
department on employee.dep_id=department.id;


外链接之右链接:优先显示右表全部记录
以右表为准,即找出所有部门信息,包括没有员工的部门
本质就是:在内连接的基础上增加右边有,左边没有的结果
select employee.id,employee.name,department.name as depart_name from employee right join
department on employee.dep_id=department.id;


全外连接:显示左右两个表全部记录(了解)
外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果
注意:mysql不支持全外连接 full JOIN
强调:mysql可以使用此种方式间接实现全外连接

语法:select * from employee left join department on employee.dep_id = department.id
union all
select * from employee right join department on employee.dep_id = department.id;

mysql> select * from employee left join department on employee.dep_id = department.id
union
select * from employee right join department on employee.dep_id = department.id
;


#注意 union与union all的区别:union会去掉相同的纪录


符合条件链接查询

以内连接的方式查询employee和department表,并且employee表中的age字段值必须大于25,
即找出年龄大于25岁的员工以及员工所在的部门
select employee.name,department.name from employee inner join department
  on employee.dep_id = department.id
  where age > 25;

以内连接的方式查询employee和department表,并且以age字段的升序方式显示。
select employee.id,employee.name,employee.age,department.name from employee,department
where employee.dep_id = department.id
and age > 25
order by age asc;


子查询

1,带in关键字的子查询
查询平均年龄在25岁以上的部门名
select id,name from department
where id in
(select dep_id from employee group by dep_id having avg(age) > 25);

2.带比较运算符的子查询
带比较运算符的子查询

复制代码
#比较运算符:=、!=、>、>=、<、<=、<>
#查询大于所有人平均年龄的员工名与年龄
mysql> select name,age from employee where age > (select avg(age) from employee);s

3.带exists 关键字的子查询
EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录。而是返回一个真假值。True或False
当返回True时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询
select * from employee where exists (select id from department where id=200);

 

posted @ 2018-10-23 15:55  心跳+  阅读(1067)  评论(0编辑  收藏  举报
-->