MySQL基础全套全网最详细讲解


概述

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库。

教程主要包含相关表和数据的操作的演示,展示全部sql语句,包含casedb数据库以及以下三张表:emp,stu,user;

创建数据库:
create database casedb;
use casedb;

创建表:

CREATE TABLE `emp` (                                                                    
  `sid` int DEFAULT NULL COMMENT '编号',                                                
  `workno` varchar(10) DEFAULT NULL COMMENT '工号',                                     
  `name` varchar(10) DEFAULT NULL COMMENT '姓名',                                       
  `gender` char(1) DEFAULT NULL COMMENT '年龄',                                         
  `age` tinyint unsigned DEFAULT NULL COMMENT '年龄',                                   
  `worktime` date DEFAULT NULL,                                                         
  UNIQUE KEY `emp_worktime_uindex` (`worktime`)                                         
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='员工表'     
CREATE TABLE `stu` (                                                                     
  `sid` int DEFAULT NULL,                                                                
  `name` varchar(50) DEFAULT NULL,                                                       
  `gender` varchar(1) DEFAULT NULL,                                                      
  `birth` date DEFAULT NULL,                                                             
  `score` double DEFAULT NULL                                                            
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生表'    
CREATE TABLE `user` (                                                                   
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',                                      
  `name` varchar(10) NOT NULL COMMENT '姓名',                                           
  `age` int DEFAULT NULL COMMENT '年龄',                                                
  `status` char(1) DEFAULT '1' COMMENT '状态',                                          
  `gender` char(1) DEFAULT NULL COMMENT '性别',                                         
  PRIMARY KEY (`id`),                                                                   
  UNIQUE KEY `name` (`name`),                                                           
  CONSTRAINT `user_chk_1` CHECK (((`age` > 0) and (`age` <= 120)))                      
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表'     

一、DDL 数据定义语言 定义数据对象

1.数据库操作

show databases;
create database casedb;
create database [if not exists] casedb;
use casedb;
select database();
drop database casedb;
alter database casedb character set utf-8;

2.表操作

show tables;
create table stu;
drop table stu;
drop table if exists emp;
truncate table emp;
desc stu;
show create table stu;

3.关键字

–add
–modify change
–drop
–rename …

alter table stu add nickname varchar(20) comment '昵称';
alter table stu change nickname username varchar(10) comment '用户名';
alter table stu drop username;
alter table emop rename to employee;


二、DML 数据操作语言

1.关键字

–insert 增
–delete 删
–update 改

insert into stu(title,auther,data) values ("t","a","d");
insert into stu values ("t","a","d"...);
insert into stu values ("t","a","d"),("t1","a1","d1");

delete from emp ;
delete from emp where gender = '1';
delete from tableName where tableId=3;
delete from tableName [where clause];

update tableName set title='studrc' where tableId=3;
update emp set name='itheima' where id = 1;
update emp set name='hfh', gender ='2' where id = 1;
update emp set worktime='2008-01-01';


三、DQL 数据查询语言

1.编写顺序

–select 字段列表
–from 表名列表
–where 条件列表
–group by 分组字段查询
–having 分组后条件列表
–order by 排序字段列表
–limit 分页参数

select 字段列表 from 表名;
select * from emp;
select workadddress from emp;
select distinct workadddress from emp;
select id,name,workno,score,gender,age from emp;

2.聚合函数

–count 统计数量
–max 最大值
–min 最小值
–avg 平均数
–sum 求和

select count(*) from emp;
select count(idcard) from emp;
select max(age) from emp;
select min(age) from emp;
select avg(age) from emp;
select sum(age) from emp where workaddress = '西安';

3.条件查询 where

–常用操作符 > >= < <= = <> !=
–between and
–in()
–like ‘_ _’
–is null
–and && or || not !

select 字段列表 from 表名 where 条件;
select * from emp where age = 80;
select * from emp where age < 80;
select * from emp where idcard is null;
select * from emp where idcard is not null;
select * from emp where age != 80;
select * from emp where age <> 80;
select * from emp where age <= 80 && age >= 18;
select * from emp where between 15 and 80;
select * from emp where gender='女' and age = 18;
select * from emp where age = 15 or age = 18 or age = 20;
select * from emp where age in(15,18,20);
select * from emp where name like '_ _';
select * from emp where idcard like '%x';
select * from emp where idcard like '_________________x';

4.分组查询 group by

–执行顺序:where>聚合函数> having

select 字段列表 from 表名 where 条件 group by 分组字段 having 分组后过滤条件;
select gender, count(*) from emp group by gender;
select gender, avg(*) from emp group by gender;
select workaddress, count(*) from emp where age<30 group by workaddress having count(*) >= 3;
select workaddress, count(*) address_count from emp where age<30 group by workaddress having address_count >= 3;

5.排序查询 order by

–asc 升序
–desc 降序

select 字段列表 from 表名 order by 字段1 排序方式1,字段2 排序方式2;
select * from emp order by age asc;
select * from emp order by age desc;
select * from emp order by enterdate desc;
select * from emp order by age asc, enterdate desc ;

6.分页查询 limit

–起始索引=(查询页码-1)* 每页的记录数

select 字段列表 from 表名 limit 起始索引, 查询记录数;
select * from emp limit 0,10;
select * from emp limit 10;
select * from emp limit 10,10;

7.案例

select * from emp where gender = '女' and age in (18,19,20);
select * from emp where gender = '女' and (age between 10 and 20) and name like '_ _ _';
select gender, count(*) from emp where age<20 group by gender;
select name, age from emp where age<=20 group by age asc, entrydate desc;
select * from emp where gender = '男' and age between 20 and 40 order by age asc , entrydate asc limit 5;

8.执行顺序验证

–form
–where
–group by
–select
–order by && having
–limit

select name, age from emp where age >15 order by age asc;
select name, age from emp e where e.age >15 order by age asc;
select e.name, age from emp e where e.age >15 order by age asc;
select e.name ename , age from emp e where e.age >15 order by age asc;
select e.name ename , age from emp e where e.age >15 order by eage asc; (X)
select e.name ename , age eage from emp e where e.age >15 order by eage asc;


四、DCL 数据控制语言:管理用户&&权限控制

1.管理用户

– 查询用户
– 创建用户
– 修改用户密码
– 删除用户

use mysql;
select * from user;

create user '用户名' @ '主机名' identified by '密码';
create user 'itcast' @ 'localhost' identified by '123456';
create user 'itcast' @ '%' identified by '123456';

alter user '用户名' @ '主机名' identified with mysql_native_password by '新密码';
alter user 'itcast' @ '%' identified with mysql_native_password by '1234';

drop user '用户名' @ '主机名';
drop user 'itcast' @ 'localhost';

2.权限控制

–all,all peivileges 所有权限
–select 查询数据
–insert 插入数据
–update 修改数据
–delete 删除数据
–alter 修改表
–drop 删除数据库/表/视图
–create 创建数据库/表

–查询权限show
–授予权限grant
–撤销权限revoke

show grants for '用户名'@'主机名';
grant 权限列表 on 数据库名.表名 to '用户名'@‘主机名’;
grant 权限列表 on *.* to 'itcast'@‘localhost’;
revoke 权限列表 on 数据库名.表名 from '用户名'@‘主机名’;


五、函数

1.字符串函数

–CONCAT(s1,s2,s3…) 字符串拼接
–LOWER(str) 字符串全部转为小写
–UPPER(str) 字符串全部转为大写
–LPAD(str,n,pad) 左填充 用字符串PAD对str左边进行填充 达到n个字符串长度
–RPAD(str,n,pad) 右填充
–TRIM(str) 去掉字符串头部和尾部的空格
–SUBSTRING(str,start,len) 返回从字符串str从start位置起的len个长度的字符串

select concat ('hello' ,'mysql');
select lower ('HELLP' ,'MYSQL');
select upper ('hello' ,'mysql');
select lpad ('01' ,5,'-');
select rpad ('01' ,5,'-');
select trim (' hello mysql ');
select substring ('hello mysql' ,1 , 5 );

update emp set workno = lpad (workno ,5 , '0');

2.数值函数

–CELT(x) 向上取整
–FLOOR(x) 向下取整
–MOD(x,y) 返回x/y的模
–RANG() 返回0~1内的随机数
–ROUND(x,y) 求参数x的四舍五入的值,保留y的小数位

select ceil(1.1);
select floor(1.1);
select mod(3,4);
select rand();
select round(2.34555,2);

–生成随机六位验证码
select round(rand()*1000000 , 0);
select lpad(round(rand()*1000000 , 0) ,6 , '0');

3.日期函数

–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 curtime();
select now();

select year(now());
select month(now());
select day(now());

select date_add(now(), interval 70 days);
select date_add(now(), interval 70 month);
select date_add(now(), interval 70 year);

select datediff('2021-12-01', '2021-10-01');

select * from emp;
select name,datediff(curdate(), entryfate ) from emp ;
select name,datediff(curdate(), entryfate )as 'entrydays' from emp order by entrydays desc;

4.流程函数

–if(value, t, f ); 如果value为true,则返回t,否则返回f;
–ifnull(value1, value2); 如果value不为空,返回value1,否则返回value2;
–case when[val1] then [res1] …else [default] end; 如果value为true,…否则返回default默认值;
–case [expr] when [val1] then [res1] …else [default] end; 如果expr的值等于val1,返回res1,…否则返回default默认值;

select if (false ,'ok', 'err');
select ifnull('ok', 'default');
select ifnull(' ', 'default');
select ifnull (null, 'default');

–case
–when
–then
–else
–end

select name,(case workadress when '北京' then '上海' then '一线城市' else '二线城市' end) as '工作地址' from emp;

create table score( id int comment 'ID', name varchar(20) comment 'NAME', math int comment 'MATH', english int comment 'ENGLISH', chinese int comment 'CHINESE' ) comment 'SCORE';
insert into score (id, name, math, english, chinses) values (1,'Tom' ,79,88,99), (2,'ROSE' ,79,88,99), (3,'JACK' ,79,88,99);

select id,name, (case when math>=85 then 'great' when math>=60 then 'good' else 'bad' end )'math', (case when math>=85 then 'great' when math>=60 then 'good' else 'bad' end )'math', (case when math>=85 then 'great' when math>=60 then 'good' else 'bad' end )'math' from score;


六、约束

1.关键字

–not null 非空约束 限制该字段的数据不能为null
–unique 唯一约束 保证该字段的所有数据都是唯一的
–primary key 主键约束 主键是一行数据的唯一的标识符要求非空且唯一
–default 默认约 束 保存数据时如果未指定该字段则采用默认值
–check 检查约束 保存字段值满足某一要求
–foreing key 外键约束 用来让两张表之间建立链接保证数据的一致性和完整性

create table user( id int primary key auto_increment comment '主键', name varchar(10) not null unique comment '姓名', age int check (age>0&&user.age<=120 ) comment '年龄', status char(1) default '1' comment '状态', gender char(1) comment '性别' )comment '用户表';
insert into user (name, age, status, gender) vakues ('jack', 18, '1', '男'),('tom', 20, '0', '男');

2.外键约束 foreing key

create tables user( 字段名 数据类型, ... constraint 外键名称 foreing 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 emp drop foreign key fk_emp_dept_id;

3.外键约束 删除更新行为

–no action 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与 RESTRICT 一致)
–restrict 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与 NOACTION 一致)
–cascade 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
–set null 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null)。
–set default 父表有变更时,子表将外键列设置成一个默认的值(Innodb不支持)

cascade
alter table emp add constraint fk_emp_dept_id foreign key(dept_id) references dept(id) on update cascade on delete cascade;

set null
alter table emp add constraint fk_emp_dept_id foreign key(dept_id) references dept(id) on update set null on delete set null;


七、多表查询

1.多表查询概述

概述:
项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:

1.一对多(多对一)
案例:部门 与员工的关系
关系:一个部门对应多个员工,一个员工对应一个部门
实现:在多的一方建立外键,指向一的一方的主键

2.多对多
案例:学生 与 课程的关系
关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择
实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

3.一对一
案例:用户 与 用户详情的关系
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率
实现: 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

select * from emp,dept;
select * from emp,dept where emp.dept_id = dept.id;

2.多表查询的分类

1.连接查询

–内连接:相当于查询A、B交集部分数据
–外连接:
左外连接:查询左表所有数据,以及两张表交集部分数据
右外连接:查询右表所有数据,以及两张表交集部分数据
–自连接:当前表与自身的连接查询,自连接必须使用表别名

(1)内连接
隐式内连接
select 字段列表 from 表1,表2 where 条件...(emp.dept_id = dept.id);
select * from emp,dept where emp.dept_id = dept.id;
select emp.name , dept.name from emp,dept where emp.dept_id = dept.id;
select e.name , d.name from emp e,dept d where e.dept_id = d.id;

显式内连接
select 字段列表 from 表1 inner join 表2 on 连接条件...;
select * from emp e inner join dept d on e.dept_id = d.id;
select emp.name , dept.name from emp e inner join dept d on e.dept_id = d.id;
(2)外连接
左外连接 相当于查询左表的全部数据,包括表1和表2交集的数据
select 字段列表 from 表1 left outer join 表2 on 连接条件...;
select e.* from emp left outer join dept d on e.dept_id=d.id;
select e.* from emp left join dept d on e.dept_id=d.id;
右外连接 相当于查询右表的全部数据,包括表1和表2交集的数据
select 字段列表 from 表1 right outer join 表2 on 连接条件...;
select d.*,e.* from emp e right outer join dept d on e.dept_id=d.id;
select d.*,e.* from emp e right join dept d on e.dept_id=d.id;
=
select d.*,e.* from dept d left outer join emp e on e.dept_id=d.id;

(3)自连接
不要看成一张表,看成两张表。
select 字段列表 from 表1 别名1 join 表1 别名2 on 条件...;
select a.name , b.name from emp a, emp b where a, managerid = b.id;
select a.name '员工' , b.name '领导' from emp a lef outer join emp b on a.managerid =b.id;

联合查询: union union all 查询字段需一致(列数)
select 字段列表 from 表1...
union all
select 字段列表 from 表2...;

查询结果合并
select * from emp where salary < 5000
union all
select * from emp age > 50;

查询结果合并去重
select * from emp where salary < 5000
union
select * from emp age > 50;

2.子查询

概念:SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。
SELECT * FROM t1 WHERE column1=(SELECT column1 FROM t2);

子查询外部的语句可以是INSERT/UPDATE/ DELETE/ SELECT的任何一个。
根据子查询结果不同,分为:

–标量子查询(子查询结果为单个值)
–列子查询(子查询结果为一列)
–行子查询(子查询结果为一行)
–表子查询(子查询结果为多行多列)
–根据子查询位置,分为:WHERE之后、FROM之后、SELECT之后。

(1)标量子查询(子查询结果为单个值)
子查询结果为单个值,数字,字符串,日期,最简单的形式

–常用操作符: = <> > >= < <=

select id from dept where name ='销售部';
select * from emp where dept_id =4;
select * from emp where dept_id =(select id from dept where name ='销售部');

select entrydate from emp where name = 'Aminn';
select * from emp entrydate >'2009-02-10';
select * from emp entrydate >(select entrydate from emp where name = 'Aminn');

(2)列子查询(子查询结果为一列
常用操作符:IN NOT IN AND SOME ALL

–IN 在指定的集合范围之内,多选一
–NOT IN 不在指定的集合范围之内
–ANY 子查询返回列表中,有任意一个满足即可
–SOME 与ANY等同,使用SOME的地方都可以使用ANY
–ALL 子查询返回列表的所有值都必须满足

select id from dept where name ='销售部' or name ='市场部';
select * from emp where dept_id in (2,4);
select * from emp where dept_id in (select id from dept where name ='销售部' or name ='市场部');

select id from dept where name ='销售部';
select salary from emp where dept_id = 3;
select salary from emp where dept_id = (select id from dept where name ='销售部');
select * from emp where salary > all(select salary from emp where dept_id = (select id from dept where name ='销售部'));

select id from dept where name ='销售部';
select salary from emp where dept_id = 3;
select salary from emp where dept_id = (select id from dept where name ='销售部');
select * from emp where salary > any(select salary from emp where dept_id = (select id from dept where name ='销售部'));

(3)行子查询(子查询结果为一行)

(4)表子查询(子查询结果为多行多列)

3.多表查询案例


八、事务

1.事务简介

事务简介
事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作
请求,即这些操作要么同时成功,要么同时失败。

默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。

select * from account where name ='zs';
update account set money = money - 1000 where name ='zs';
update account set money = money + 1000 where name ='ls';

2.事务操作

事务操作
查看/设置事务提交方式
SELECT@@autocommit;
0:手动提交
1:自动提交
SET@@autocommit=0;
提交事务
COMMIT;
回滚事务
ROLLBACK;
案例:
select * from account where name ='zs';
update account set money = money - 1000 where name ='zs';
update account set money = money + 1000 where name ='ls';
commit;

开启事务
START TRANSACTION 或BEGIN}
提交事务
COMMIT;
回滚事务
ROLLBACK;
案例:
start transaction;
select * from account where name ='zs';
update account set money = money - 1000 where name ='zs';
update account set money = money + 1000 where name ='ls';
commit;
rollback;

3.事务四大特性

事务四大特性: ACID

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

4.并发事务问题

5.事务隔离级别

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
当涉及到数据库操作时,事务和存储引擎是两个重要的概念。 1. 事务: 事务是一组数据库操作,被视为一个单独的工作单元,要么全部成功执行,要么全部失败回滚。事务的目的是确保数据库的一致性和完整性。 在MySQL中,使用以下语句来管理事务: - BEGIN 或 START TRANSACTION:开始一个事务。 - COMMIT:提交事务,将所有修改永久保存到数据库。 - ROLLBACK:回滚事务,放弃所有未提交的修改。 事务具有ACID属性: - 原子性(Atomicity):事务中的所有操作都要么全部执行成功,要么全部失败回滚。 - 一致性(Consistency):事务执行前后数据库从一个一致性状态转换到另一个一致性状态。 - 隔离性(Isolation):并发执行的事务之间是相互隔离的,每个事务感知不到其他事务的存在。 - 持久性(Durability):一旦事务提交,其结果将永久保存在数据库中,即使发生系统故障也不会丢失。 2. 存储引擎: 存储引擎是数据库管理系统中负责数据存储和检索的组件。MySQL支持多种存储引擎,常见的有InnoDB、MyISAM、Memory等。 不同的存储引擎具有不同的特点和适用场景: - InnoDB:默认的存储引擎,支持事务、行级锁、外键等特性,适用于大部分应用。 - MyISAM:不支持事务和行级锁,但具有较高的插入和查询速度,适用于读写频率较低的应用。 - Memory:将数据存储在内存中,读写速度非常快,但数据在数据库重启后会丢失,适用于缓存或临时数据。 通过在创建表时指定不同的存储引擎,可以根据应用的需求选择合适的存储引擎来优化数据库性能和功能。例如,使用InnoDB存储引擎可以保证事务的一致性和隔离性,而使用MyISAM存储引擎可以获得更好的读写性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洛可可白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值