安装MySql和常用命令

1、mac 环境

  1. Mysql 下载地址https://dev.mysql.com/downloads/mysql/
  2. 版本mysql-8.0.13-macos10.14-x86_64.dmg,这里10.14和10.13是通用的
  3. 安装完成后,查看是否安装成功 cd /usr/local/mysql/bin 查看目录是否存在
  4. 打开文件,vim ~/.bash_profile 添加环境变量 PATH=$PATH:/usr/local/mysql/bin
  5. 保存后加载执行该文件 source ~/.bash_profile
  6. 最后可以 mysql -u root -p 登录了
  7. 如果中文乱码,需要修改或者添加my.ini 文件。字符集以查询为准 show variables like 'char%';

Linux下解决Mysql root不用密码登录

登录mysql    mysql -u root -p 或 mysql

use mysql;

update user set  
authentication_string=PASSWORD("密码")  
where user='root';

update user set 
plugin="mysql_native_password";

flush privileges;

quit;

/etc/init.d/mysql restart;

mysql -u root -p 密码;

数据库的三范式

  1. 要保证每个字段的原子性,即不能再拆分了。
  2. 要保证表中每列都和主键相关,在联合主键的情况下。
  3. 确保每列和主键相关,而不是间接相关。
    参考:https://www.cnblogs.com/wangfengming/p/7929118.html

所有命令中的大小写无区分,sql 规范为关键字大写

  • 修改登录密码,修改后要重启动,在偏好设置中重启就可以了(未测试)
SET PASSWORD FOR'root'@'localhost'=PASSWORD('new password');

  • 常用文件操作命令:
CREATE DATABASE 库名 charset utf8;  # 创建数据库
DROP DATABASE 库名;  # 删除数据库
USE 库名;  # 使用某个数据库
show databases;  # 查看当前用户数据库
select DATABASE();  # 查看当前使用的数据库
show CREATE DATABASE 库名; # 查看数据库的创建信息
  
create table 表名{         
字段名 类型 数据参数,  # 创建表命令
字段名 类型 数据参数, 
 }
# create table info1(id int(11) not null auto_increment,name char(5) not null,PRIMARY KEY(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

select * from 表名;  # 查看表数据
DESC 表名;  # 查看表结构
show create table 表名;  # 查看表的创建信息
drop table 表名; # 删除表
ALTER table 表名 add 字段名 类型 字段修饰参数; # 添加表字段 数据表建立之后尽量不要随意修改表     
alter table 表名 drop 字段名; # 删除表字段 所有的删除命令不要随意使用,以免误操作
alter talbe 表名 modify 字段名 字段修饰参数; # 修改表字段修饰参数
alter talbe 表名 change 字段名(新) 字段名(旧)  字段修饰参数;  #  修改字段名字 新字段名必须和类型挨着,其他的可以颠倒位置
alter talbe 表名 add PRIMARY key(字段名);  # 修改主键,可以设置联合主键
alter talbe 表名 drop PRIMARY key;  # 删除主键
alter table 表名 alter 字段名 set default "值"; # 修改字段的默认值
alter talbe 表名 alter 字段名 drop default; # 删除字段的默认值
rename table 表名 to 新表名; # 修改表名
create table 新表名 select * from 表名 where 条件(如id = 1,可选); # 复制表, 主键、索引、触发器、外键不会被复制。
create table 新表名 like 表名; # 复制表结构,无数据。数据、触发器、外键不会被复制  

  • 常用数据操作命令:
insert into 表名 values(按照字段填写); # 向表中插入值
insert into 表名(字段) values(值); # 向表中指定字段插入值
insert into 表名(字段) values((值),(值)) # 向表中插入多个值
insert into 表名(字段) select 字段 from 表名 where 条件; # 查询并插入
  
delete from 表名 where 条件; # 删除表中的一条数据
delete from 表名; # 表中数据全部删除
truncate 表名; # 清空整张表,比delete快,主键也删,变成空白表
  
update 表名 set 字段 = 要修改的值 where 条件; # 修改表中的值,不加条件会改很多值,要修改多个字段用“,”间隔。
  
