MySQL入门篇

文章目录

    • 1. SQL通用语法
      • 1.1 DDL (Data Definition Language) 数据定义语言
        • 一、操作库
        • 二、操作表
      • 1.2 DML (Data Manipulation Language) 数据操作语言
        • 一、添加 insert into
        • 二、修改 update
        • 三、删除 delete
      • 1.3 DQL (Data Query Language) 数据查询语言
        • 一、基本查询
        • 二、基本条件关键字
        • 三、 聚合函数
        • 四、分组查询 GROUP BY
        • 五、排序查询 ORDER BY
        • 六、分页查询 LIMIT
      • 1.4 DCL (Data Control Language) 数据控制语言
        • 一、管理用户
        • 二、权限控制
    • 2. 函数
      • 2.1 概念
      • 2.2 字符串函数
      • 2.3 数值函数
      • 2.4 日期函数
      • 2.5 流程函数
    • 3. 约束
      • 3.1 概述
      • 3.2 外键约束
    • 4. 多表查询<重点>
      • 4.1 表结构
      • 4.2 概述
      • 4.3 连接分类
        • 4.31 内连接
        • 4.32 外连接
        • 4.33 自连接
        • 4.34 联合查询-union,union all
        • 4.35 子查询
        • 标量子查询
        • 列子查询
        • 行子查询
        • 表子查询
    • 5. 事务
      • 5.1 实务操作方式
      • 5.2 事务四大特性(ACID)
      • 5.3 并发事务问题

1. SQL通用语法

  • SQL语句可以单行或者多行书写,以分号结尾。 SQL语句可以使用空格/缩进来增强语句的可读性
  • MySQL数据库的SQL语句不区分大小写,关键字建议使用大写 注释:
单行注释:
 -- 注释内容
 # 注释内容(MySQL特有)
多行注释:
/* 注释内容 */
  • SQL语句,根据其功能,主要分为四类:DDL、DML、DQL、DCL

1.1 DDL (Data Definition Language) 数据定义语言

一、操作库
#查询所有数据库
show databases;
#创建数据库
create database 数据库名;
#检查库是否存在,不存在则创建
create database if not exists 数据库名;
#使用utf8字符集创建数据库
create database if not exists 数据库名 default charset utf8mb4;
#使用数据库OLIU9U
use 数据库名;
#查询当前数据库内容
select database();
#删除数据库
drop database if exists 数据库名;
二、操作表

知识点:[[基本类型]]

#查询当前数据库所有表
show tables;
#创建表[以创建按Student表为例]
create table student(
     id int comment '学号',
     name varchar(50) comment '姓名',
     address varchar(50) comment '地址'
     )comment '学生';
#查询表结构
desc 表名;
#查询表的建表语句
show create table 表名;

1.2 DML (Data Manipulation Language) 数据操作语言

一、添加 insert into
给指定字段添加数据
insert into 表名(字段名1,字段名2...)  values(值1,2...);
给全部字段添加数据
insert into 表名 values(1,值2...);
批量添加数据
insert into 表名(字段名1,字段名2...)  values(值1,2...) ,(值1,2...) ;
二、修改 update
修改指定字段[带条件的修改]
update 表名 set 字段名1=1,字段名2=2..where 条件;
修改全部字段[不带条件的修改]
update 表名 set 字段名1=1,字段名2=2...where 条件;
三、删除 delete
删除指定数据[带条件的删除]
delete from 表名 [where 条件];
删除所有数据[不带条件的删除]
delete from 表名;

1.3 DQL (Data Query Language) 数据查询语言

一、基本查询
查询多个字段
SELECT 字段1,字段2,字段3,....FROM 表名;
查询所有字段
SELECT * FROM 表名;
设置别名
SELECT 字段1 [AS 别名1],字段2 [AS 别名2] ...FROM 表名;
去除重复记录
SELECT DISTINCT 字段列表 FROM 表名;
二、基本条件关键字

BETWEEN … AND(在什么之间,闭区间) 和 IN (集合,多选一)

#查询年龄在 15岁 (包含)到 20岁 (包含)之间的学生信息
SELECT * FROM student WHERE age>=15 && age<=20;
SELECT * FROM student WHERE age>=15 AND age<=20;
SELECT * FROM student WHERE BETWEEN 15 AND 20;
#查询年龄等于 18 或 20 或 40 的学生信息
SELECT * FROM student WHERE age=18 || age=20 || age=40;
SELECT * FROM student WHERE IN (18,20,40);
#查询学生地址为空的学生信息
SELECT * FROM student WHERE address IS NULL;
#查询学生地址不为空的学生信息
SELECT * FROM student WHERE address IS NOT NULL;

LIKE (模糊匹配) 和 NOT NULL (null值)

 _:单个任意字符
 %:多个任意字符
