本文正在参加「Java主题月 - Java 开发实战」,详情查看 活动链接
一、SQL 初识
1、什么是 SQL
结构化查询语言(Structured Query Language) 简称 SQL ,SQL 是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。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) 的缩写形式。用来定义数据库的访问权限和安全级别,以及创建用户。相关关键字: GRANT,REVOKE,SET 等。
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配置文件中加入的两行代码如下图:
TIPS:本篇文章到此结束!!!