select * from 表名; # 查询一张表的所有字段
select 字段,字段 from 表名; # 按照字段查询一张表
select 字段,字段 as 别名 from 表名; # 查询制定字段 并起一个别名
select 字段(+、-、*、/)from 表名; #  可以对列进行数据运算
select distinct 字段名 from 表名;  # 自定字段去重,字段名可以跟多个,只有当所有字段重复才可以。
 
select * from 表名 where 条件 > 、<、 >= 、<=、=、 < >、 !=、is null 、is not null、and、or  # 各种条件查询
select * from 表名 where 字段 between 值 and 值; # 区间查询between 的值要小于 and 的值,前后包含
  
select * from 表名 where 字段 in(值,值,值);  # 集合查询
  
select * from 表名 where 字段 like 值%;  # 模糊查询 %值% 包含指定值,值% 以指定值结尾, %值 以指定值开头, _值% 每个下划线是一个占位符。
  
select * from 表名 order by 字段 ; # 排序 后面加desc为倒序,条件要加载order by 前面
select * from 表名 order by convert(字段 using gbk); # utf8 不支持中文排序,本条语句将中文字段转换为GBK格式后排序
   
select 聚合函数(字段) from 表名;
# 统计人员中最大年龄、最小年龄,平均年龄分别是多少
select max(age),min(age),avg(age) from 表名;


select 被分组的字段 from 表名 group by 分组字段 [having 条件字段]; # 分组查询 group by 后面如果跟条件 不能用where 只能用having
# GROUP_CONCAT(字段) 可以查看分组内的所有值 放在from前面
#执行优先级从高到低:where > group by > having 
#1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。
#2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数

select * from 表名 limit 起始值,显示数量; # 分页查询
  
select * from 表名1,表名2 where 表名1.字段 = 表名2.字段; # 多表查询。

select * from 表名1 LEFT JOIN 表名2 on 表名1.字段 = 表名2.字段; # 左连接查询。和多表查询的区别在于空字符段多表查询不显示
select * from 表名1 RIGHT JOIN 表名2 on 表名1.字段 = 表名2.字段; # 右连接查询。
select * from 表名1 INNER JOIN 表名2 on 表名1.字段 = 表名2.字段; # 内连接
select * from (select * from 表) as 随便一个表名; # 子语句查询
select * from 表名 where 条件 = (select 聚合函数 from 表名);# 聚合函数在一条查询中不能同时查询其他值。使用子语句查询解决。

select 字段1,字段2,字段3 if (条件,结果1,结果2) as '新字段名字' from 表名; # 添加if 条件 如果符合返回结果1,不符合返回结果2,并产生一个新的字段,名字由as命名。

# 多条件判断分类查询
#语法一:
SELECT
      CASE WHEN STATE = '1' THEN '成功'
                 WHEN STATE = '2' THEN '失败'
                 ELSE '其他' END 
       FROM 表;

 SELECT dname '部门',
         sum(case WHEN salary >50000 THEN 1 ELSE 0 end) as '富人',
         sum(case WHEN salary between 29000 and 50000 THEN 1 ELSE 0 end) as '小资',
         sum(case WHEN salary between 10000 and 29000 THEN 1 ELSE 0 end) as '平民',
         sum(case WHEN salary <10000 THEN 1 ELSE 0 end) as '吊丝'
 FROM person,dept where person.dept_id = dept.did GROUP BY dept_id

  • 视图,创建一个虚拟表,由查询定义,由多个实体表组成一个仅供查询的表 ,单表时可以删除修改数据,而多表时只可以修改,不能添加和删除。
create view 视图名称 as SQL语句(select 字段 form 表;); # 创建一个视图
drop viwe 视图名称; # 删除一个视图
alter view 视图名称 as SQL语句;# 修改一个视图

  • 触发器
    四要素:
  1. 监视地点(table)
  2. 监视事件(insert/update/delete)
  3. 触发时间(after/before)
  4. 触发事件 (insert/update/delete)
# 创建一个触发器
crete trigger 触发器名字(自己起) 触发时间(after/before) 触发事件 on 表名
for each row 
begin
      要执行的sql语句
end

# 删除一个触发器
drop trigger 触发器名字;

# 使用 new.受影响的字段,动态关联到监视语句
# 使用 old.从表中拿数据

