当前位置: 首页 > news >正文

SQL语句一文通

(一) 四种分类

DDL:数据定义语言(类似int double)是用来定义数据库对象的
DML:增删改语言
DQL:查询语言
DCL:创建数据库用户,控制数据库的访问权限

(二)DDL语句过手:

数据库操作

1.show databases; ——展示目前已有的数据库
2.create database 数据库名; ——创建一个数据库(注意,重复创建相同数据库会报错,除非像下一条写:)
3.create database if not exists 数据库名;
4.select database(); ——查询当前所在的数据库
5.drop database 数据库名; ——删除某个数据库(注意:重复删除会报错,除非像下一条写:)
6.drop database if not exists 数据库名
7.use 数据库名; ——(使用数据库)
8.create database if not exists 数据库名 default charset utf8mb4; ——使用字符utf8mb4字符作为标准

表的创建与查询
1.在当前库中创建一个表格

create table 表名(
字段1 数据类型,comment "....",
字段2 数据类型,comment "....",
字段3 数据类型,comment "...."
);

2.查询当前数据库中的表格

show tables;

3.查询表结构

desc 表名;

4.查询创建表的创建语句

show create table 表名;

表的修改
1.增加字段

alter table 表名 add 字段 数据类型;

2.修改数据类型

alter table 表名 modify 已有字段名 新数据类型;

3.修改字段名和数据类型

alter table 表名 change 旧字段名 新字段名 数据类型;

4.修改表名

alter table 旧表名 rename to 新表名;

表的删除
1.删除表

alter table 表名 drop 字段名;

2.删除再重新创建(重置表)

truncate table 表名

(三)数据库中的数据类型:

1.数值类型
整数型:
tinyint 1byte
smallint 2byte
mediumint 3byte
int/integer 4byte
bigint 8byte
浮点型:
float 4byte
double 8byte
decimal
注意:decimal是小数,但要确定精度和标度,精度就是数字有多少位,标度就是小数点后有几位
有符号类型和无符号类型
上述的每一种整数型和浮点型数据都有有符号类型无符号类型两种形式,有符号就代表范围包括负数,无符号就代表范围仅包括正数。

age tinyint signed #有符号类型
age tinyint unsigned #无符号类型
score double(4,1) #成绩在4位及4位以下,小数点后面为1位。

2.字符串类型
Blob:二进制数据
tinyblob
blob
mediumblob
longblob
Text:文本数据
tinytext
text
mediumtext
longtext
(按照存储空间大小向下依次递增)

char:定长字符串数据
char(10):即使存储一个字符也会占用十个字符的长度
varchar:变长字符串数据
varchar(10):存储一个字符就占用一个字符的长度,它是最大10个字符长度
注意:相较于varchar,char的性能更好一些,因为varchar还需要计算具体的字符串长度

3.日期时间类型
date
time 时间值或者持续时间
year
datetime 几年几月几日几时几分几秒
timestamp 几年几月几日几时几分几秒

(四)DML语句过手

插入数据:

# 批量添加:
insert into 表名 values(...),(...); # 括号里面与各列内容一一对应
# 单个添加:
insert into 表名 values(...);
insert into 表名(...) values(...); # 前一个括号是表头,后一个括号是实际内容 

示例:
在这里插入图片描述
修改数据
1.修改单个数据

update 表名 set  字段 = 值1 where;

注意:一定要注明where(范围),如果没有设置where则默认修改整张表的数据,那样就会出现错改。
示例:
将name为sss的那一个数据修改name为12345
在这里插入图片描述
2.修改多个数据

update user set 字段1 = value1 ,字段2 = value2 where 字段3 = value3

示例:
在这里插入图片描述
3.修改所有数据
不带任何限制,也就是不带where

update 表名 set 字段 = value;

示例:
在这里插入图片描述
删除数据
1.使用delete
1.1删除一行数据

delete from 表名 where ;

如果没有where则意味着删除所有的数据,慎行!!!
示例:
在这里插入图片描述
1.2删除所有数据

delete from 表名

在这里插入图片描述

2.使用update
如果使用update则将值改为null即可

(五)DQL语句过手:

查询:

1.基础查询:
1.1查询多个字段:

select 字段1 ,字段2 ,字段3 from 表名:
select * from 表名;

1.2设置别名:

