Mysql数据库相关命令及操作

目录

一.基本操作

1.SQL分类

2.相关命令及作用

二.数据类型

三.修饰符

四.函数及相关命令

1.数学函数

[2. 聚合函数](#2. 聚合函数)

3.字符串函数

[4.group by 分组](#4.group by 分组)

[5.order by 排序](#5.order by 排序)

6.limit

7.having

8.视图view

9.正则表达式

五.多表查询

1.子查询

[2.联合查询 纵向合并](#2.联合查询 纵向合并)

[3.交叉连接 横向合并](#3.交叉连接 横向合并)

4.内连接

5.外连接

6.自连接​

六.用户管理

[1 存放用户信息的表](#1 存放用户信息的表)

2.查看当前使用用户

3.新建用户

4.修改用户名称

5.删除用户

6.修改用户密码

7.破解密码

8.远程登录

9.用户权限管理

10.撤销权限


一.基本操作

1.SQL分类

  • 数据库:database

  • 表:table,行:row 列:column

  • 索引:index

  • 视图:view

  • 存储过程:procedure

  • 存储函数:function

  • 触发器:trigger

  • 事件调度器:event scheduler,任务计划

  • 用户:user

  • 权限:privilege

SQL语言规范

  • 在数据库系统中,SQL 语句不区分大小写,建议用大写

  • SQL语句可单行或多行书写,默认以 " ; " 结尾

  • 关键词不能跨多行或简写 select drop create

  • 用空格和TAB 缩进来提高语句的可读性

  • 子句通常位于独立行,便于编辑,提高可读性

SQL语句分类

  • DDL: Data Defination Language 数据定义语言

CREATE,DROP,ALTER

  • DML: Data Manipulation Language 数据操纵语言

INSERT,DELETE,UPDATE

软件开发:CRUD

  • DQL:Data Query Language 数据查询语言

SELECT

  • DCL:Data Control Language 数据控制语言

GRANT,REVOKE

  • TCL:Transaction Control Language 事务控制语言

COMMIT,ROLLBACK,SAVEPOINT

2.相关命令及作用

二.数据类型

选择正确的数据类型对于获得高性能至关重要,三大原则:

  1. 更小的通常更好,尽量使用可正确存储数据的最小数据类型

  2. 简单就好,简单数据类型的操作通常需要更少的CPU周期

  3. 尽量避免NULL,包含为NULL的列,对MySQL更难优化

三.修饰符

名称 含义
NULL 数据列可包含NULL值,默认值
NOT NULL 数据列不允许包含NULL值,*为必填选项
DEFAULT 默认值
PRIMARY KEY 主键,所有记录中此字段的值不能重复,且不能为NULL 一张表中只有一个主键
UNIQUE KEY 唯一键,所有记录中此字段的值不能重复,但可以为NULL
CHARACTER SET name 指定一个字符集

四.函数及相关命令

1.数学函数

函数名 函数值
abs(x) 返回 x 的绝对值
rand() 返回 0 到 1 的随机数
mod(x,y) 返回 x 除以 y 以后的余数
power(x,y) 返回 x 的 y 次方
round(x ) 返回离 x 最近的整数
round(x,y) 保留 x 的 y 位小数四舍五入后的值
sqrt(x) 返回 x 的平方根
truncate(x,y) 返回数字 x 截断为 y 位小数的值
ceil(x) 返回大于或等于 x 的最小整数
floor(x) 返回小于或等于 x 的最大整数
greatest(x1,x2...) 返回集合中最大的值,也可以返回多个字段的最大的值
least(x1,x2...) 返回集合中最小的值,也可以返回多个字段的最小的值

例子:

select abs(-100); #取绝对值

select rand(); #随机数 0到1 间

select mod(10,3); #10 除3 取余数

select power(2,3) #求2的3次方

select round(2.6); #返回离2.6最近的整数3

select sqrt(9); #返回9 的平方根

select truncate (1.235,2); #返回前两位值

select ceil (1.5); #返回大于等于1.5 的值

select floor (1.5); #返回小于等于1.5 的值

select greatest(1,2,3); #返回集合中的 最大值

select least(1,2,3); #返回集合中的最小值

2. 聚合函数

函数名 函数意
avg() 返回指定列的平均值
count() 返回指定列中非 NULL 值的个数
min() 返回指定列的最小值
max() 返回指定列的最大值
sum(x) 返回指定列的所有值之和

语法格式:

select 函数(*) from 表名; # * 代表所有字段

select 函数(单个字段) from 表名;

  • avg

例子: avg 平均值

select avg(age) from students; #avg 所有人的平均值

select avg(age) from students where classid=1; #求1班年龄平均值

  • count

例子: count 返回指定列中非 NULL 值的个数

select count(classid) from students; #统计非空classid 字段 一共有多少行记录

select count(distinct classid) from students; #一共有几个班级 去重

select count(classid) from students; #统计一共有多少个班级

select count(*) from students; #统计一共有多少条数据

聚合函数 count() 括号中是具体的字段 如果有null 值不统计

count() 括号中是 * 会统计 null

#count(*) 包括了所有的列的行数,在统计结果的时候,不会忽略列值为 NULL

#count(列名) 只包括列名那一列的行数,在统计结果的时候,会忽略列值为 NULL 的行

  • min

例子 : min 最小值

select min(age) from students;

  • max

例子:max 最小值

select max(classid) 班级最大序号 from students;

  • sum

例子:sum 求和

select sum(age) from students; #求年龄总和

select sum(age) from students where classid=1; #求1班的年龄总和

3.字符串函数

函数名 函数意义
concat(x,y) 将提供的参数 x 和 y 拼接成一个字符串
substr(x,y) 获取从字符串 x 中的第 y 个位置开始的字符串,
substr(x,y,z) 获取从字符串 x 中的第 y 个位置开始长度为 z 的字符串
length(x) 返回字符串 x 的长度
replace(x,y,z) 将字符串 z 替代字符串 x 中的字符串 y
upper(x) 将字符串 x 的所有字母变成大写字母
lower(x) 将字符串 x 的所有字母变成小写字母
left(x,y) 返回字符串 x 的前 y 个字符
right(x,y) 返回字符串 x 的后 y 个字符
repeat(x,y) 将字符串 x 重复 y 次
space(x) 返回 x 个空格
strcmp(x,y) 比较 x 和 y,返回的值可以为-1,0,1
reverse(x) 将字符串 x 反转
  • concat

例子:

#concat

select concat(name,classid) from students where stuid=1; #将姓名字段和班级字段合在一起

select concat(name,' ',classid) from students whereere classid=1; #加空格

  • substr

select substr(name,1,3) from students; # 获取name 字段的 前1到3 个字符

select name from students where stuid=25; #

select substr(name,3) from students where stuid=25;

select substr(name,1,3) from students where stuid=25;

其他

select length(name) from students where stuid=1; #返回数据的长度

select replace(name,"y",11) from students where stuid=1; # 将name 字段中的 y 换成11

select left(name,3) from students where stuid=1; #显示name字段左边三个字符 即最开始的三个

select right(name,3) from students where stuid=1; #显示name字段 右边三个字符 即最后三个

select repeat(name,2) from students where stuid=1; #将name 字段 重复显示2次

select lower(name) from students; #返回结果全是小写字母

select reverse(name) from students where stuid=1; # 反向显示字符串

4.group by 分组

语法:

SELECT "字段1", 聚合函数("字段2") FROM "表名" GROUP BY "字段1";

例子:

select gender,avg(age) from students group by gender; #按性别分组 求平均值

select classid,avg(age) from students group by classid; #班级的年龄平均值

5.order by 排序

语法:

SELECT "字段" FROM "表名" [WHERE "条件"] ORDER BY "字段" [ASC, DESC];

#ASC 是按照升序进行排序的,是默认的排序方式。

#DESC 是按降序方式进行排序。

例子:

select * from students order by age; #年龄升序排列

select * from students order by age desc; #年龄降序排

select * from students order by age desc limit 3;

select * from students where classid=1 order by age; #找出1班的人按升序排序

6.limit

select * from students order by age limit 5; #取前5个数据

select * from students limit 3,5; #跳过前3个 往后取 5个

7.having

HAVING 语句的存在弥补了 WHERE 关键字不能与聚合函数联合使用的不足

例子:

select classid,count(classid) from students group by classid having classid > 3;

select classid,count(classid) from students where classid > 3 group by classid;

select classid,count(classid) from students group by classid where classid > 3;

8.视图view

视图:数据库中的虚拟表,这张虚拟表中不包含真实数据,只是做了映射

格式:

create view 视图名 as 查询结果

例子:

create view v1 as select * from students where age > 50;

show tables;

select * from v1;

update students set age=90 where stuid=25;

select * from v1;

9.正则表达式

匹配 描述

^ 匹配文本的开始字符

$ 匹配文本的结束字符

. 匹配任何单个字符

* 匹配零个或多个在它前面的字符

  • 匹配前面的字符 1 次或多次字符串 匹配包含指定的字符串

p1|p2 匹配 p1 或 p2

...\] 匹配字符集合中的任意一个字符 \[\^...\] 匹配不在括号中的任何字符 {n} 匹配前面的字符串 n 次 {n,m} 匹配前面的字符串至少 n 次,至多 m 次 {,m} 最多m次 {n,} 最少n次 ? 匹配一个字符 例子: select name from students where name regexp '\^s' select name from students where name regexp 's'; select name from students where name regexp 's.i'; select name from students where name regexp '\^s\|l'; ## 五.多表查询 ### 1.子查询 例子: 先求出平均年龄 然后再找出比平均年龄大的 select avg(age) from students; #求平均年龄 select \* from students where age \> (select avg(age) from students); #再找出比平均年龄大的 例子: 利用子查询更新数据 SELECT avg(Age) FROM teachers #先计算出 教师表的 平均年龄 update students set Age=(SELECT avg(Age) FROM teachers) where stuid=25; # 再把第25个学生的年龄改成 教师表的平均年龄 例子: 将students 表里的 平均年龄,作为 值 赋给teacher表 update teachers set age= (select avg(age) from students) where tid=4; #将students 表里的 平均年龄,作为 值 赋给teacher表 ### **2.**联合查询 纵向合并 联合查询 Union 实现的条件,多个表的字段数量相同,字段名和数据类型可以不同,但一般数据类型是相同的. 例子: 合并两张表 纵向合并 select name,age from students union select name,age from teachers; 默认union 是会自动去重的 select \* from teachers union select \*from teachers; union all 是不会去重的 select \* from teachers union all select \*from teachers; ### 3.交叉连接 横向合并 例子: select \* from students cross join teachers; ​ select \* from students cross join teachers; ### 4.内连接 例子: select \* from students inner join teachers on students.teacherid=teachers.tid; update students set teacherid=2 where stuid=7; update students set teacherid=2 where stuid=22; select \*from students inner join teachers on students.teacherid=teachers.tid; ### 5.外连接 例子: select \* from students s left join teachers t on s.teacherid=t.tid; select \* from students s right join teachers t on s.teacherid=t.tid; ### 6.自连接 ​ #构建新表 create table emp (id int, name varchar(10),leaderid int); insert emp values(1,'cxk',null),(2,'wyf',1),(3,'zhang',2),(4,'li',3); select \* from emp e left join emp l on e.leaderid=l.id; select e.name emp_name, l.name leader_name from emp e left join emp l on e.leaderid=l.id; ## 六.用户管理 ### 1 存放用户信息的表 mysql 的用户 放在mysql数据库中的user表中 select user,host,authentication_string from mysql.user; +---------------+-----------+ \| user \| host \| +---------------+-----------+ \| mysql.session \| localhost \| \| mysql.sys \| localhost \| \| root \| localhost \| +---------------+-----------+ ​ ​ root@localhost 默认存在的, 并且只能 本地登录无法远程登录 ​ #新版本 select user,host,authentication_string from mysql.user; ### 2.查看当前使用用户 (root@localhost) \[(none)\]\> select user(); ### 3.新建用户 格式: CREATE USER '用户名'@'来源地址' \[IDENTIFIED BY \[PASSWORD\] '密码'\]; ---------------------------------------------------------------------------------------------------------- '用户名':指定将创建的用户名 '来源地址':指定新创建的用户可在哪些主机上登录,可使用IP地址、网段、主机名的形式,本地用户可用localhost,允许任意主机登录可用通配符% '密码': 若使用明文密码,直接输入'密码',插入到数据库时由Mysql自动加密; 若使用加密密码,需要先使用SELECT PASSWORD('密码'); 获取密文,再在语句中添加 PASSWORD '密文'; 若省略"IDENTIFIED BY"部分,则用户的密码将为空(不建议使用) ---------------------------------------------------------------------------------------------------------- ​ 'USERNAME'@'HOST' '用户名'@'来源地址' ​ @'HOST': 主机名: user1@'web1.kgc.org' IP地址或Network 通配符: % _ 示例:[email protected].%.% user2@'192.168.1.%' kgc@'10.0.0.0/255.255.0.0' 例子: mysql -u用户名 -p密码 -h远程主机 -P端口号 ​ set global validate_password_policy=0; set global validate_password_length=1; ​ create user test@'192.168.%.%'; #建立远程登录用户 create user zhou@'192.168.91.%' identified by '123123'; #可以后面加密码 create user test1 identified by '123123'; select user,host,password from mysql.user; #查看字段 密码为空 ​ mysql -utest -h192.168.91.100 -p密码 #使用其他主机登录 ​ alter user test@'192.168.91.%' identified by 'abc123; # 修改密码 新版可以 旧版的mariadb 不可以 ALTER USER test@'192.168.%.%' IDENTIFIED BY 'centos'; ​ ### 4.修改用户名称 格式: rename user '旧名字' to '新名字; 例子: rename user 'zhangsan'@'192.168.91.%' to 'lisi'@'192.168.91.%'; ### 5.删除用户 格式: drop user 用户名@主机名 例子: drop user liwu@'%'; ### 6.修改用户密码 密码有安全性策略可以修改取消 set global validate_password_policy=0; set global validate_password_length=1; #修改密码策略 格式: SET PASSWORD = PASSWORD('abc123'); #只能改自己当前 ​ set password for '用户' = password('密码'); # 例子: set password = 'abc123'; #给当前用户修改密码 ​ set password for 'lisi'@'192.168.91.%' = 'abc123'; #给其他用户修改密码 ### 7.破解密码 **修改配置文件** vim /etc/my.cnf \[mysqld

skip-grant-tables

#数据库的单用户模式 此模式下权限受到限制,很多功能无法使用, 除了破解密码不要加此项

skip-networking #MySQL8.0不需要


#然后清空密码

update mysql.user set authentication_string='' where user='root' and host='localhost';

#注意刷新后生效

flush privileges;

8.远程登录

mysql -utest -h192.168.91.100 -p'密码' -P端口号

例子:

vim /etc/my.cnf

mysqld

port = 9527

systemctl restart mysqld

客户机

mysql -utest -h192.168.91.100 -p'Admin@123' -P9527

9.用户权限管理

权限类别:

  • 管理类

  • 程序类

  • 数据库级别

  • 表级别

  • 字段级别

管理类:

  • CREATE USER

  • FILE

  • SUPER

  • SHOW DATABASES

  • RELOAD

  • SHUTDOWN

  • REPLICATION SLAVE

  • REPLICATION CLIENT

  • LOCK TABLES

  • PROCESS

  • CREATE TEMPORARY TABLES

库和表级别:针对 DATABASE、TABLE

  • ALTER

  • CREATE

  • CREATE VIEW

  • DROP INDEX

  • SHOW VIEW

  • WITH GRANT OPTION:能将自己获得的权限转赠给其他用户

数据操作

  • SELECT

  • INSERT

  • DELETE

  • UPDATE

字段级别

  • SELECT(col1,col2,...)

  • UPDATE(col1,col2,...)

  • INSERT(col1,col2,...)

所有权限

  • ALL PRIVILEGES 或 ALL

查看权限

SHOW GRANTS FOR 'lisi'@'%';

#USAGE权限只能用于数据库登陆,不能执行任何操作;USAGE权限不能被回收,即 REVOKE 不能删除用户。

授予权限

GRANT语句:专门用来设置数据库用户的访问权限。当指定的用户名不存在时,GRANT语句将会创建新的用户;当指定的用户名存在时, GRANT 语句用于修改用户信息。

格式:

GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'来源地址' [IDENTIFIED BY '密码'];


#权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔,如"select,insert,update"。使用"all"表示所有权限,可授权执行任何操作。

#数据库名.表名:用于指定授权操作的数据库和表的名称,其中可以使用通配符"*"。例如,使用"kgc.*"表示授权操作的对象为 kgc数据库中的所有表。

#'用户名@来源地址':用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。来源地址可以是域名、IP地址,还可以使用"%"通配符,表示某个区域或网段内的所有地址,如"%.kgc.com"、"192.168.80.%"等。

#IDENTIFIED BY:用于设置用户连接数据库时所使用的密码字符串。在新建用户时,若省略"IDENTIFIED BY"部分,则用户的密码将为空。


例子:

GRANT select ON kgc.* TO 'zhangsan'@'localhost' IDENTIFIED BY '123456';

#允许用户 zhangsan 在本地查询 kgc 数据库中 所有表的数据记录,但禁止查询其他数据库中的表的记录。

GRANT ALL [PRIVILEGES] ON *.* TO 'lisi'@'%' IDENTIFIED BY '123456';

#允许用户 lisi 在所有终端远程连接 mysql ,并拥有所有权限。

grant all on *.* to lisi@'192.168.91.%';

grant all on *.* to test@'192.168.91.%';

flush privileges;

#不要忘记刷新

quit

​GRANT ALL ON *.* TO 'cxk'@'%' IDENTIFIED BY '123456';

10.撤销权限

格式:

REVOKE 权限列表 ON 数据库名.表名 FROM 用户名@来源地址;

例子:

REVOKE ALL ON *.* FROM 'cxk'@'%';

revoke all on *.* from zhou@"192.168.91.%";

相关推荐
oneouto17 分钟前
MySQL5.7导入MySQL8.0的文件不成功
mysql
冬瓜的编程笔记26 分钟前
【MySQL成神之路】MySQL查询用法总结
数据库·sql
StarRocks_labs27 分钟前
StarRocks Community Monthly Newsletter (Apr)
数据库·starrocks·数据查询·routine load·stream load
Gauss松鼠会1 小时前
从数据到智能:openGauss+openEuler Intelligence的RAG架构实战
数据库·架构·database·opengauss·gaussdb
神码小Z1 小时前
支持向量存储:PostgresSQL及pgvector扩展详细安装步骤!老工程接入RAG功能必备!
数据库·向量数据库
惊起白鸽4501 小时前
postgreSQL日常维护
数据库
Musennn1 小时前
SQL 数值计算全解析:ABS、CEIL、FLOOR与ROUND函数深度精讲
数据库·sql
潘yi.1 小时前
PostgreSQL日常维护
数据库·postgresql
2501_911121233 小时前
PostgreSQL日常维护
数据库·oracle
看到千里之外的云3 小时前
Oracle 11g post PSU Oct18 设置ssl连接(使用jks)
数据库·oracle·ssl