show triggers; # 查看触发器

  • 存储过程,一般不会用
create PROCEDURE 函数名()
BEGIN
      多条SQL语句;
END
  
  # 封装SQL语句,使用时 call + 函数名使用,可以传递参数:出参out、入参in、出入参inout,默认为in,同时要佩带数据类型(带长度),使用出参时的语法
  set @变量名=初始值; 

  set @变量=初始值;
  select 字段into @变量 from 表名 where 条件;
  select @变量;
  # into 可以将查询结果赋值给变量,再通过select查询这个变量拿结果。
  #  存储过程可以使用 while if 等循环和判断函数
  show PROCEDURE status; # 查看存储过程
  drop procedure 函数名; # 删除存储过程

  • 部分函数
ROUND(x, y)   # 返回x的四舍五入的值,小数部分为y位
RAND()      # 返回0到1的随机数
  
AVG(col) # 返回指定列的平均值
COUNT(col) # 返回指定列中非NULL值的个数
MIN(col) # 返回指定列的最小值
MAX(col) # 返回指定列的最大值
SUM(col) # 返回指定列的所有值之和
GROUP_CONCAT(col)  # 返回由属于一组的列值连接组合而成的结果   
  
char_length(); # 返回字符串长度      
length(); # 返回字符串长度,字节单位
concat(); # 字符串拼接,其中一个为Null则返回Null
concat_ws('连接符','字符串'....); # 字符串拼接,可以给一个连接符,由Null则跳过
  
format(x,d); # 类似金额的数字格式化,x为数值,d为小数位数
  
INSERT(str,pos,len,newstr)
在str的指定位置插入字符串
      pos:要替换位置其实位置
      len:替换的长度
      newstr:新字符串
    例如:
        SELECT INSERT('abcd',1,2,'tt'); 结果为: 'ttcd'
        SELECT INSERT('abcd',1,4,'tt'); 结果为: 'tt'
    特别的:
        如果pos超过原字符串长度,则返回原字符串
        如果len超过原字符串长度,则由新字符串完全替换
INSTR(str,substr) # 返回字符串 str 中子字符串的第一个出现位置。

LEFT(str,len) #  返回字符串str 从开始的len位置的子序列字符。
        
LOWER(str) #变小写

UPPER(str) # 变大写

REVERSE(str)
    返回字符串 str ,顺序和字符顺序相反。
    例如:
        SELECT REVERSE('1234567') 结果为:7654321
  
SUBSTRING('str',位数) # 字符串截取

CURDATE()或CURRENT_DATE() #返回当前的日期
CURTIME()或CURRENT_TIME() #返回当前的时间
DAYOFWEEK(date)   #返回date所代表的一星期中的第几天(1~7)
DAYOFMONTH(date)  #返回date是一个月的第几天(1~31)
DAYOFYEAR(date)   #返回date是一年的第几天(1~366)
DAYNAME(date)   #返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);
FROM_UNIXTIME(ts,fmt)  #根据指定的fmt格式,格式化UNIX时间戳ts
HOUR(time)   #返回time的小时值(0~23)
MINUTE(time)   #返回time的分钟值(0~59)
MONTH(date)   #返回date的月份值(1~12)
MONTHNAME(date)   #返回date的月份名,如:SELECT  MONTHNAME(CURRENT_DATE);
NOW()    #返回当前的日期和时间
QUARTER(date)  #返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE);
WEEK(date)   #返回日期date为一年中第几周(0~53)
YEAR(date)   #返回日期date的年份(1000~9999)    
DATE_FORMAT(date, format) # 根据format字符串格式化date值

MD5() # 加密函数
password() # 加密函数,长度比md5长

  • 事物,把一组sql当成一条sql执行,一条失败则全部失败,只有全部成功才成功。
start TRANSACTION; # 开启事物,关闭mysql自己的自动提交方式。
COMMIT; # 提交所执行的结果(事物)

ROLLBACK;  # 回滚当前事物

1. 悲观锁,需要开启事物 加上for update
2. 乐观锁,不需要开启事物,开销小。

  • 用户相关操作
create user '用户名' @'IP地址' IDENTIFIED by '密码'; # 创建用户 % 代表所有IP
  