select 字段1 as ziduan1,字段2 as ziduan2,字段3 as ziduan3;

1.3删除重复记录:

select 字段列表 from 表名

总体示例:
在这里插入图片描述
2.条件查询
2.1也就是说在后面加上where,

select * from 表名 where 

2.2如果寻求为空的数据,则:

select * from 表名 where 字段 is null

如果不为空,则:

select * from 表名 where 字段  is not null

2.3寻求范围数据

select * from 表名 where 字段<=...  && 字段 >=...;
select * from 表名 where 字段<=...  and 字段 >=...;
select * from 表名 where 字段 between ... and ...;

MySQL语句中,= 不是赋值符号,而是判断的等于符号

select * from user where IDCard = 1 or IDCard = 2 or IDCard = 3;

in
查找在这个序列范围的数据

select * from user where IDCard in (1,2,3);

like 占位符
_占位符

select * from user where name = '__';
# _ 为单一字符,% 为任意字符,因此'__'就意味着两个长度的字符

%占位符

select * from user where name like '%s';
# 可使用这个方法寻找含有特数字符的语句

2.4使用聚合函数

# 统计数据的数量,null值不参与计算,因此计算数据量的时候,括号中不要写某一栏的名称,写*就可以了
select count() from user;
# 统计某一列数据的总和。
select sum() from user;
# 取某一列数据的最大值/最小值
select max() / min() from user;
# 取某一列数据的平均值
select avg() from user;

3.分组查询:

# 逗号分割开了几栏内容,
select Code ,count(*), max(Code)from user group by Code;# 查询年龄小于 7 的员工,并根据性别分组 , 获取数量大于等于3的工作地址
update user set Code = '女' where id = 1;
select * from user;
select Code, count(*)from user where age < 7 group by Code having  count(*) < 3;

注意:where要写在from 表名后面 ,group要写在where 后面, having要写在group后面。简洁说来就是
select … from 表名 where group by having
并且注意:select 后面的字段要么是聚合函数要么就要出现在group by 后面,所以类似

select Code from user group by name

这样的句子是不合法的
至于where和having的区别在句子格式里面就很能体现,where实在分组之前进行过滤,having是在分组之后进一步过滤

问:如果满足了查询字段和分组字段一致,但是又在此基础上查询其它字段又会发生什么呢?例如:

select name, Code from user group by Code

答:没有意义。

4.分组查询
关键词:order by
asc:升序排序(默认的,也可以不写)
desc:降序排序
这个排序对日期也有效。

select * from user  order by 字段1, order by 字段2;
# 这段代码的意思不是说先按照字段1进行排序,再按照字段2进行排序。而是先按照字段1排序,如果字段1一致,那就按照字段2排序。

注意:order by 排序是排字符的,不仅仅可以排数值。例如order by gender,gender的值为 男 女。对中文字符的排序是按照拼音排序的,n-a-n 和n-v
n和n相同,a 的拼音顺序在 v 前面,因此最终排下来是男在前,女在后。但是在实际的语句中,我不知道为什么这句话不起作用了,考虑到这个点不是很重要,因此就先不管了。
注意:如果想要指定排序规则的话,则可以在写完字段后写上

collate utf8mab4_unicode_ci

后续跟上(也可以不跟)排序规则 asc / desc。
总体代码如下:

order by 字段 collate utf8mb4_unnicode_ci asc/desc; 

5.分页查询
关键词:limit
不同的数据库有其不同的关键词,例如oracle数据库的分页关键词是rownumber。
示例:

# 查询第一页,查询十条记录
select * from user limit 0,10; # 查询第一页可以不用写0
select * from user limit 10;# 查询第二页,查询10条记录
select * from user limit 10,10; 

注意起始索引 = (页码 - 1) * 每一页的查询记录数。可以根据代码中的两个参数,算出来到底是要查找哪一页。
between a and b ;区间范围是[a,b]

DQL语句的执行顺序
from
where
group by
having
select
order by
limit
可以在其中实现表名的简化操作:

 # 可以在user后面写一个简写,后面的字段也可以改成select * from user u where u.age > 12;

(六)DCL语句过手:

DCL的作用就在于,管哪些用户可以访问数据库服务器,以及那些用户可以访问什么数据库

管理用户:

1.创建用户:
1.1 创建只能在本机访问的用户

