MySQL

一、配置my.init

[mysql]
default-character-set=utf8
[mysqld]
port=3306
basedir=D:\mysql\mysql-5.6.48-winx64
datadir=D:\mysql\mysql-5.6.48-winx64\data
max_connections=200
character-set-server=utf8
default-storage-engine=INNODB

 

二、DOS启动和登录

启动和退出mysql

# 启动
net start mysql

# 退出
net stop mysql

 

登录

-p后面密码不能加空格

-h后面的IP地址是访问的服务器IP地址,如果连接本地可省略-hlocalhost

创建用户时@' '中的IP地址是允许访问的客户端IP地址

-P:端口号,默认3306,如果没有改变,可省略

# 登录DBMS
mysql -hlocalhost -P3306 -uroot -p
mysql -uroot -p

# 登录授权用户
mysql -h192.168.0.132 -uguest -p

 

三、用户管理

# 创建一个其他用户
create user 'guest'@'192.168.0.%' identified by '123';

# 给用户授权
grant (all/select/select,insert) on ftp.* to 'guest'@'192.168.0.%';

# 查看用户权限
show grants for root@'%';

# 查看当前登录的用户
select user();

# 给当前用户设置密码
set password = password('123');

 

四、sql语句

4.1 增加 Create

# ==========库操作(database)==========
# 创建一个库名为ftp的数据库
create database ftp;

# ==========表操作(table)==========
# 创建一个叫student的表
create table student(id int,name char(12),age tinyint unsigned);
# 增加字段,默认添加到最后*
alter table student add age;
alter table student add id first;
alter table student add age after name;
alter table student modify age;
alter table student modify id first;
alter table student modify age after name;
# 添加主键*
alter table student add primary key(id);
# 添加外键*
alter table student add constraint fk foreign key(id) references class(cid);

# ==========数据操作==========
# 插入数据
insert into student values(1,'xj',24),(2,'sep',16);
insert into student(id,age) values(3,16);
# 从表中寻找插入另一张表
insert into student(id,age) select cid,cname from client;

 

4.2 查看 Retrieve

# ==========库操作(database)==========
# 查看所有数据库
show databases;
# 查看当前库
select database();

# ==========表操作(table)==========
# 查看当前库下所有表
show tables;
# 查看指定库下所有表
show tables from ftp;
# 查看索引
show index from ftp.student;
show index from student;
# 查看表结构
desc student;
# 查看详细表约束
show create table student;

# ==========数据操作==========
# 查询所有数据
select * from student;
# 查询指定数据
select name from student;

 

4.3 更改 Update

# ==========库操作(database)==========
# 切换到这个ftp库下
use ftp;

# ==========表操作(table)==========
# 修改表名*
alter table student remake stu;
rename table student to stu;
# 修改字段属性
alter table student modify name char(15) not null;
# 修改字段名和属性*
alter table student change name sname char(15) not null;
# 修改表存储引擎
alter table student engine=innodb;

# ==========数据操作==========
# 修改数据
update student set id=3,age=18 where name='xj';

 

4.4 删除 Delete

# ==========库操作(database)==========
drop database ftp;

# ==========表操作(table)==========
# 删除表
drop table student;
# 删除字段
alter table student drop age;
# 删除主键*
alter table student drop primary key;
# 删除外键*
alter table student drop foreign key fk_id;
# 删除索引*
alter table student drop index index_name;

# ==========数据操作==========
# 清空表,但不不清空自增字段偏移量
delete from student;
# 清空表,不能回滚,底层是先drop表,再新建表*
truncate student;
# 删除对应数据
delete from student where name='xj';

 

4.5 筛选排列WGHOL

select查询顺序

from 表 ——> where 条件 ——> group by 分组 ——> having 过滤条件 ——> select 字段 as 重命名 ——> order by 排序 ——> limit

where、group by 不能使用select重命名;having特殊处理后,能使用重命名。