#查询姓名为两个字的学生信息
SELECT * FROM student WHERE name like '__';
#查询姓名第二个字为赵的学生信息
SELECT * FROM student WHERE name like '_赵%';
#查询身份证号最后一位是X的学生信息
SELECT * FROM student WHERE idcard LIKE '%X';
三、 聚合函数

概念:将一列数据作为一个整体,进行纵向计算
COUNT(统计数量)、AVG(统计平均值)、MAX(统计最大值)、MIN(统计最小值)、SUM(求和)

#语法
SELECT 聚合函数(字段列表) FROM 表名;

#统计学生数量
SELECT COUNT(*) FROM student;
#统计学生平均年龄
SELECT AVG(age) FROM student;
#统计学生的最大年龄
SELECT MAX(age) FROM student;
#统计学生的最小年龄
SELECT MIN(age) FROM student;
#统计西安学生的年龄之和
SELECT SUM(age) FROM student WHERE workaddress ='西安';
四、分组查询 GROUP BY
#根据字段分组
GROUP BY 分组字段名;
#根据字段分组,并通过条件过滤
GROUP BY 分组字段名 [HAVING 分组后过滤条件];

# 根据性别分组,统计男性学生 和 女性学生 的数量
SELECT gender,count(*) FROM student GROUP BY gender;
# 根据性别分组,统计男性学生 和 女性学生 的平均年龄
SELECT gender,AVG(age) FROM student GROUP BY gender;
# 查询年龄小于20的学生,并根据地址分组,获取学生数量大于等于3的地址
SELECT address,COUNT(*) FROM student WHERE age<20 GROUP BY address HAVING COUNT(*)>=3;
五、排序查询 ORDER BY
#根据排序条件进行排序
ORDER BY 字段1 排序方式1,字段2 排序方式2#根据年龄对学生进行升序排序
SELECT * FROM student ORDER BY age asc;
#根据分数,对学生进行降序排序
SELECT * FROM student ORDER BY score desc;
#根据年龄对学生进行升序排序,年龄相同,再按照分数进行降序排序
SELECT * FROM student ORDER BY age asc ,entrydate desc ;
六、分页查询 LIMIT

公式:起始索引 = (查询页码 - 1)* 每页显示的条数

#根据索引位置,进行查询
LIMIT 起始索引,查询记录数;

# 查询第1页员工数据,每页展示10条记录
SELECT * FROM emp LIMIT 0,10;
# 查询第2页员工数据,每页展示10条记录
SELECT * FROM emp LIMIT 10,10;

1.4 DCL (Data Control Language) 数据控制语言

一、管理用户
查询用户
USE mysql;
SELECT * FROM user;
创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
删除用户
DROP USER '用户名'@'主机名';
二、权限控制
查询权限
SHOW GRANTS FOR '用户名'@'主机名';
授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';

2. 函数

2.1 概念

函数 是指一段可以被另一端程序调用的程序或代码,以下分为字符串函数、数值函数、日期函数、流程函数来展示。
语法: SELECT 函数(参数);

2.2 字符串函数

函数 功能
CONCAT(s1, s2, …, sn) 字符串拼接,将s1, s2, …, sn拼接成一个字符串
LOWER(str) 将字符串全部转为小写
UPPER(str) 将字符串全部转为大写
LPAD(str, n, pad) 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
RPAD(str, n, pad) 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度
TRIM(str) 去掉字符串头部和尾部的空格
SUBSTRING(str, start, len) 返回从字符串str从start位置起的len个长度的字符串
REPLACE(column, source, replace) 替换字符串
-- 拼接 
SELECT CONCAT('Hello', 'World');    	#HelloWorld
-- 小写
SELECT LOWER('Hello');					#hello
-- 大写
SELECT UPPER('Hello');					#HELLO
-- 左填充
SELECT LPAD('01', 5, '-');				#---01
-- 右填充
SELECT RPAD('01', 5, '-');				#01---
-- 去除前后空格
SELECT TRIM(' Hello World ');			#Hello World
-- 切片(起始索引为1)
SELECT SUBSTRING('Hello World', 1, 5);	#Hello


2.3 数值函数

函数 功能
CEIL(x) 向上取整
FLOOR(x) 向下取整
MOD(x, y) 返回x/y的模
RAND() 返回0~1内的随机数
ROUND(x, y) 求参数x的四舍五入值,保留y位小数
#向上取整
SELECT CEIL(1.5);       #2
#向下取整
SELECT FLOOR(1.5);      #1
#返回模
SELECT MOD(3,5);        #3
#返回随机数
SELECT RAND();          
#求四舍五入的值,保留3位小数
SELECT ROUND(2.3345,3); #2.335

2.4 日期函数

