问: 什么是SQL?
答:Structured Query Language
结构化查询语言;其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为方言
。
通用语法
-- 注释内容
或# 注释内容(mysql 特有)
/* 注释 */
SQL分类
DDL(Data Definition Language)
数据定义语言DML(Data Manipulation Language)
数据操作语言DQL(Data Query Language)
数据查询语言DCL(Data Control Language)
数据控制语言-- 创建数据库
CREATE DATABASE 数据库名称;
-- 创建数据库, 判断不存在, 再创建
CREATE DATABASE IF NOT EXISTS 数据库名称;
-- 创建数据库, 并指定字符集
CREATE DATABASE 数据库名称 CHARACTER SET 字符集名;
-- 练习: 创建zhinian_db数据库, 判断是否存在, 并制定字符集为utf8mb4
CREATE DATABASE IF NOT EXISTS zhinian_db CHARACTER SET utf8mb4;
-- 查询所有数据库的名称
SHOW DATABASES;
-- 查询某个数据库的字符集: 查询某个数据库的创建语句
SHOW CREATE DATABASE 数据库名称;
-- 修改数据库的字符集
ALTER DATABASE 数据库名称 CHARACTER SET 字符集名称;
-- 删除数据库
DROP DATABASE 数据库名称;
-- 判断数据库存在, 存在再删除
DROP DATABASE IF EXISTS 数据库名称;
-- 查询当前正在使用的数据库名称
SELECT DATABASE();
-- 使用数据库
USE 数据库名称;
数据库字段类型
INT
-整数类型DOUBLE
-小数类型DATE
-日期(只包含年月日 yyyy-MM-dd
)DATETIME
-日期(包含年月日时分秒 yyyy-MM-dd HH:mm:ss
)TIMESTAMP
-时间戳(包含年月日时分秒 yyyy-MM-dd HH:mm:ss
)
VARCHAR
-字符串建表语法
-- 语法
CREATE TABLE 表名(
列名1 数据类型1,
列名2 数据类型2,
....
列名n 数据类型n
);
-- MYSQL CREATE TABLE示例
CREATE TABLE minio_file_upload_info(
`id` BIGINT(20) PRIMARY KEY AUTO_INCREMENT NOT NULL COMMENT '自增主键',
`file_name` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '文件名称',
`file_md5` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '文件MD5',
`upload_id` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '文件上传Id',
`file_url` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '文件路径',
`total_chunk` INT(10) NOT NULL DEFAULT 0 COMMENT '文件总分块数',
`file_status` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '文件状态',
`update_time` DATETIME DEFAULT NULL COMMENT '修改时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文件上传信息';
复制表
CREATE TABLE 表名 LIKE 被复制的表名;
查询某个数据库中所有的表名称
SHOW TABLES;
查询表结构
DESC 表名;
ALTER TABLE 表名 RENAME TO 新的表名;
ALTER TABLE 表名 CHARACTER SET 字符集名称;
ALTER TABLE 表名 ADD 列名 数据类型;
ALTER TABLE 表名 CHANGE 列名 新列别 新数据类型;
ALTER TABLE 表名 MODIFY 列名 新数据类型;
ALTER TABLE 表名 DROP 列名;
DROP TABLE 表名;
DROP TABLE IF EXISTS 表名;
语法
INSERT INTO 表名(列名1,列名2,...列名n) VALUES(值1,值2,...值n);
注: ① 列名和值要一一对应。② 如果表名后,不定义列名,则默认给所有列添加值 insert into 表名 values(值1,值2,...值n);
③ 除了数字类型,其他类型需要使用引号(单双都可以)引起来。
语法
DELETE FROM 表名 [WHERE 条件]
注: ① 如果不加条件,则删除表中所有记录。
② 如果要删除所有记录。DELETE FROM 表名; -- 不推荐使用。
有多少条记录就会执行多少次删除操作;TRUNCATE TABLE 表名; -- 推荐使用
,效率更高 先删除表,然后再创建一张一样的表。
语法
UPDATE 表名 SET 列名1 = 值1, 列名2 = 值2,... [WHERE 条件];
注: 如果不加任何条件,则会将表中所有记录全部修改。
SELECT * FROM 表名;
语法
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段
HAVING
分组之后的条件
ORDER BY
排序
LIMIT
分页限定
SELECT 字段名1,字段名2... FROM 表名;
*
来替代字段列表。DISTINCT
IFNULL(表达式1,表达式2)
。WHERE
子句后跟条件
运算符
<
>
<=
>=
=
<>
BETWEEN...AND
IN(集合)
LIKE
(占位符: _☞单个任意字符 %☞多个任意字符)IS NULL
AND 或 &&
OR 或 ||
NOT 或 !
例
-- 查询姓马的有哪些? like
SELECT * FROM student WHERE NAME LIKE '马%';
-- 查询姓名第二个字是化的人
SELECT * FROM student WHERE NAME LIKE "_化%";
-- 查询姓名是3个字的人
SELECT * FROM student WHERE NAME LIKE '___';
语法: order by 子句
order by 排序字段1 排序方式1, 排序字段2 排序方式2...
注: 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。
将一列数据作为一个整体,进行纵向的计算。
COUNT
MAX
MIN
SUM
AVG
语法:GROUP BY 分组字段;
注: 分组之后查询的字段:分组字段、聚合函数
WHERE 和 HAVING 的区别?
- WHERE 在分组之前进行限定,如果不满足条件,则不参与分组。HAVING在分组之后进行限定,如果不满足结果,则不会被查询出来
- WHERE 后不可以跟聚合函数,HAVING可以进行聚合函数的判断。
语法:LIMIT 开始的索引,每页查询的条数;
公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
注: LIMIT 是一个MySQL 方言
笛卡尔积:有两个集合A&B取这两个集合的所有组成情况。
注: 要完成多表查询,需要消除无用的数据
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
DROP USER '用户名'@'主机名';
UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER = '用户名';
UPDATE USER SET PASSWORD = PASSWORD('123') WHERE USER = 'zhinian';
SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');
mysql中忘记了root用户的密码?
① 停止MYSQL服务
② 使用无验证方式启动MYSQL服务: mysqld --skip-grant-tables
③ 直接输入mysql命令,敲回车。就可以登录成功
④ use mysql;
⑤ update user set password = password('你的新密码') where user = 'root';
⑥ 重启MYSQL
USE myql;
SELECT * FROM USER;
注: 通配符%
表示可以在任意主机使用用户登录数据库
-- 查询权限
SHOW GRANTS FOR '用户名'@'主机名';
SHOW GRANTS FOR 'zhinian'@'%';
-- 授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
-- 给只年用户授予所有权限,在任意数据库任意表上
GRANT ALL ON *.* TO 'zhinian'@'localhost';
-- 撤销权限:
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
REVOKE UPDATE ON zhinian_db.`account` FROM 'zhinian'@'%';
对表中的数据进行限定,保证数据的正确性、有效性和完整性。
某一列的值不能为NULL
-- 建表时
CREATE TABLE employee (
`id` INT,
`name` VARCHAR(20) NOT NULL -- name为非空
);
-- 建表后
ALTER TABLE employee MODIFY `name` VARCHAR(20) NOT NULL;
-- 删除name的非空约束
ALTER TABLE employee MODIFY `name` VARCHAR(20);
某一列的值不能重复
注: 唯一约束可以有NULL值,但是只能有一条记录NULL
-- 建表时
CREATE TABLE employee (
`id` INT,
`phone_number` VARCHAR(20) UNIQUE -- 手机号
);
-- 建表后
ALTER TABLE employee MODIFY `phone_number` VARCHAR(20) UNIQUE;
-- 删除唯一约束
ALTER TABLE employee DROP INDEX `phone_number`;
① 非空且唯一;②一张表只能有一个主键;③主键就是表中记录的唯一标识
-- 建表时
CREATE TABLE employee (
`id` INT PRIMARY KEY,-- 给id添加主键约束
`name` VARCHAR(20)
);
-- 建表后
ALTER TABLE employee MODIFY `id` INT PRIMARY KEY;
-- 删除主键约束
ALTER TABLE employee DROP PRIMARY KEY;
FOREIGN KEY,让表于表产生关系,从而保证数据的正确性。
-- 建表时
create table 表名(
....
外键列
constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
);
-- 建表后
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
-- 删除自动增长
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
-- 级联操作(级联更新:ON UPDATE CASCADE 、级联删除:ON DELETE CASCADE )
ALTER TABLE 表名 ADD CONSTRAINT 外键名称
FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE;
如果某一列是数值类型的,使用 AUTO_INCREMENT 可以来完成值得自动增长
-- 建表时
CREATE TABLE employee (
`id` INT PRIMARY KEY AUTO_INCREMENT,-- 给id添加主键约束
`name` VARCHAR(20)
);
-- 建表后
ALTER TABLE employee MODIFY `id` INT AUTO_INCREMENT;
-- 删除自动增长
ALTER TABLE employee MODIFY `id` INT;
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
开启事务: START TRANSACTION;
回滚:ROLLBACK;
提交:COMMIT;
一对一、一对多/多对一、多对多(借助中间表)
设计范式
设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
备份: mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
还原: ① 登录数据库; ② 创建数据库;③ 使用数据库;④ 执行文件。source 文件路径
待续...