MySQL中使用SQL语言

什么是SQL?

Structured Query Language:结构化查询语言

其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为"方言"。

在前几篇文章中我们已经讲过SQL一些常见语法。具体可以参考:https://blog.csdn.net/2201_75573294/article/details/155857381?fromshare=blogdetail&sharetype=blogdetail&sharerId=155857381&sharerefer=PC&sharesource=2201_75573294&sharefrom=from_link

另外补充一些SQL语言的使用规则:

  • SQL语句可以单行或多行书写,以分号结尾。

  • 可使用空格和缩进来增强语句的可读性。

三种注释方法:

  • MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。

  • 单行注释:-- 注释内容 或 # 注释内容(mysql特有),注意这里的--后面要有一个空格,注释才生效

  • 多行注释: /* 注释 */

关于SQL语言的分类在参考文章里也有说过,但有些没有很详细的说明,这里会详细再讲一遍,下面的操作我们会在和lunix连接的navicat工具中进行操作演示,因为是可视化的所以比较清楚,工具使用不清楚的可以参考博客:https://blog.csdn.net/2201_75573294/article/details/155596211?fromshare=blogdetail&sharetype=blogdetail&sharerId=155596211&sharerefer=PC&sharesource=2201_75573294&sharefrom=from_link

一、DDL语言:操作数据库、表

1.操作数据库

1)创建数据库

sql 复制代码
create database 数据库名称;

当然小写字母也是可以的

有时候我们创建数据库可以在后面加上判断,结果是一样的,所以可以不带

sql 复制代码
 create database if not exists 数据库名称;

创建数据库,并指定字符集

这里字符集的意思就是数据库存储和处理文本数据时的编码规则

常见的字符集:utf8mb4(全球所有语言)、utf8(MySQL的)、gbk(简体中文)、latin1(西欧语言),字符集就是用来避免乱码,我们输入数据时支不支持该种文字格式

sql 复制代码
 create database 数据库名称 character set 字符集名;

注意这里也是创建表,所以已经存在的数据库是可以成功使用这个语句

建立数据库stu2并指定字符集,如果没指定,就会默认utf8mb4,我们建立的stu1就是这种字符集

当我们在stu2中建立表格其中的字段名也就是列名类型是字符类型,在该字段输入数据的时候字符串是中文就会报错,虽然输入的字符串但是不支持中文格式,但在stu1可以,就是因为这个字符集的设置

当然上面建立数据库的几种情况是可以一起使用的

创建db4数据库,判断是否存在,并指定字符集为gbk

sql 复制代码
 create database if not exists db4 character set gbk; 

所讲到的sql语句并不是固定的,我们只需要注意结构不错,很多语法都是可以搭配使用在同一个句子,就相当于学习了一门语言

2)查询数据库

sql 复制代码
show databases;

查询某个数据库的字符集:其实就是查询某个数据库的创建语言

sql 复制代码
show create database 数据库名称;

这里navicat工具语句可以不注释,只需要选中你想运行的句子就可以

3)修改数据库

修改数据库的字符集

sql 复制代码
 alter database 数据库名 character set 字符集名;

注意:执行语句后如果显示成功,但是查看发现没变的时候,一定要右击点击刷新,基本上一些语句都是要刷新后才会更新。

4)删除数据库

sql 复制代码
 drop database 数据库名称;

和创建一样也可以加一个判断:

sql 复制代码
drop database if exists 数据库名称;

删除stu2

5)使用数据库

sql 复制代码
use 数据库名称;

这个语句使用最多的是在我们的linux命令行中操作时经常用到,比如我们要建立表等,添加数据等......需要确定使用哪个数据库。如果是在这个可视化界面,我们建表等操作的时候,这个句子是配和建表等操作一块使用的,除此之外我们也可以在直接选择数据库,如下选择一个我们想进行操作的对象。

可视化中可以清楚当前使用的数据库,但在linux命令行使用MySQL我们也会用到一个

查询当前正在使用的数据库名称

sql 复制代码
 select database();

上述执行过使用stu1后现在查询当前使用的数据库是stu1