# ==========where==========
# 比较运算符(<,>,<=,>=,==,!=)
# 逻辑运算(not,and,or),(is,is not)
# 范围匹配(between and , in)
where salary between 1000 and 2000
where salary in (1000,2000,3000)
where salary not in (1000,2000) and age=18
# 模糊匹配(like(e%)、like(e_),通配符:%(0或多个字符) _(单个字符))
# 正则表达式

# ==========group by==========
# 分组聚合,聚合函数
# 计数
select gender,count(id) from student group by gender;
# 最大值
select post,max(salary) from student group by post;

# ==========having==========
# 过滤语句having可用聚合函数,where不行,筛选符合条件的组的数据
select post,avg(salary) from student group by post having avg(salary)>10000;

# ==========order by==========
# 从小到大排序,默认asc
select * from student order by salary;
# 从大到小排序
select * from student order by salary desc;
# 多次排序,从大到小排序
select * from student order by age,salary desc;

# ==========limit==========
# 取前3项,默认0开始
select * from student order by salary limit 3;
# 从下标1开始取接下来3项
select * from student order by salary limit 1,3;
select * from student order by salary limit 3 offset 1;

 

4.6 xxxx

# ==========约束==========
# -约束,加在字段数据类型后定义数值
# 无符号(默认)
unsigned
# 非空
not null
# 设置默认值
default 'admin'
# 唯一
unique
# 自增,要先加上唯一,只对数字有效,自带非空
auto_increment
# 主键,一张表只有一个,默认第一个非空+唯一是主键
primary key
# 外键,外表字段至少是唯一的
# 一个表的两个字段或两个表的两个字段之间建立的约束,在从表中建立,主表生命周期久于从表。
# 约束的5个等级:Cascase(从表跟随主表修改删除)、Set null(从表随着主表修改删除设置成null)、No action(不作为)、Restrict(先删从表,再删主表)、Set default(mysql的innodb不支持)
foreign key(class_id) references class(cid)

# ==========运算和函数==========
# 四则运算,不改变原表数据
select name,salary*2 from student;

# -函数
# 拼接
concat(name,':',sex)
# 用连接符拼接
concat_ws(':',id,name)
# 求字节数
length(name)
# 求字符数
char_length(name)
# 转大写
upper(name,sex)
# 转小写
lower(name,sex)
# 返回name的左边2个
left(name,2)
# 返回name的右边2个
right(name,2)
# 去掉name左边的空白符
ltrim(name)
# 去掉name右边的空白符
rtrim(name)
# 去掉name两端空白符
trim(【both/leading/trailing '字符串' from】name)
# 从第2个字符开始截取name
substring(name,2)
# now()系统当前时间
select name,now() from student;
...

# -聚合函数、分组函数
count,max,min,sum,avg(平均),GROUP_CONCAT

# ==========联合索引==========
# 联合唯一
create table t4(id int,server_name char(12),ip char(15)),port int,unique(ip,port));
# 联合主键1
create table t5(id int,server_name char(12),ip char(15)),port int,primary key(ip,port));
# 联合主键2
create table t5(id int,server_name char(12),ip char(15)) not null,port int not null,unique(ip,port));

# ==========连表==========
# 创建外表
create table class(
  cid int primary key auto_increment,
  cname char(12) not null,
  startd date
);
# 创建主表
create table student(
  id int primary key auto_increment,
  name char(12) not null,
  class_id int,
   foreign key(class_id) references class(cid)
);

# -外键操作,父表操作影响子表
# cascade即连更新,即连删除
create table student2(
  id int primary key auto_increment,
  name char(12) not null,
  class_id int,
   foreign key(class_id) references class(cid) on update cascade on delete cascade
);
# 在父表上update/delete记录时,将子表匹配记录的列设为null
set null
# 如果子表中有匹配的记录,则不允许对父表对应选键进行update/delete
No action
# 同no action,都是立即检查外键约束
Reatrict
# 附表有变更时,子表将外键列设置成一个默认的值,但innodb不能识别
set default