函数 功能
CURDATE() 返回当前日期
CURTIME() 返回当前时间
NOW() 返回当前日期和时间
YEAR(date) 获取指定date的年份
MONTH(date) 获取指定date的月份
DAY(date) 获取指定date的日期
DATE_ADD(date, INTERVAL expr type) 返回一个日期/时间值加上一个时间间隔expr后的时间值
DATEDIFF(date1, date2) 返回起始时间date1和结束时间date2之间的天数
#返回当前日期
SELECT CURDATE(); 
#返回当前时间
SELECT CURDATE();
#返回当前日期和时间
SELECT NOW();
#获取指定date的年份
SELECT YEAR(NOW());
#获取指定date的月份
SELECT MONTH(NOW());
#获取指定date的日期
SELECT DAY(NOW());
#返回一个日期/时间值加上一个时间间隔expr后的时间值
SELECT DATE_ADD(NOW(),INTERVAL 500 DAY );
#返回起始时间date 1 和结束时间date 2之间的天数
SELECT DATEDIFF('1940-1-1',NOW());

2.5 流程函数

函数 功能
IF(value, t, f) 如果value为true,则返回t,否则返回f
IFNULL(value1, value2) 如果value1不为空,返回value1,否则返回value2
CASE WHEN [ val1 ] THEN [ res1 ] … ELSE [ default ] END 如果val1为true,返回res1,… 否则返回default默认值
CASE [ expr ] WHEN [ val1 ] THEN [ res1 ] … ELSE [ default ] END 如果expr的值等于val1,返回res1,… 否则返回default默认值
#IF
SELECT if('OK','true','false');       #false
#IFNULL
SELECT IFNULL('1','值是空的');          #1

#CASE WHEN THEM ELSE END
#需求:查询emp表的员工姓名和工作地址,如果是北京上海,位一线城市,其他为二线城市
SELECT
       name,
       (CASE workaddress WHEN '北京' THEN '一线城市' WHEN '上海' THEN '一线城市' ELSE '二线城市' END ) as '工作地址'
FROM emp;

3. 约束

3.1 概述

概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据
目的:保证数据库钟数据的正确、有效性和完整性
重点:约束用于表中字段上,可以在修改/创建表的时候添加约束

约束 描述 关键字
非空约束 限制该字段的数据不能为null NOT NULL
唯一约束 保证该字段的所有数据都是唯一,不重复的 UNIQUE
主键约束 主键是一行数据的唯一标识,要求非空且唯一 PRIMARY KEY
默认约束 保存数据时,如果未指定该字段的值,则采用默认值 DEFAULT
检查约束 保证字段值满足某一个条件 CHECK
外键约束 用来让两张表的数据之间建立联系,保证数据的一致性和完整性 FOREIGN KEY
CREATE TABLE test(  
    id   INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID唯一标识',    --id主键,自动增长
    name VARCHAR(10) NOT NULL UNIQUE COMMENT '姓名',            --name不为空,唯一
    age  INT CHECK ( age > 0 AND age <= 120 ) COMMENT '年龄',    --age在0~120岁
    status CHAR(1) DEFAULT 1 COMMENT '状态',           --如果不指定,默认status 为1  
    gender CHAR(1) COMMENT '性别'   
);

3.2 外键约束

概念:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性
注意:目前上述的两张表,在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性的。

  • 基本约束
	--创建表时添加外键
	CREATE TABLE 表名(
	字段名 数据类型,
	...
	[CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主表列明)
	);
	--修改表中外键
	ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (外键字段名) REFERENCES 主表(主表列明);
	--例
	alter table emp add constraint fk_emp_dept_id foreign key(dept_id) references dept(id);
	--删除外键
	ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
  • 删除/更新行为
行为 说明
NO ACTION 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新(与RESTRICT一致)
RESTRICT 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新(与NO ACTION一致)
CASCADE 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则也删除/更新外键在子表中的记录
SET NULL 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(要求该外键允许为null)
SET DEFAULT 父表有变更时,子表将外键设为一个默认值(Innodb不支持)
--删除/更新行为
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名(主表字段名) ON UPDATE 行为 ON DELETE 行为;

4. 多表查询<重点>

4.1 表结构

项目开发,根据业务需求及业务模块的关系,分析并设计表结构,由关联性分为三种表结构

  • 一对多(多对一)
    • 案例:部门与员工
    • 关系: 一个部门对应多个员工,一个员工对应一个部门
    • 实现:多的一方建立外键,关联一的一方的主键
  • 多对多
    • 案例:学生与课程
    • 关系:一个学生选秀多门课程,一门课程可以被多个学生选择
    • 实现:简历第三个中间表,中间表至少包含两个外键,分别关联两方主键
  • 一对一
    • 案例:用户与用户详情
    • 关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详细字段放在另一张表中,用来提升操作效率
    • 实现:在任意一方加入外键,关联另一方的主键,设置外键为唯一

