SQL初识和分类(概述版)|Java 开发实战

194 阅读13分钟

本文正在参加「Java主题月 - Java 开发实战」,详情查看 活动链接

一、SQL 初识

1、什么是 SQL

结构化查询语言(Structured Query Language) 简称 SQLSQL 是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。SQL 的 作用 其实就是 定义了操作所有关系型数据库的规则 。但是每一种数据库操作的方式存在不一样的地方,称为 “方言”

2、SQL 特点与注释

SQL 特点如下:

  • 1、SQL 语句可以单行或多行书写,以分号结尾。
  • 2、可使用空格和缩进来增强语句的可读性。
  • 3、MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。

SQL 有 3 种注释(在MySQL数据库中),具体如下:

  • 1、单行注释: -- 注释内容 【-- 后面有一个空格,没有会出错】
  • 2、单行注释: # 注释内容( mysql 特有) 【#后面可以没有空格】
  • 3、多行注释: /* 注释内容,和 Java 多行注释一样 */
SELECT * FROM mysql.user;    -- 单行注释

SELECT * FROM mysql.user;    # 单行注释 ( mysql 特有)

SELECT * FROM mysql.user;    /* 多行注释 */

二:SQL 的四种分类

我将以图的方式对下述 四种 SQL 分类 进行介绍,请看下图:

在这里插入图片描述

1、DDL-数据定义语言

DDL 概念: 数据定义语言【DDL】是 (Data Definition Language) 的缩写形式。用来定义和操作数据库对象。例如:数据库,表,列等。相关关键字: create , drop , alter 等。

# 介绍一下 CRUD 操作,即我们常说的增删改查操作:
1、C(Create):      创建
2、R(Retrieve):   查询
3、U(Update):      修改
3、D(Delete):      删除

当我们安装完 MySQL 后,系统自带了 4 个数据库, 都代表什么呢?相关的介绍如下图:

在这里插入图片描述

DDL-命令初识

小提示: 在这里只介绍 DDL 的基础命令,日后会专门写一篇博客来介绍 DDL 命令的相关操作。

/*
 * 操作数据库最基础的命令
 */

-- 查询数据库、表以及数据库和表的字符集
show databases;                   # 查看所有数据库
show create database mysql;       # 查看 mysql 数据库的创建语句,其目的是查看数据库的字符集
show tables;                      # 查询当前数据库的所有表
show create table mysql.user;     # 查看 mysql 数据库下的 user 表的字符集
show create table mysql.user\G;   # 在命令行下可以使用 \G 来更好地显示结果
desc mysql.user;                  # 查询 mysql 数据库下的 user 表的表结构,desc 是 description 的缩写

-- 使用数据库
select database();                # 查询当前正在使用的数据库名称
use mysql;                        # 使用 mysql 数据库
use book-system;                  # 这样写会报 1064 错误,正确写法: use `book-system`;
/*
 * DDL 命令操作之 CREATE
 */
create database db01;                    # 创建 db01 数据库,默认字符集是 utf8
create database if not exists db01;      # 判断 db01 数据库是否存在,存在就不创建了,不存在就创建
create database db02 character set gbk;  # 创建 db02 数据库并指定 gbk 字符集

-- 创建和复制数据表,日期类型比较特殊,具体介绍如下:
-- date 类型,只包含年月日,yyyy-MM-dd ;datetime 类型,包含年月日时分秒 yyyy-MM-dd HH:mm:ss ;
-- timestamp 类型,包含年月日时分秒,yyyy-MM-dd HH:mm:ss ,
-- 如果没有给 timestamp 类型赋值,那么它的值就是系统当前的时间,而不是 null
create table stu_tbl(             # 创建一张名为 stu_tbl 的数据表
    stu_id int,                   # id 字段为第一列,以下以此类推, 字段类型为 int
    stu_name varchar(128),        # name 字段为第二列,字段类型为 varchar ,最多可放 128 个字符
    stu_age int,                  
    stu_birthday date,            # 使用 date 类型
    stu_address varchar(128)      # 这是最后一个字段,它的后面没有逗号
);

create table student_tbl like stu_tbl;  # 复制一张和 stu_tbl 一样的表,名字为 student_tbl
/*
 * DDL 命令操作之 ALTER
 */

-- 修改数据库
alter database db02 character set utf8;    # 修改 db02 数据库的字符集为 utf8