2.操作表

1)创建表

创建表前要选择数据库

sql 复制代码
create table 表名(

   列名1 数据类型1,
   列名2 数据类型2,
   ......

   列名3 数据类型n
);

数据类型

int:整数类型

double:小数类型

data:日期,只包含年月日,year-month-day

datatime:日期,包含年月日时分秒,year-month-day hour-minute-second

timestamp:时间戳类型,包含年月日时分秒

varchar:字符串

在stu1中建立一个student表

2)复制表

复制表的结构

sql 复制代码
create table if not exists 表名 like 被复制的表名;

整体复制

sql 复制代码
create table if not exists 表名 as select * from 被复制的表名

我们现在表中增加一条数据,方便区别上面两种操作

复制结构student1和复制全部的student2

最后呈现结果:

3)查询表结构

查看表结构

sql 复制代码
desc 表名;

查看某张表的字符集:

sql 复制代码
show create table 表名;

4)修改表

修改表名(两种)

sql 复制代码
alter table 表名 rename to 新表名;
 
rename table 表名 to 新表名;

修改表的字符集

sql 复制代码
alter table 表名 character set 字符集名称;

这里和数据库是一个道理,不再演示

添加一列

sql 复制代码
alter table 表名 add 列名 数据类型;

这里和建表时一样会需要设定数据类型,也不做演示

修改列名及数据类型

sql 复制代码
-- 字段名和数据类型
alter table 表名 change 列名 新列名 新数据类型;

-- 只修改数据类型
alter table 表名 modify 列名 新数据类型;

-- 删除列
alter table 表名 drop 列名;

5)删除表

sql 复制代码
drop table 表名;

drop table if exists 表名;

以上不做演示

二、DML,增删改表中数据(以下语句在第一个参考文章SQL常见语句中有详细介绍,所以不做演示)

1.添加数据

sql 复制代码
insert into 表名(列名1,列名2,列名3,......,列名n) values(值1,值2,......值n);

注意:

列名和值要一一对应;只需要对应字段数量相同

如果表名后,不定义列名,则默认给所有列添加值

除了数字类型,其他类型需要使用引号(单双都可以)引起来

2.删除数据

sql 复制代码
delete from 表名 [where条件]

注意:

如果不加条件,则删除表中所有记录

如果要删除所有记录

delete from 表名; 不推荐使用。有多少条记录就会执行多少次删除操作

truncate table 表名; 推荐使用,效率高 先删除表,然后再创建一张一样的表。

3.修改数据

sql 复制代码
update 表名 set 列名1 = 值1,列名2 = 值2,......[where条件];

注意:

如果不加任何条件,则会将表中所有记录全部修改。

三、DQL,查询表中记录(也就是select语句)

1.语法:

sql 复制代码
select
   字段列表
from
   表名列表
where
   条件列表
group by
   分组字段
having
   分组之后的条件
order by
   排序
limit
   分页限定

2.基本用法也可以参考SQL常见语句那片文章

注意:

如果查询所有字段,则可以使用*来替代字段列表。

如果有重复列,可以使用distinct去重

计算列:一般可以使用四则运算计算一些列值。(一般只会进行数值型的计算)null参与的运算,计算结果都为null

起别名:as,as也可以省略

where子句后跟条件

运算符:

sql 复制代码
>、<、<=、>=、=、<>、<=>
BETWEEN...AND
IN(集合)
LIKE:模糊查询
	   _:单个任意字符
	   %:多个任意字符
