什么是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.子查询

子查询的不同情况:
子查询的结果是单行单列的

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

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

......