-- 修改数据表
alter table stu_tbl rename to stu;            # 把 stu_tbl 数据表重命名为 stu
alter table stu_tbl character set gbk;        # 把 stu_tbl 数据表的字符集修改为 gbk

# 给 stu_tbl 数据表添加 gender 字段,数据类型为 varchar。就是新增了 gender 这么一列
alter table stu_tbl add gender varchar(32);   
# 把 stu_tbl 数据表的 gender 列改名为 sex 列,并且修改了数据类型为 int
alter table stu_tbl change gender sex int;    

alter table stu_tbl modify gender int;        # 把 stu_tbl 数据表的 gender 列的数据类型修改为了 int
alter table stu_tbl drop gender;              # 把 stu_tbl 数据表的 gender 列删除
/*
 * DDL 命令操作之 DROP
 */
 -- 删除数据库
drop database db02;                         # 删除 db02 数据库,如果不存在这个数据库,会报错
drop database if exists db02;               # 如果存在 db02 数据库,则删除数据库,不存在,不会报错

-- 删除数据表                               
drop table stu_tbl;                         # 删除 stu_tbl 数据表,如果不存在这个数据表,会报错
drop table if exists stu_tbl;               # 如果存在 stu_tbl 数据表,则删除数据表,不存在,不会报错
drop table stu_tbl1,stu_tbl2,stu_tbl3;      # 同时删除 stu_tbl1,stu_tbl2,stu_tbl3 三张数据表

DDL-命令实操

接下来介绍 创建数据库指定字符集 相关的操作,如下图:

在这里插入图片描述

TIPS: 操作数据库的其他命令 就不再一个一个地演示了,详情看上方的 DDL-命令初识 进行自行练习。

接着我们介绍 创建数据表和查询数据表 操作,首先认识 SQL 的数据类型,如下图:

在这里插入图片描述

然后我们再来 创建表和查询表 ,操作如下图:

在这里插入图片描述

在这里插入图片描述

TIPS: 操作数据表的其他命令 就不再一个一个地演示了,详情看上方的 DDL-命令初识 进行自行练习。

2、DML-数据操作语言

DML-概念

DML 概念: 数据操作语言【DML】是 (Data Manipulation Language) 的缩写形式。用来对数据库中 表的数据进行增删改相关关键字: insert , delete , update 等。

DML-命令初识

小提示: 在这里只介绍 DML 的基础命令,日后会专门写一篇博客来介绍 DML 命令的相关操作。

/*
 * DML 命令操作之 INSERT
 */

-- 命令模板
# 添加数据。注意事项:1、列名和值要一一对应;2、除了数字类型,其他类型需要使用引号(单双都可以)引起来
insert into 表名(列名1, 列名2, ...列名n) values (值1, 值2, ...值n);
# 如果表名后,不定义列名,则默认给所有列添加值
insert into 表名 values (值1, 值2, ...值n);

-- 命令实际操作
-- 添加数据,遇到字符和日期类型,需要用引号(单双都行)
# 给 id 和 name 两个字段插入值,记得数据类型要对应,否则报错
insert into stu_tbl (stu_id,stu_name) values (1,'Jack');
# 给所有字段插入值,这是完整的写法
insert into stu_tbl (stu_id,stu_name,stu_age,stu_birthday,stu_address) values (1,'Jack',18,"1997-6-6",'hangzhou');
# 给所有字段插入值,这是简化的写法
insert into stu_tbl values (1,'Jack',18,null,'hangzhou');
/*
 * DML 命令操作之 DELETE
 */

-- 命令模板
# 删除数据,如果不加条件,则删除表中所有记录。
delete from 表名 [where 条件];
# 不推荐使用。有多少条记录就会执行多少次删除操作,效率低。此条命令谨慎使用
delete from 表名;
# 推荐使用,效率更高 先删除表,然后再创建一张一样的表。此条命令谨慎使用
truncate table 表名;

-- 删除数据
delete from stu_tbl;   # 删除 stu_tbl 表中所有数据,有多少条记录就会执行多少次删除操作,效率很慢,不推荐使用【谨慎操作】
truncate table stu_tbl;                   # 先删除 stu_tbl 表,然后重新创建同名的空表,删除效率高,推荐使用【谨慎操作】
delete from stu_tbl where id = 1;         # 删除 stu_tbl 表中 id=1 的那一行数据
delete from stu_tbl where name = 'Tom';   # 删除 stu_tbl 表中 name='Tom' 的那一行数据
/*
 * DML 命令操作之 UPDATE
 */

