目录
MySQL基本操作
语义检查:判断SQL语句的类型
- DDL:数据定义语言
- DCL:数据控制语言
- DML:数据操作语言
- DQL:数据查询语言
1.登陆退出MySQL数据库
# (1) 登陆
mysql -u用户名 -p -h ip地址
root用户登陆 :
mysql -uroot -p
select user() #查询当前登陆用户
select now() #查询时间
# (2) 设置密码
set password = "123"
set password = "" --去除密码
# (3) 退出
q 或者 exit
2.创建用户连接远程数据库
远程数据库IP地址: 192.168.138.133
# 给具体IP下设置一个账号,用来连接远程数据库
"""
create user 用户名@"192.168.138.1"/"192.168.138.%"/"%" identified by "密码"
用户名@'%' 所有地址
用户名@'10.0.0.5%' 只允许IP地址末尾51~59的连接
用户名@'localhost' 只允许本地连接
"""
# 创建用户
mysql> create user lianxi@"192.168.138.1" identified by "111"
# 查看所有用户
mysql> select user,host from mysql.user;
# 修改用户
mysql> alter user lianxi@'localhost' identified by '123';
# 删除用户
mysql> drop user zhangkai@'localhost';
# 连接远程数据库
mysql -u lianxi -p -h 192.168.138.133
# 查询当前用户有什么权限,for 后面怎么创建的怎么查询
show grants for "lianxi"@"192.168.138.1"
# 在远程数据库给用户添加执行权限
"""
语法:
grant 权限 on 数据库名.表名 to "用户名"@"IP地址" identified by "密码"
如果不更改密码,后面的 [ identified by "密码" ] 可不加
"用户名"@"IP地址" :
常用权限:
select 查询权限
insert 添加权限
update 修改权限
drop 删除权限
all 所有权限
* 所有数据库,所有表
"""
# 授予查询,添加权限
grant select,insert on *.* to "lianxi"@"192.168.138.1";
# 授予所有权限
grant all on *.* to "lianxi"@"192.168.138.1";
# 移除权限
revoke select on *.* from "lianxi"@"192.168.138.1";
# 移除所有权限
revoke all on *.* from "lianxi"@"192.168.138.1";
3.本地管理员用户密码忘记了
解决思路是:
- 关闭MySQL服务
mysqld_safe
模式启动,即关闭MySQL的用户密码验证模块,也就是不加载授权表,然后禁止远程连接,仅能通过本地socket链接- 无密码登登录到MySQL
- 修改密码
- 重启MySQL
# 启动mysql:
方式二:sudo service mysql start
# 停止mysql:
方式二:sudo service mysql stop
# 停止mysql - 如果systemctl命令不好使,没有配置,使用上边命令
[root@cs mysql]# systemctl stop mysqld
# 启动安全模式,不加载授权表,然后禁止远程连接,&是后台执行
[root@cs mysql]# mysqld_safe --skip-grant-tables --skip-networking &
# 进入mysql,无用户无密码
[root@cs mysql]# mysql
# 修改密码前,先加载授权表
mysql> flush privileges;
# 修改root用户密码
mysql> alter user root@'localhost' identified by '123';
mysql> exit;
# 杀死安全模式进程
[root@cs mysql]# pkill mysqld
# 启动mysql
[root@cs mysql]# systemctl start mysqld
4.操作数据库(操作文件夹)
MySQL自带的数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
各库解释如下:
information_schema
,虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等。performance_schema
, MySQL 5.5开始新增一个数据库,主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件、锁等现象 。mysql
,授权库,主要存储系统用户的权限信息。sys
库所有的数据源来自performance_schema
,目标是把performance_schema
的把复杂度降低,让DBA能更好的阅读这个库里的内容。让DBA更快的了解数据库的运行情况。test
,MySQL数据库系统自动创建的测试数据库。test库在MySQL中特殊存在,一般部署完mysql后应当删除该库,并规定不能创建以test
和test_
字符开头的数据库。因为在MySQL中,test库对任意用户都有管理员权限,
"""
查看新建数据库位置:
Linux:
sudo find / -name db100 #/var/lib/mysql
sudo su root 切换到root用户
cd /var/lib/mysql
Windows:
D:MySQL5.7mysql-5.7.25-winx64data => 看到数据库文件夹
"""
# create database & create schema -- schema相当于database
# (1) 增 create ->创建数据库
# 编码集一般:utf8,utf8mb4(比utf8多编译了复杂的中文等),gbk
mysql> show charset; # 查看字符集
create database 数据库名 charset 编码集;
create database lianxi charset utf8; # 创建名为lianxi 的数据库
# (2) 查 show
show databases; # 查看所有数据库
show create database lianxi ; # 查看建库语句
# (3) 改 alter
alter database lianxi charset gbk ; # 修改数据库编码集
# (4) 删 drop
drop database lianxi # 删除数据库
5.操作数据表(操作文件)
# 1.操作数据表(操作文件)
use lianxi # 选择数据库
select database() # 查询当前库
# (1) 增 create
创建数据表语法 :
create table 表名(字段1 类型1,字段2 类型2,....)
#创建t1表
create table t1(id int , name char(12),sex varchar(10))
# (2) 查
show tables; # 查看所有数据表
show cteat table t1 ; #查看建表语句,查看表结构
show cteat table t1 G; #查看建表语句,查看表结构,垂直显示
desc t1 # 查看表字段信息
# (3) 改 alter
# modify 更改字段类型
alter table t1 modify id char(10); #把id字段改成字符串类型
# change 更改字段名称+类型
alter table t1 change name sex int; #把name字段改sex,类型改int型
# add 添加字段
alter table t1 add age int ;
# drop 删除字段(删除表中列) 不能删除主键字段
alter table t1 drop age;
# rename 更改表名
alter table t1 rename t2 # 把表名t1改成t2
# (4) 删 drop
drop table t1 ; #删除t1数据表
# 2.复制表相关的操作:
# (1)复制一份一摸一样的表t3,表结构和t1一样,不复制记录
create table t3 like t1;
# (2)创建一个表,复制另一张表的指定字段和记录
create table t4(
name char(10),
sex char(10),
primary key(name,sex) --注意,key不会复制: 主键、外键和索引,所以这里需要自己建立主键
)
select name,sex from t1;
# (3)创建一个表,复制另一张表的指定字段和记录,但是创建的表字段又不想跟被复制表字段一致
create table t5(
user char(10),
num char(10),
primary key(user,num)
)
select name as user,sex as num from t1; -- 给字段起别名
6.操作记录(操作表内表格数据)
# (1) 增 insert
# 一次插入一条数据
insert into t1 (id,name) values (1,"熊大")
# 一次插入多条数据
insert into t1 (id , name) values (2,"熊二"),(3,"光头强"),...
# 不指定字段插入(按字段顺序插入)
insert into t1 values (4,"舒畅")
# 可以具体指定个别字段插入(其他字段自动填充null)
insert into t1 (name) values ("沈腾")
# (2)查 select
select * from t1; # 查询表中所有数据
select id,name from t1 ; #查询指定字段数据
# (3) 改 update
语法:
# update 表名 set 需要修改的字段=值 where 参考字段>=<值
update t1 set name = "郭麒麟" where id = 1 #id=1那行的name改成郭麒麟
# (4) 删除 delete (删除表中行)
语法:
# delete from 表名 where 条件
delete from t1 where id = 1 # 删除id = 1 那行
delete from t1 #删除表中所有数据,但不能重置自增字段
truncate table t1 #重置表(删除所有数据 + 重置自增字段)
7.数据类型
# (1) 整型
小整型 :tinyint 1个字节 有符号: [-128 ~ 127] 无符号 [0 ~ 255] unsigned
大整型 : int 4个字节 有符号: [-21亿 ~ 21个亿左右] 无符号 [0 ~ 42亿]unsigned
# (2) 浮点型
# float(255,30) 30代表小数保留30个,整数+小数位数总长= 255
float #单精度 默认保留5位小数
double # 双精度 默认10多位
decimal #金钱类型 默认保留整数
# (3) 字符串
char (11) #定长:固定开辟11个字符长度空间(身份证,手机号,银行卡)
varchar(11) #变长:动态最多开辟11个字符长度的空间( 评论,个性签名,广告 )
text #文本类型: (毕业论文,文章,长篇小说)
select concat(id,name) from t1; # 字段的拼接
# (4) 枚举和集合
enum 枚举 : 从列出来的数据当中选1个 (性别)
set 集合 : 从列出来的数据当中选多个 (爱好) 自动去重
create table t2(
sex enum("男性","女性") ,
hobby set("大保健","吃药","吃大腰子")
);
insert into t2 values ("男性","大保健,大保健,大保健") # 集合自动去重,只能添加一个大保健
# (5) 时间类型
date YYYY-MM-DD 年月日 (出生日期,结婚日期,春运,项目启动时间)
time HH:MM:SS 时分秒 (长跑记录,体育竞赛)
year YYYY 年份 (化石,红酒年份)
datetime YYYY-MM-DD HH:MM:SS 年月日 时分秒 (订单流水,日志时间)
create table t1(d date , t time , y year , dt datetime); #创建表
insert into t1 values("2021-01-07" , "09:22:40" , "2021" , "2021-01-07 09:22:40");
insert into t2 values (20200101,152030,2020,20200101153030);
insert into t1 values(now(),now(),now(),now()) #自动添加当前时间
timestamp YYYYMMDDHHMMSS (时间戳) 自动更新时间 (系统自动写入,不需要手动更新) (用来记录修改的时间)
create table t2(dt datetime , ts timestamp); #创建表
insert into t2 values(null , null); # 插入null时,自动更新时间
insert into t2 values(20400107092930 , 20300107092930);
insert into t2 values(20400107092930 , 20400107092930); error 自动更新时间戳超过2038年