create 表名 '用户名'@'访问主机地址' identified by '密码';
# 例如:
create user 'itcast'@'localhost' identified by '123456';
# 意思就是说在user这个表里面创建一个itcast的用户,只能在localhost访问也就是说只能在本机访问,密码是123456。

注意用户名@访问权限 是一个整体,@访问权限不可以隔开(用户名和**@可以隔开,但不推荐这么做,因为代码出来很难看**)

如果重复创建同一个用户名就会报错:

[HY000][1396] Operation CREATE USER failed for 'itcast'@'localhost'

下图是用户权限图:
在这里插入图片描述
只有两个值 Y(有权限)和 N(无权限),可以看见新创建的itcast的各项值都是N,这也意味着它没有访问某些数据库的权限
1.2 创建能在任意主机访问的用户

create user 'jm'@'%' identified by '123456';
# 注意这里的通配符为%

2.修改密码:
格式:

alter 表名 '用户名'@'访问的主机地址' identified with 密码的加密方式 by '修改后的密码';

例如:

# 修改user的jm用户密码为1234
alter user 'jm'@'%' identified with mysql_native_password by '1234';

3.删除用户

drop 表名'用户名'@'访问的主机地址'

例如:删除jm这个用户

drop user 'jm'@'%'

权限控制:

MySQL具有很多权限,创建/删除/更改/插入/查找等,如下:
在这里插入图片描述
1.查询权限:

show grants for '用户名'@'访问主机地址';

例如:查询itcast的权限,结果显示如下:
在这里插入图片描述
USAGE就表名这个用户只有连接并登陆上MySQL的权限,其他什么权限都没有,能有这个标志就代表那些插查改删等一系列常用权限它一个没有

2.授予权限:

grant 权限列表 on 数据库名.表名 to '用户名'@'访问主机的地址';

例如:将user的所有表的所有权限全部给itcast这个用户

grant all on fjm01.fjm01_table to 'itcast'@'localhost';

最终实现效果如下:
在这里插入图片描述
注意:即使数据库名和表名之间隔了一层文件也没关系,不需要把中间的所有文件名全部写上来,跟个文件路径似的。
3.撤销权限:

revoke all on 数据库名.表名 from '用户名'@'访问主机地址';
# 其实撤销的句式大致可以分为revoke on from,授予的句式可以分为grant on to 

例如:撤销对itcast用户的一切权限

revoke all on fjm01.fjm01_table from 'itcast'@'localhost';

此时效果:
在这里插入图片描述
里面的那个*.*就代表将所有数据库的所有表都开放给这个用户,实现一个超级管理员

http://www.dtcms.com/a/392285.html

相关文章:

  • Ubuntu22.04 双显卡系统使用集显 DRM 渲染的完整流程记录
  • Coze源码分析-资源库-删除工作流-后端源码-IDL/API/应用/领域
  • MySQL库和表的操作语句
  • python、类
  • NumPy高级技巧:向量化、广播与einsum的高效使用
  • GD32VW553-IOT 基于 vscode 的 msdk 移植(基于Cmake)
  • Filter 过滤器详解与使用指南
  • 养成合成小游戏抖音快手微信小程序看广告流量主开源
  • 在 Ubuntu 系统下安装 Conda
  • ac8257 android 9 SYSTEM_LAST_KMSG
  • ARM 架构与嵌入式系统
  • ARM(14) - LCD(1)清屏和画图形
  • Linux第十九讲:传输层协议UDP
  • 计算机网络学习(四、网络层)
  • 开启科学计算之旅:《MATLAB程序设计》课程导览
  • MATLAB | 数学模型 | 传染病 SIR 模型的参数确定
  • MATLAB基本运算(2)
  • 小红书数据分析面试题及参考答案
  • SpringCloudStream:消息驱动组件
  • ret2text-CTFHub技能树
  • VirtualBox 7 虚拟机的硬盘如何扩大?
  • React新闻发布系统 权限列表开发
  • 23种设计模式之【策略模式】-核心原理与 Java 实践
  • 前端实战从零构建响应式井字棋游戏
  • Java中的equals()与hashCode()
  • 【绕过open_basedir】
  • 如何用户细分
  • 福彩双色球第2025109期篮球号码分析
  • 思考:客户端负载均衡和服务器负载均衡有什么区别?
  • 网络编程day04/05原始套接字