4.2 概述

  • 指从多张表中查询数据
  • 若直接查询多张表,则会返回笛卡尔积

笛卡尔积:两个集合A集合和B集合的所有组合情况(在多表查询时,需要消除无效的笛卡尔积)

4.3 连接分类

4.31 内连接

内连接查询的是两张表交集的部分
注:显式性能比隐式高

--隐式内连接
SELECT 字段列表 FROM1,表2 WHERE 条件...;
--显式内连接
SELECT 字段列表 FROM1 [INNER] JOIN2 ON 连接条件...;
4.32 外连接
--左外连接
SELECT 字段列表 FROM1 LEFT [OUTER] JOIN2 ON 条件...;
--右外连接
SELECT 字段列表 FROM1 RIGHT [OUTER] JOIN2 ON 条件...;

4.33 自连接

当前表与自身的连接查询,自连接必须使用表别名

--自连接可以是内连接查询,可以是外连接查询
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件...;
4.34 联合查询-union,union all

对于union查询,九十八多次查询的结果合并起来,形成一个新的查询结果集

SELECT 字段列表 FROM 表A ...
UNION [ALL]
SELECT 字段列表 FROM 表B...;
  • 多张表的列数必须一致,字段类型必须一致
  • union all将所有数据合在一起,不去重,union会将数据去重
4.35 子查询
  • SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询
--括号内为嵌套查询,括号外可以为增删改查任意一个
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2)
  • 子查询分为标量子查询,列子查询,行子查询,表子查询
    • 标量子查询(子查询结果为单个值)
    • 列子查询(子查询结果为一列)
    • 行子查询(子查询结果为一行)
    • 表子查询(子查询结果为多行多列)
标量子查询

子查询返回的结果是单个值(数字、字符串、日期等)。
常用操作符:- < > > >= < <=

--根据销售部门ID,查询销售部门所有员工属性
select * from employee where dept = (select id from dept where name = '销售部');
列子查询

返回的结果是一列(可以是多行)。
常用操作符:

操作符 描述
IN 在指定的集合范围内,多选一
NOT IN 不在指定的集合范围内
ANY 子查询返回列表中,有任意一个满足即可
SOME 与ANY等同,使用SOME的地方都可以使用ANY
ALL 子查询返回列表的所有值都必须满足
-- 查询比财务部所有人工资都高的员工信息
select * from employee where salary > all(select salary from employee where dept = (select id from dept where name = '财务部'));
行子查询

返回的结果是一行(可以是多列)。
常用操作符:=, <, >, IN, NOT IN

-- 查询与xxx的薪资及直属领导相同的员工信息
select * from employee where (salary, manager) = (select salary, manager from employee where name = 'xxx');
表子查询

返回的结果是多行多列
常用操作符:IN

-- 查询入职日期是2006-01-01之后的员工,及其部门信息
select e.*, d.* from (select * from employee where entrydate > '2006-01-01') as e left join dept as d on e.dept = d.id;

5. 事务

事务是一组操作的集合,这组操作要么同时成功,要么同时失败
默认MySQL事务是自动提交的,执行一条DML语句,MySQL会立即隐式的提交事务

5.1 实务操作方式

当开启事务之后,只有提交事务,才一并上传数据。
如果报错,可以回滚事务,从而恢复到原装胎

--开启事务
START TRANSACTIONBEGIN TRANSACTION;
--提交/回滚事务
COMMIT/ROLLBACK;

实例[转账]

--开启事务
START TRANSACTION;
-- 将张三余额减少1000;
update account set money = money - 1000 where name = '张三';
--将李四余额增加1000
update account set money = money + 1000 where name = '李四';
--提交事务
commit;

5.2 事务四大特性(ACID)

  • 原子性(Atomicity):事务是不可分割的最小操作但愿,要么全部成功,要么全部失败
  • 一致性(Consistency):事务完成时,必须使所有数据都保持一致状态
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

5.3 并发事务问题

问题 描述
脏读 一个事务读到另一个事务还没提交的数据
不可重复读 一个事务先后读取同一条记录,但两次读取的数据不同
幻读 一个事务按照条件查询数据时,没有对应的数据行,但是再插入数据时,又发现这行数据已经存在,好像出现了"幻影"
并发事务隔离级别:
隔离级别 脏读 不可重复读 幻读
Read uncommitted
Read committed ×
Repeatable Read(默认) × ×
Serializable × × ×
--查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
--设置事务隔离级别
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}```

- √表示在当前隔离级别下该问题会出现
- Serializable 性能最低;Read uncommitted 性能最高,数据安全性最差

你可能感兴趣的:(mysql,数据库)