-- 命令模板
# 修改数据,如果不加任何条件,则会将表中所有记录全部修改。
update 表名 set 列名1=1, 列名2=2, ... [where 条件];

-- 修改数据
UPDATE stu_tbl SET name = "Jack" WHERE id= 1;    # 把 id=1 的记录中的 name 修改为 Jack
UPDATE stu_tbl SET name = "Jack";                # 表中的 name 字段的值都是 Jack,大家的名字都一样了。谨慎操作

TIPS:具体的操作截图就不弄了,DML 命令模板DML 命令实际操作 上述代码都有,请自行参阅和操作。

3、DQL-数据查询语言

DQL-概念

DQL 概念: 数据查询语言【DQL】是 (Data Query Language) 的缩写形式。用来查询数据库中表的记录(数据)。相关关键字: select , from, where, order , limit 等。

-- 查询语法的基本关键字介绍
select         # 后面接需要查询的字段            
from           # 后面跟表名              
where          # 后面跟条件            
group by       # 后面跟分组字段               
having         # 其后接分组之后的条件               
order by       # 其后接排序字段               
limit          # 分页限定

数据查询前期准备

接下来,我们使用上述基本语法实现各种查询骚操作。第一步: 创建一张表并插入数据,操作如下:

-- 创建 student 表
CREATE TABLE student(
    id INT,                 -- 编号
    NAME VARCHAR(20),       -- 姓名
    age INT,                -- 年龄
    sex VARCHAR(5),         -- 性别
    address VARCHAR(100),   -- 地址
    math INT,               -- 数学
    english INT             -- 英语
);

-- 向 student 表中插入数据
INSERT INTO student(id,NAME,age,sex,address,math,english) VALUES 
(1,'马云',55,'男','杭州',66,78),
(2,'马化腾',45,'女','深圳',98,87),
(3,'马景涛',55,'男','香港',56,77),
(4,'柳岩',20,'女','湖南',76,65),
(5,'柳青',20,'男','湖南',86,NULL),
(6,'刘德华',57,'男','香港',99,99),
(7,'马德',22,'女','香港',99,99),
(8,'德玛西亚',18,'男','南京',56,65);

-- 查询 student 表
SELECT * FROM student;

第二步: 我们使用 SQLyog 图形化界面工具创建上述的 student 表 ,并插入数据和查询,如下图:

在这里插入图片描述

基础查询操作

第三步: 开始操作。接下来的各种查询操作都是 基于 student 表 ,所以必须创建好,并且有数据,以下是 基础查询操作命令 如下:

-- 基础查询操作
select * from student;                       # 查询 student 表所有数据
select name,address from student;            # 查询 student 表中 name 和 address
select address from student;                 # 只查询 address ,结果可能重复
# 只查询 address ,去除了重复数据。注意事项:结果集必须都一样才能去重。例如 3,"23" 和 4,"23" 是不能去重的,结果集不是完全一样
select distinct address from student;        
-- 计算 math 和 English 之和。如果字段比较多,就应该这么写查询语句
select                                       
    name,
    math,
    english,
    (math + english)  # 这里 english 可能为 null,那么计算结果也为 null,这样计算显然不合理 我们使用 ifnull 对其判断,如下
from 
    student;
-- 对有 null 值的数据进行优化,使用 IFNULL 函数
select                                       
    name,
    math,
    english,
    (math + ifnull(english,0))    # 使用 ifnull 对其判断,有 null 就返回 0
from 
    student;
-- 给 (math + ifnull(english,0)) 起别名,使用 as 关键字
select                                       
    name,
    math,
    english,
    (math + ifnull(english,0)) as scores     # 起别名为 scores ,也可以使用空格替代 as
from 
    student;
-- 使用 空格和关键字 AS 起别名操作
select                                       
    name 名字,                               # 给 name 起别名为 名字,使用的是空格起别名
    math as 数学,                            # 给 math 起别名为 数学,使用的是 as 关键字
    english,
    (math + ifnull(english,0)) as scores     # 起别名为 scores ,也可以使用空格替代 as
from 
    student;

