文章目录
一、数据库的概念
1.1、数据库(DataBase(DB))
存储数据的仓库,数据是有组织的进行存储
1.2、数据库管理系统(DataBase Management System(DBMS))
操纵和管理数据库的大型软件
1.3、SQL:(Structured Ouery Language(SOL))
操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准
1.4关系型数据库(RDBMS)
概念:建立在关系模型基础上的,有多张表相互连接的二维表组成数据库。
二、SQL
2.1SQL通用语法
2.2SQL分类
2.3(数据定义语言)DDL
用来定义数据库对象(数据库,表,字段)
***语句可以大小写
2.3.1基础操作
2.3.1.1查询所有数据库
格式:SHOW DATABASES ;
2.3.1.2查询当前数据库
格式:SELECT DATABASE():
***注意:这里的()是不可以省略的。
2.3.1.3创建
格式:CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET字符集][COLLATE 排序规则];
这里的【】是可选的
2.3.1.4 使用
USE 数据库名;
2.3.1.5删除
格式:DROP DATABASE[IF EXISTS]数据库名:
使用
2.3.2表的操作
2.3.2.1创建
格式:
CREATE TABLE 表名(
字段1 类型[COMMENT '注释']
字段2 类型[COMMENT '注释']
字段3 类型[COMMENT '注释']
...
)[COMMENT 表注释];
mysql> create table test_user(
-> id int comment '编号',
-> name varchar(50) comment '姓名',
-> age int comment '年龄'
-> ) comment '测试表';
Query OK, 0 rows affected (0.05 sec)
2.3.2.2查询
2.3.2.2.1查询当前数据库所有表
格式:SHOW TABLES;
2.3.2.2.2查询表结构
格式:DESC 表名:
2.3.2.2.3查询指定表的建表语句
格式:SHOW CREATE TABLE 表名;
2.3.2.3 常见数据类型
mysql> create table job_table(
-> id int comment '编号' ,
-> no varchar(10) comment '工号' ,
-> name varchar(10) comment '姓名' ,
-> gender varchar(1) comment '性别' ,
-> age tinyint unsigned comment '年龄'
-> ) comment '员工表';
Query OK, 0 rows affected (0.04 sec)
2.3.2.4修改与删除
2.3.2.4.1修改
格式:ALTER TABLE 表名 ADR 字段名 类型(长度)[COMMENT 注释][约束];
mysql> alter table job_table add niname varchar(10) comment '昵称';
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
还有两种格式;
修改数据类型
格式: ALTER TABLE 表名 MODIFY 字段名 新数据类型 (长度);
修改字段名和字段类型
格式: ALTER TABLE 表名 CHANGE |日字段名 新字段名 类型(长度)[COMMENT注释][约束];
修改表名
格式:ALTER TABLE 表名 RENAME TO 新表名:
2.3.2.4.2 删除
删除字段名
格式: ALTER TABLE 表名 DROP 字段名;
mysql> ALTER TABLE job_table DROP niname;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
删除表
格式:DROP TABLE「IF EXISTS]表名,
删除指定表,并重新创建该表
格式:TRUNCATE TABLE 表名)
2.4(数据操作语言)DML
用来对数据库表中的数据进行增删改
2.4.1添加数据
2.4.1.1给指定字段添加数据
格式:INSERT INTO 表名 (字段名1, 字段名2, …) VALUES (值1, 值2, …);
insert into employee(id,workno,name,gender,age,idcard,entrydate)
values(001,'001','橙汁','男',23,'440582200006010101','2000-01-01');
select * from employee;
2.4.1.2批量添加数据
INSERT INTO 表名 VALUES (值1, 值2, …), (值1, 值2, …), (值1, 值2, …) ;
2.4.2修改数据
格式:UPDATE 表名 SET 字段名1 = 值1 , 字段名2 = 值2 , .... [ WHERE 条件 ] ;
UPDATE employee SET id = 1,name = '小明' , gender = '男' WHERE age=10 ;
select * from employee;
2.4.3删除数据
DELETE FROM 表名 [ WHERE 条件 ] ;
delete from employee where name= '橙汁';
*注意:没加条件限制则是删除整张表
2.5(数据查询语言)DQL
用来查询数据库中表的记录
table补充一下数据。
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (1, '001', '捷风', '女', 20, '123456789012345678', '深圳', '2024-03-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (2, '002', '铁壁', '男', 18, '123456789012345670', '深圳', '2005-09-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (3, '003', '一决', '男', 38, '123456789712345670', '广州', '2005-08-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (4, '004', '雷兹', '女', 18, '123456757123845670', '深圳', '2009-12-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (5, '005', '贤者', '女', 16, '123456769012345678', '广州', '2007-07-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (6, '006', '幽影', '男', 28, '12345678931234567X', '深圳', '2006-01-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (7, '007', '炼狱', '男', 40, '123456789212345670', '深圳', '2005-05-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (8, '008', '霓虹', '女', 38, '123456157123645670', '广州', '2015-05-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (9, '009', '斯凯', '女', 45, '123156789012345678', '深圳', '2010-04-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (10, '010', '猎萧', '男', 53, '123456789012345670', '广州', '2011-01-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (11, '011', '零', '男', 55, '123567897123465670', '广州', '2015-05-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (12, '012', '保安', '男', 32, '123446757152345670', '深圳', '2004-02-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (13, '013', '海王', '男', 88, '123656789012345678', '广州', '2020-11-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (14, '014', '奇乐', '女', 65, '123456719012345670', '汕头', '2019-05-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (15, '015', '盖克', '男', 70, '12345674971234567X', '汕头', '2018-04-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (16, '016', '黑梦', '女', 18, NULL, '深圳', '2012-06-01');
格式:
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数
2.5.1 基础查询语法
2.5.1.1查询字段
(1) SELECT 字段1, 字段2, 字段3 … FROM 表名 ;
(2)SELECT * FROM 表名 ;
注意:*号表示全部字段
2.5.1.2 设置字段的别名
格式:SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] … FROM 表名;
注意:AS可以不加
2.5.1.3 返回不重复的字段值
格式:SELECT DISTINCT 字段列表 FROM 表名;
2.5.2 条件查询语法
格式:SELECT 字段列表 FROM 表名 WHERE 条件列表 ;
常见的比较运算符
常用的逻辑运算符
2.5.2.1 查询年龄大于50的员工
2.5.2.2 查询没有身份证号的员工信息
select * from employee where idcard is NULL;
2.5.2.3 查询姓名为某些字的员工信息
select * from employee where name like ‘捷风’;
2.5.2.4 查询身份证号最后一位是X的员工信息
格式:select * from emp where idcard like ‘%X’;
2.5.3 聚合函数查询语法
简介:将一列数据作为一个整体,进行纵向计算
格式:
SELECT 聚合函数(字段列表) FROM 表名 ;
常见的聚合函数:
2.5.3.1统计企业员工数量
select count(*) from employee; -- 统计的是总记录数
select count(idcard) from employee;-- 统计的是idcard字段不为null的记录数
2.5.3.2 统计广州地区员工的年龄之和
select sum(age) from employee where workaddress=‘广州’ ;
2.5.4 分组查询语法
格式:
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [HAVING 分组后过滤条件 ];
where与having的区别:
执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组 之后对结果进行过滤。
判断条件不同:where不能对聚合函数进行判断,而having可以。
执行顺序:where>聚合函数>having
2.5.4.1 统计男性员工和女性员工的数量
select gender,count(*)
from employee
group by gender;
2.5.4.2 查询年龄小于45的员工 , 并根据工作地址分组 , 获取员工数量大于等于2的工作地址
select workaddress,count(*) as address_count
from employee
where age<50
group by workaddress
having address_count>2;
2.5.5 排序查询语法
格式:ASC : 升序(默认值),DESC: 降序
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ;
2.5.5.1根据年龄对公司的员工进行升序排序 , 年龄相同 , 再按照入职时间进行降序排序
select age,entrydate
from employee
order by age asc,entrydate asc;
2.5.6分页查询语法
格式:
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;
select *
from employee
limit 0,10;
2.5.7 执行顺序
select age #④
from employee #①
where age>11 #②
group by age #③
Having age>30
order by age asc #⑤
limit 0,10; #⑥
2.6(数据控制语言)DCL
用来创建数据库用户、控制数据库的访问权限
2.6.1管理用户
在MySQL中需要通过用户名@主机名的方式,来唯一标识一个用户。
2.6.1.1查询用户
格式:
select * from mysql.user;
其中 Host代表当前用户访问的主机, 如果为localhost, 仅代表只能够在当前本机访问,是不可以远程访问的。
2.6.1.2创建用户
格式:
CREATE USER ‘用户名’@‘主机名’ IDENTIFIED BY ‘密码’;
创建用户test03, 只能够在当前主机localhost访问, 密码a123456;如果想创建任意主机访问该数据库则将’test03’@‘localhost’改成’test03’@'%'即可
create user 'test03'@'localhost' identified by 'a123456';
2.6.1.1修改用户密码
格式:
ALTER USER ‘用户名’@‘主机名’ IDENTIFIED WITH mysql_native_password BY ‘新密码’
修改用户test03的访问密码为123456;
alter user 'test03'@'localhost' identified with mysql_native_password by '123456';
2.6.1.1删除用户
格式:
DROP USER ‘用户名’@‘主机名’ ;
删除 test03@localhost 用户
drop user ‘test03’@‘localhost’;
2.6.2 权限控制
基础权限
2.6.2.1 查询权限
格式:
SHOW GRANTS FOR ‘用户名’@‘主机名’ ;
查询 ‘test03’@‘%’ 用户的权限
show grants for 'test03'@'%';
2.6.2.2授予权限
GRANT 权限列表 ON 数据库名.表名 TO ‘用户名’@‘主机名’;
授予 ‘test03’@‘%’ 用户test01数据库所有表的所有操作权限
grant all on test01.* to 'test03'@'%';
2.6.2.3撤销权限
格式:
REVOKE 权限列表 ON 数据库名.表名 FROM ‘用户名’@‘主机名’;
撤销 ‘test03’@‘%’ 用户的test01数据库的所有权限
revoke all on test01.* from ‘test03’@‘%’;
三、函数
3.1 基本的字符串函数
3.1.1填充
select lpad(‘01’, 5, ‘0’);
3.1.2截取字符串
select substring(‘Hello MySQL’,1,5);
3.1.3更新雇佣表
update employee set workno = lpad(workno, 6, ‘0’);
3.2 常见数值函数
select round(3.18,1);
3.3日期函数
3.3.1查询员工入职的天数 *
select name, datediff(curdate(), entrydate) 'entrydays'
from employee
order by entrydays desc;
3.4流程函数
常见的流程函数
3.4.1IF
3.4.2IFNULL
3.4.3CASE *
查询员工姓名和工作地址,广州和深圳为一线城市其他为二线。
select name,workaddress,
( case workaddress when '广州' then '一线城市' when '深圳' then '一线城市' else
'二线城市' end ) as '工作地址'
from employee;
四、约束
简介:
约束的概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
4.1常见约束
- 约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。
4.2约束
4.2.1需求表结构
4.2.2创建方式
方式一:
CREATE TABLE table_user(
id int AUTO_INCREMENT PRIMARY KEY COMMENT 'ID唯一标识',
name varchar(10) NOT NULL UNIQUE COMMENT '姓名' ,
age int check (age > 0 && age <= 120) COMMENT '年龄' ,
status char(1) default '1' COMMENT '状态',
gender char(1) COMMENT '性别'
);
方式二:
如果没按要求输入报错,如下
4.3 外键约束
简介:
外键:两张表之间建立连接的数据,保证数据的一致性和完整性。
创建employee1和department表;如果未添加外键(id)约束则这两张表中的数据不存在约束其内容可以随意删除。
如果添加了外键约束:如图所示:
4.3.1添加外键约束
格式:
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表
(主表列名) ;
alter table employee1 add constraint e_d_id foreign key (department_id) references department(id);
添加完这里会改变。
4.3.2删除外键约束
格式:
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
4.3.3删除/更新行为
CASCADE
格式:
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名
(主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
当删除父表id时,子表中关联的记录也被删除。
alter table employee1
add constraint E_D_id
foreign key (department_id)
references department(id)
on update cascade #当department主键被更新时,employee1中相应的键也会被更改
on delete cascade ;
五、多表查询
5.1 多表关系
类别基本为:一对多,多对多,一对一。
5.1.1一对多
例子:部门与员工关系
关系:一个部门对应多个员工,一个员工对应一个部门
实现:在多的那方 建立外键,指向一的一方的主键
5.1.2多对多
例子:学生与课程的关系
关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择
实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
六、事务
6.1简介
事务:是一组操作的集合,它是一个不可分割的工作单位,事务把所有的操作作一个整体一起 向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
*注意:MySQL的事务是自动提交的,执行一条DML语句后,会立即隐式的提交事务。
6.2事务操作
数据准备:
张三和李四分别有2000
create table account(
id int primary key AUTO_INCREMENT comment 'ID',
name varchar(10) comment '姓名',
money double(10,2) comment '余额'
) comment '账户表';
insert into account(name, money) VALUES ('张三',2000), ('李四',2000);
控制事务一
格式:
1.开启事务
START TRANSACTION 或 BEGIN ;
2.提交事务
COMMIT;
3.回滚事务
ROLLBACK;
控制事务二
格式:
1.设置事务提交方式
SELECT @@autocommit ;
SET @@autocommit = 0 ;
2.提交事务
COMMIT;
3.回滚事务
ROLLBACK;
张三给李四转1000,进行事务处理后,张三有1000李四有3000;
select @@autocommit; #@@autocommit设置事务提交方式
set @@autocommit = 0; #0手动提交,1自动提交
update account set money = money - 1000 where name='张三';#张三余额减少1000
update account set money = money + 1000 where name='李四';#李四余额增加1000
commit; #手动提交事务
ROLLBACK #回滚事务
***注意①:把@@auotcommit设置为0时,执行后的数据只是暂时储存起来,没有写回数据库中,此时要执行commit才能将数据写回数据库。
***注意②:当事务执行时出错时,可执行回滚事务将数据恢复执行事务前。
6.3 事务四大特征
· 原子性:事务是不可分割的最小操作单元;
·一致性:事务完成时,必须使所有的数据都保持一直状态;
·隔离性:数据库系统提供的隔离机制保证事务在不受外部并发操作影响的独立
环境下运行
·持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
6.4 并发事务问题
脏读:一个事务读到另外一个事务还没有提交的数据。
不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 “幻影”。
注意:原子操作所出现的相关问题。
6.5 事务隔离级别
6.5.1 查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
6.5.2 设置事务隔离级别
格式:
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED |
READ COMMITTED | REPEATABLE READ | SERIALIZABLE };
设置事务隔离级别为 READ UNCOMMITTED
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
***注意:事务隔离级别越高,数据越安全,但性能越低