# -连表查询(效率高)
# inner join内连接
select * from department,employee where department.id = dep_id;
select * from department as t1 inner join employee as t2 on t1.id = t2.dep_id;
# left join左外连接,左表都显示,右表只显示匹配的
select * from department as t1 left join employee as t2 on t1.id = t2.dep_id;
# right join右外连接,右表都显示,左表只显示匹配的
select * from department as t1 right join employee as t2 on t1.id = t2.dep_id;
# union全外连接,mysql不支持full join
select * from department as t1 left join employee as t2 on t1.id = t2.dep_id
union
select * from department as t1 right join employee as t2 on t1.id = t2.dep_id;

# -子查询(效率低)
# in、not in字符的子程序
select * from department where id in(select dep_id from employee group by dep_id having avg(age)>25);
select * from department where id not in(select distinct dep_id from employee group by dep_id having avg(age)>25);
# 比较运算符的子查询
select * from employee where age>(select avg(age) from employee);
select name,age employee as t1 inner join (select dep_id,avg(age) avg_age from employee group by dep_id) as t2 on t1.dep_id = t2.dep_id where age>avg_age;
# exists返回True,False
select * from employee where exists (select id from department where id=2014);

# ==========xxx==========
# 临时重命名
select name as n from student;
select name n from student;

# 去重,删除name,sex都相同的数据
select distinct name,sex from student;

# case语句条件判断
select
(
case
when name='xj' then
      name
   when name='sephiroth' then
      concat(name,'nb')
   else
      concat(name,'xx')
   end
   )as new_name from student;

# ==========普通索引==========
# 已创建的表上添加普通索引
create index 索引名 on 表(字段);
alter table 表名 add index 索引名(字段);
# 创建表时添加普通索引
cteate 表(字段) index | key 【索引名】 (字段);
# 删除索引
drop index 索引名 on 表名;

# ==========事务==========
# mysql默认自动提交事务,一句sql语句是一个事务,事务回滚和提交只对insert,update,delete有效,对create,drop等DDL语句无效
# 取消自动提交期间为一个事务
set autocommit = false;
...
set autocommit = true;
# 开始事务,结果提交或是回滚,JDBC不支持
start transaction;
...
commit; 或 rollback;

# ==========配置==========
# 设置存储引擎
ENGINE=myisam
# 显示存储引擎
show engines;
# 显示所有存储引擎相关信息
show variables like '%engin%';

# 设置全局编码
set character_set_client='utf8';
set character_set_connection='utf8';
set character_set_results='utf8';
# 设置数据库编码
alter database db character set utf8;
# 设置表编码
alter table t character set utf8;

# -隔离级别
# 设置当前表的隔离级别
set tx_isolation = 'read-committed';
# 设置数据库全局的隔离级别
set global tx_isolation = 'read-committed';

# 严格模式,只在内存中生效
mysql>set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

 

五、sql文件的导入导出

# 导入sql文件
source d:/mysqldb.sql

# 导出sql数据
mysqldump -hlocalhost -P3306 -uroot -p123 --database test > d:/test.sql

 

六、其他

6.1 数据库类型

关系型数据库:sqllite,db2,oracle,access,sql server,MYSQL(sql语句通用)

非关系型数据库:mongodb,redis,memcache

 

6.2 存储引擎

innodb:数据索引.ibd / 表结构.frm,数据持久化,支持事务,支持行级锁,支持外键

myisam:数据.MYD / 索引.MYI / 表结构.frm,数据持久化,只支持表级锁

memory:表结构.frm,数据存储在内存中,数据断电消失

 

6.3 命名规范

  1. 只能包含数字、字母、下划线

  2. 不能在对象名字符间留空格

  3. 避免重名

    • 同一个数据库中,表不能重名

    • 同一张表中,字段不能重名

    • 同一个DBMS中,数据库不能重名

  4. 命名时不能用关键字,使用关键字用``引起来

 