drop user '用户名'@'IP地址'; # 移除用户

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

show GRANTS for '用户名'@'IP地址'; # 显示用户权限
GRANT select,update,其他权限 ON 表名字 to '用户名'@'IP地址'# 授权用户可以访问那张表,和相关操作权限
GRANT all PRIVILEGES on *.* to '用户名'@'IP地址'; # 授权于用户所有表的所有权限,除了授权的权限。
 
REVOKE all PRIVILEGES on *.* from '用户名'@'IP地址'; # 移除用户所有权限。
FLUSH PRIVILEGES; # 权限修改需要刷新生效

mysqladmin -u用户名 -p原密码 password 新密码; # 本机修改用户密码
set password for '用户名'@'IP地址' = password('新密码'); # 直接设置密码,不用原密码
update mysql.user password = password('新密码') where user = '用户名'; # 通过更新数据库中用户表修改密码。需要刷新,不建议使用

  • 数据备份
mysqldump -u用户名 -p密码 库名字 > 路径;

  • 索引
  1. 普通索引,加速查找
# 在创建表时加入
key 索引名(字段,字段); # 或者 index
     
# 通过命令创建
create index 索引名 on 表名(字段);
    
# 删除索引
drop index 索引名 on 表名;
    
# 查看索引
show index from 表名; 
  1. 唯一索引,加速查找 + 唯一约束 + 可以存储一个空值
# 在创建表时加入
UNIQUE index 索引名(字段名);   
   
# 通过命令创建
create UNIQUE index 索引名 on 表名(字段);
    
# 删除索引
drop index 索引名 on 表名;
  1. 主键索引, 加速查找 + 唯一约束 + 不能为空
# 在创建表时加入
PRIMARY key(字段名);   
  
# 使用命令创建
alter table 表名 add PRIMARY key(字段);

# 使用命令删除
alter table 表名 drop primary key;
  1. 组合索引,就是在上面三种方式创建索引时加入多个字段为索引。

  • 各种数据类型:
bit(M) # 二进制类型,长度1-64位,默认M=1

tinyint(m) # 小整数,区分有符号和无符号,有符号 -128 ~ 127, 无符号 255。
int(M)  # 整形 区分有符号和无符号,有符号 - 2147483648 - 2147483647, 无符号 4294967295。默认11位宽度,要显示符号
bigint(m) # 大整数,区分有符号和无符号,有符号 - 9223372036854775808 ~ 9223372036854775807,无符号 18446744073709551615
 
decimal (m(,d)) # 准确的小数值,m为数字总个数,d是小数点后面的个数, m最大65,d最大30。
float(M,D)  # 单精度浮点数,m为数字总个数,d是小数点后面的个数, 数值越大越不准确
double(M,D) # 双精度浮点数,m为数字总个数,d是小数点后面的个数, 数值越大越不准确

 # 这类小数用来存储薪资,身高,体重,体质等参数
  
char(M) # 固定长度字符串,后面的长度跟多少就占多大空间,最多255,即使数据小于M,也会占用M的空间
varchar(M) # 可变字符类型,后面的长度表示最大长度,理论最大65535字符,实际超出21845后会转换为文本类型。
text # 用于保存边长的大字符串,最多可以存储65535(2**16 -1 )个字符,太长的字符不建议存入数据库,应该存入文件

enum # 枚举类型,如 sex enum('男','女','未知'),十种类型内使用为宜
set # 比枚举灵活一些,不常用

data # 日期类型 YYYY - MM - DD (区间1000-01-01 - 9999-12-31)
time # 时间值或持续时间 HH:MM:SS 区间 -888:59:59 - 888:59:59
year # 年份值 YYYY 区间 1901-2155 
datetime # 混合时间日期 YYYY-MM-DD HH:MM:SS 区间(1000-01-01 00:00:00 - 9999-12-31 23:59:59)
TIMESTAMP # 时间戳类型 YYYYMMDD HHMMSS 区间(1970-01-01 00:00:00 - 2037年某时)

  • 各种字段修饰参数:
not null # 不能为空
auto_increment # 自动增长 只能和主键和索引配合使用
PRIMARY key # 主键

你可能感兴趣的:(安装MySql和常用命令)