IS NULL
IS NOT NULL
注意 null 和 空字符串'' 的区别
and
or
not  
sql 复制代码
SELECT * FROM student WHERE age > 20;
SELECT * FROM student WHERE age >= 20;
SELECT * FROM student WHERE age =20;
SELECT * FROM student WHERE age != 20;
SELECT * FROM student WHERE age <> 20;-- 其实就是不等于的意思和!=一个意思
SELECT * FROM student WHERE age >=20 && age <=30;-- &&和and一个意思
SELECT * FROM student WHERE age >=20 AND age <=30;
SELECT * FROM student WHERE age BETWEEN 20 AND 30;
SELECT * FROM student WHERE age=22 OR age=20 OR age=25;
SELECT * FROM student WHERE age IN(22,18,55);-- 在这三个数中
SELECT * FROM student WHERE english IS NOT NULL;
SELECT * FROM student WHERE NAME LIKE '马%';-- 模糊搜索,也可以参考SQL常见语句那篇博客
SELECT * FROM student WHERE NAME LIKE "_化";
SELECT * FROM student WHERE NAME LIKE "___";
SELECT * FROM student WHERE NAME LIKE "%景%" 
show variables like "%char%"

以上用法演示以及排序order by,group by,limit等都是比较常见的语句,在上篇博客中已经演示

但需要注意:

分组之后查询的字段:分组字段、聚合函数

where和having的区别?

where在分组之前进行限定,如果不满足条件,则不参与分组。

having在分组之后进行限定,如果不满足结果,则不会被查询出来

where后不可以跟聚合函数,having可以进行聚合函数的判断

2..聚合函数

将一列数据作为一个整体,进行纵向的计算,注意,聚合函数的计算,排除null值(可使用ifnull函数)

count:计算个数

max:计算最大值

min:计算最小值

sum:计算和

avg:计算平均值

sql 复制代码
SELECT COUNT(列名) FROM 表名;
SELECT MAX(列名) FROM 表名;
SELECT MIN(列名) FROM 表名;
SELECT SUM(列名) FROM 表名;
SELECT AVG(列名) FROM 表名;

四、DCL,管理用户,授权

1.管理用户

先关闭密码复杂验证

sql 复制代码
set global validate_password_policy=0;
set global validate_password_length=1;

添加用户

sql 复制代码
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

删除用户

sql 复制代码
DROP USER '用户名'@'主机名';

修改

sql 复制代码
-- 老版本的写法 
-- UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER = '用户名';

SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');

查询用户(在linux命令行中使用mysql经常用到)

切换到MySQL数据库

sql 复制代码
USE mysql;

查询user表

sql 复制代码
select * from user;

2.权限管理

查询权限:

sql 复制代码
 SHOW GRANTS FOR '用户名'@'主机名';

 SHOW GRANTS FOR 'lisi'@'%';

授予权限:

sql 复制代码
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名' [with grant option];

撤销权限:

sql 复制代码
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';

五、多表查询

1.使用内连接和外连接进行查询

在SQL常见语句中也讲到了,可以参考

补充:

1)关于显式和隐式

使用where条件消除无用数据,这里是相等的列会自动删除,也没有使用join on,这属于隐式内连接

sql 复制代码
SELECT * FROM 表1,表2 WHERE 表1.列名=表2.列名;

显示内连接

sql 复制代码
select 字段列表 from 表名1 [inner] join 表名2 on 条件

2.子查询

子查询的不同情况:

子查询的结果是单行单列的

子查询的结果是多行单列的

子查询的结果是多行多列的

......

相关推荐
五阿哥永琪2 小时前
SQL中的函数--开窗函数
大数据·数据库·sql
代码or搬砖2 小时前
MySQL窗口函数 OVER()讲解
java·mysql
为什么不问问神奇的海螺呢丶2 小时前
Oracle 数据库对象导出脚本-含创建语句
数据库·oracle
码农阿豪3 小时前
告别兼容焦虑:电科金仓 KES 如何把 Oracle 的 PL/SQL 和 JSON 业务“接住”
数据库·sql·oracle·json·金仓数据库
曹牧3 小时前
Oracle SQL 中,& 字符
数据库·sql·oracle
wdfk_prog3 小时前
[Linux]学习笔记系列 -- [fs]dcache
linux·数据库·笔记·学习·ubuntu
xrl20123 小时前
ruoyi-vue2集成flowable6.7.2后端篇
数据库·ruoyi·flowable·工作流集成
java1234_小锋3 小时前
Redis到底支不支持事务啊?
java·数据库·redis
Cat God 0074 小时前
基于Docker的MySQL 主从复制(读写分离)
mysql·docker·容器