6.4 sql语句规范

  1. mysql对sql语句不区分大小写,sql语句关键字尽量大写,数据是否区分大小写,要看编码

    ci:不区分

    cs:区分

    bin:最严格

  2. sql语句中的值,处理数值类型(整数,小数),其他类型都用单引号' '

  3. 如果在sql中给字段取别名,可以对别名加双引号" ",别名中有空格必须加" ",没有空格可以省略;给表名取别名不使用双引号" "

  4. sql语句必须用;结束

  5. sql语句成对符号都必须成对才能结束语句

  6. #或-- :单行注释;/* */:多行注释

    -- 后面必须加空格

 

6.5 语句分类

  1. DDL:Data Define Language

    数据定义语言,定义数据的结构

    eg:create,drop,alter

     

  2. DML:Data Manage Language

    数据管理语言,对数据值进行增删改查

    eg:insert,delete,update,select

     

  3. DCL:Data Control Language

    数据控制语言,对权限、事务等控制

    eg:grant,revoke,commit,rollback...

     

6.6 索引分类

聚集索引(聚簇索引):primary key

辅助索引:unique

普通索引

 

6.7 数据类型

# -数字
tinyint,smallint,mediumint,int,bigint,bool
float(255,30),double(255,30),decimal(65,30)

# -时间
date,time,datetime
year,timestamp     # year:1901/2155,timestamp:1970-01-01 00:00:00/2038

create table t1(id int,dt datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);  # 使datetime获得与timestamp一样的属性,修改该行数据更新时间
insert into t1 values(1,now());    # 当前时间

# -字符串
char(255),varchar(65535)   # 定长字符串和变长字符串
tinyblob(255),blob(65535),mediumblob(16777215),longblob(4294967295)      # 二进制字符串
tinytext(255),text(65535),mediumtext(16777215),longtext(4294967295)      # 文本字符串

# -选项
enum('yes','no')      # 单选
set('fly','run','swim','box','game')      #多选

create table t2(id int,hoddy set('fly','run','swim','box','game'));
insert into t2 values(1,'fly,run,swim');  # 插入数据,去重,去无此选项

 

6.8 运算符

  1. 算数运算符

    +,-,*,/,div(除后只保留整数部分),%或mod(取模)

  2. 比较运算符

    ,<,>=,<=,=(区别Java中==),!=或<>,<=>(安全等于,判断null值)或is

    0表示false,1表示true

    所有字符串都用单引号''

    null值一般用is null 和is not null 判断

  3. 逻辑运算符

    &&或and,||或or,!或not,^或xor

    &按位与

  4. 范围

    between ... and ...,in(...),not in(...)

    select * from empolyee where salary in (1000,2000,3000);
  5. 模糊查询

    like '_%'

    _(代一个字符)

    %(代0~n个字符)

  6. 位运算符

    与Java中相同

 

6.9 数据隔离级别

  1. read uncommitted:可以读取未提交的

    事务1可以读取到事务2已经修改,但未提交的数据。速度快

  2. read committed:读取已提交的数据

    事务1只能读取到事务2已经未提交的数据

  3. repeatable read:避免不可重复读

    行锁

  4. serializable:避免幻读

    表锁

oricle只有2,4等级

几种问题:

  • 脏读现象:

    事务1修改但还未提交的数据,被事务2看见,这个数据就是脏数据。

    可将事务隔离级别设置为2,3,4

  • 不可重复读:

    事务1对某个表进行修改,已经提交,事务2在事务1提交数据前后,查询了两次这个数据,两次查询结果不同

    可将事务隔离级别设置未3,4

  • 幻读:

    事务1对某个表的记录进行增加或删除操作,并且提交;事务2在事务1提交前后查询了这个表两次,对于事务2来说,前后记录数不同

    可将隔离级别设置为4

在mysql5.0之后升级,在3之后就能避免幻读

 

6.10 可视化工具

SQLyog,Navicate

posted @ 2021-09-18 16:50  ジョカ  阅读(156)  评论(0)    收藏  举报