TIPS:具体的操作截图就不弄了,DQL 是最常用的,所以我将专门写一篇博客进行介绍,基本操作参考上述代码。

4、DCL-数据控制语言

DCL-概念

DCL 概念: 数据控制语言【DCL】是 (Data Control Language) 的缩写形式。用来定义数据库的访问权限和安全级别,以及创建用户。相关关键字: GRANTREVOKESET 等。

2、用户的 CRUD 操作

-- 1、查询用户
USE mysql;             # 切换到 MySQL 数据库
SELECT * FROM USER;    # 查询 user 表。通配符 % 表示可以在任意主机使用用户登录数据库,localhost 代表只能在本地登陆

-- 2、创建用户
CREATE USER 'username'@'hostname' IDENTIFIED BY 'password';    # 创建用户语法
CREATE USER 'zhangsan'@'%' IDENTIFIED BY '1234';               # 创建用户举例【% 代表可在本地和远程登陆】
CREATE USER 'lisi'@'localhost' IDENTIFIED BY '1234';           # 创建用户举例【localhost 表示仅限本地登陆】

-- 3、删除用户
DROP USER 'username'@'hostname';     # 删除用户语法
DROP USER 'lisi'@'localhost';        # 删除用户举例
-- 4、修改用户密码。注意:PASSWORD() 函数可以实现密码自动加密
UPDATE USER SET PASSWORD=PASSWORD('new_passowrd') WHERE USER='username';  # 修改用户密码语法的第一种方式
SET PASSWORD FOR 'username'@'hostname' = PASSWORD('new_password');        # 修改用户密码语法的第二种方式

UPDATE USER SET PASSWORD=PASSWORD('abc') WHERE USER='lisi';               # 修改用户密码举例
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('1234');                   # 修改用户密码举例

# 新设置密码或更改密码后需用 flush privileges 刷新 MySQL 的系统权限相关表,否则会出现拒绝访问。
# 还有一种方法就是重新启动 MySQL 服务器,来使新设置生效。
flush privileges;    

3、用户权限管理操作

用户权限管理 相关的操作如下:

-- 1、查询权限
-- USAGE 表示该用户只有登录权限,其他的权限均无
SHOW GRANTS FOR 'username'@'hostname';     # 查询权限语法
SHOW GRANTS FOR 'lisi'@'localhost';        # 查询权限实例

-- 2、授予权限
-- 授予权限语法: grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
GRANT SELECT ON db01.emp TO 'zhangsan'@'localhost';   # 给 zhangsan 用户授予查询权限,仅限于 db01 数据库中的 emp 表查询,其他操作均不可
GRANT ALL ON *.* TO 'zhangsan'@'localhost';           # ALL 代表所有权限,第一个 * 代表所有数据库,第二个代表每个数据库下的所有表

-- 3、撤销权限
-- 撤销权限语法: revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
REVOKE UPDATE ON db01.`account` FROM 'lisi'@'%';        # 撤销权限实例:撤销 lisi 用户的修改权限

三、忘记 MySQL 密码咋办

重点来喽: 如果我们忘记了 MySQL 密码怎么办? 以下的 骚操作 记好:

# mysql 中忘记了 root 用户的密码?
1、cmd --> net stop mysql 停止 MySQL 服务。注意:这条命令需要管理员身份运行
2、使用无验证方式启动 MySQL 服务: mysqld --skip-grant-tables
3、打开新的 cmd 窗口,直接输入 mysql 命令,敲回车。就可以登录成功
4、use mysql;
5、update user set password = password('你的新密码') where user='root';
6、关闭两个窗口
7、打开任务管理器,手动结束 mysqld.exe 的进程
8、启动 MySQL 服务
9、使用新密码登录即可


# 注意:在 Linux 中忘记 MySQL 密码也是同样的操作哦~具体步骤如下:
1、在 Linux 中关闭 MySQL 服务: service mysql stop 或者 systemctl stop mysql
2、修改 my.cnf 配置文件,就是 Linux  MySQL 的配置文件,不一定是 my.cnf
3、在配置文件中加入如下代码,具体如下图:
   [mysqld]
   skip-grant-tables
4、然后保存退出,重启 MySQL 服务器,使用 mysql -uroot 命令即可进入到 MySQL 

在 Linux 系统的 MySQL配置文件中加入的两行代码如下图: my.cnf

TIPS: 本篇文章到此结束!!!