MySql详解_入门到精通01(全网最详细、黑马课程笔记)

泰勒今天想展开 2024-10-07 12:07:03 阅读 59

一、MySql学习路线

在这里插入图片描述

二、基础篇

2.1、MySql概述

在这里插入图片描述

1、下载安装

MySql下载官网

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2、客户端连接数据库

在这里插入图片描述

在这里插入图片描述

常用操作语句:

<code>show databases 查看有哪些数据库

use 数据库名 使用某数据库

show tables 查看数据库有哪些表

exit 退出MySQL的命令环境

3、配置环境变量使得任何地方都可访问到数据库

在这里插入图片描述

在path中加入Mysql的bin目录

在这里插入图片描述

4、数据模型及关系型数据库

在这里插入图片描述

在这里插入图片描述

2.2、SQl语言

1、SQL通用语法

在这里插入图片描述

2、SQL分类

在这里插入图片描述

1、图形化界面安装DataGrip

在这里插入图片描述

下载链接

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1、连接数据库:

在这里插入图片描述

输入用户名密码,并下载驱动文件:mysql的驱动jar包

在这里插入图片描述

在这里插入图片描述

2、展示数据库:

在这里插入图片描述

在这里插入图片描述

3、创建数据库

在这里插入图片描述

在这里插入图片描述

4、创建表

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5、修改表结构

在这里插入图片描述

6、自己通过Sql来操作

在这里插入图片描述

在这里插入图片描述

3、DDL(操作数据库,表,字段)

3.1数据库操作

在这里插入图片描述

1 、查询数据库:<code>show databases;

在这里插入图片描述

2、创建数据库: <code>create database ClientTest;

在这里插入图片描述

对于已经存在的数据库不能再创建:

在这里插入图片描述

如果不想出现上面的提示,可以加入<code>if not exists表示只有当数据库不存在的时候才创建

在这里插入图片描述

3 设置字符集

在这里插入图片描述

4 删除数据库

在这里插入图片描述

5 切换使用数据库

在这里插入图片描述

当忘记当前使用的是哪个数据库时,可以查询当前数据库

在这里插入图片描述

3.3数据表操作

1、创建表create,查询表show,删除表drop

在这里插入图片描述

在这里插入图片描述

2、查看表内的结构:<code>DESC 表名

在这里插入图片描述

在这里插入图片描述

3、更改表字段<code>alter table 表名 Add 字段名 数据类型;

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结:

在这里插入图片描述

3.2数据表创建过程中的:数据类型

1、 数值类型

在这里插入图片描述

2、字符串类型

在这里插入图片描述

注意:char性能高,varchar性能差一些,因为要根据存储的内容计算存储空间

在这里插入图片描述

3、时间类型

在这里插入图片描述

3.4案例

在这里插入图片描述

<code>Create Table emptable(

id int COMMENT'编号',

num VARCHAR(10) COMMENT'工号',

name VARCHAR(10) COMMENT'姓名',

gender char(1) COMMENT'性别',

age TINYINT UNSIGNED COMMENT'年龄非负',

idcard CHAR(18),

entdata DATE COMMENT'入职时间'

)COMMENT'员工表'

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4、DML操作表数据(增删改)

在这里插入图片描述

1、插入数据

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

<code>insert into `database-bydatagrip`.user values (02,'Tom','男',21);

select * from user;

2、修改数据Update

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

<code>/*01、插入数据*/

insert into `database-bydatagrip`.user values (02,'Tom','男',21);

insert into `database-bydatagrip`.user values (03,'Mary','女',31);

/*02、修改数据:updata 表名 set 字段=新值 where 条件*/

update user set age=28 where id=03;

update user set age=18,name='Mary02' where id=03;code>

update user set age=24;/*不写where条件的时候修改整张表*/

/*03、删除数据*/

delete from user where id=2;

/*04、查询表*/

select * from user;

5、DQL查询数据

在这里插入图片描述

5.1、基本查询

在这里插入图片描述

插入数据

<code>INSERT INTO emptable (id, num, name, gender, age, idcard, entdata) VALUES

(1, '001', '张三', '男', 25, '110101199003078888', '2022-01-01'),

(2, '002', '李四', 'F', 30, '110101199003078889', '2022-01-02'),

(3, '003', '王五', 'M', 28, '110101199003078890', '2022-01-03'),

(4, '004', '赵六', 'F', 26, '110101199003078891', '2022-01-04'),

(5, '005', '孙七', 'M', 24, '110101199003078892', '2022-01-05'),

(6, '006', '周八', 'F', 27, '110101199003078893', '2022-01-06'),

(7, '007', '吴九', 'M', 23, '110101199003078894', '2022-01-07'),

(8, '008', '郑十', 'F', 29, '110101199003078895', '2022-01-08'),

(9, '009', '冯十一', 'M', 22, '110101199003078896', '2022-01-09'),

(10, '010', '陈十二', 'F', 31, '110101199003078897', '2022-01-10'),

(11, '011', '褚十三', 'M', 26, '110101199003078898', '2022-01-11'),

(12, '012', '卫十四', 'F', 24, '110101199003078899', '2022-01-12'),

(13, '013', '蒋十五', 'M', 27, '110101199003078900', '2022-01-13'),

(14, '014', '沈十六', 'F', 25, '110101199003078901', '2022-01-14'),

(15, '015', '韩十七', 'M', 28, '110101199003078902', '2022-01-15'),

(16, '016', '杨十八', 'F', 23, '110101199003078903', '2022-01-16'),

(17, '017', '朱十九', 'M', 29, '110101199003078904', '2022-01-17'),

(18, '018', '秦二十', 'F', 30, '110101199003078905', '2022-01-18'),

(19, '019', '尤二十一', 'M', 24, '110101199003078906', '2022-01-19'),

(20, '020', '许二十二', 'F', 27, '110101199003078907', '2022-01-20'),

(21, '021', '何二十三', 'M', 25, '110101199003078908', '2022-01-21'),

(22, '022', '吕二十四', 'F', 26, '110101199003078909', '2022-01-22'),

(23, '023', '施二十五', 'M', 28, '110101199003078910', '2022-01-23'),

(24, '024', '张二十六', 'F', 23, '110101199003078911', '2022-01-24'),

(25, '025', '孔二十七', 'M', 29, '110101199003078912', '2022-01-25'),

(26, '026', '曹二十八', 'F', 30, '110101199003078913', '2022-01-26'),

(27, '027', '严二十九', 'M', 24, '110101199003078914', '2022-01-27'),

(28, '028', '华三十', 'F', 27, '110101199003078915', '2022-01-28'),

(29, '029', '金三十一', 'M', 25, '110101199003078916', '2022-01-29'),

(30, '030', '魏三十二', 'F', 26, '110101199003078917', '2022-01-30'),

(31, '031', '陶三十三', 'M', 28, '110101199003078918', '2022-01-31'),

(32, '032', '姜三十四', 'F', 23, '110101199003078919', '2022-02-01'),

(33, '033', '戚三十五', 'M', 29, '110101199003078920', '2022-02-02'),

(34, '034', '谢三十六', 'F', 30, '110101199003078921', '2022-02-03'),

(35, '035', '邹三十七', 'M', 24, '110101199003078922', '2022-02-04'),

(36, '036', '喻三十八', 'F', 27, '110101199003078923', '2022-02-05'),

(37, '037', '柏三十九', 'M', 25, '110101199003078924', '2022-02-06'),

(38, '038', '水四十', 'F', 26, '110101199003078925', '2022-02-07'),

(39, '039', '窦四十一', 'M', 28, '110101199003078926', '2022-02-08'),

(40, '040', '章四十二', 'F', 23, '110101199003078927', '2022-02-09'),

(41, '041', '云四十三', 'M', 29, '110101199003078928', '2022-02-10'),

(42, '042', '苏四十四', 'F', 30, '110101199003078929', '2022-02-11'),

(43, '043', '潘四十五', 'M', 24, '110101199003078930', '2022-02-12'),

(44, '044', '葛四十六', 'F', 27, '110101199003078931', '2022-02-13'),

(45, '045', '奚四十七', 'M', 25, '110101199003078932', '2022-02-14'),

(46, '046', '范四十八', 'F', 26, '110101199003078933', '2022-02-15'),

(47, '047', '彭四十九', 'M', 28, '110101199003078934', '2022-02-16'),

(48, '048', '郎五十', 'F', 23, '110101199003078935', '2022-02-17'),

(49, '049', '鲁五十一', 'M', 29, '110101199003078936', '2022-02-18');

在这里插入图片描述

在这里插入图片描述

<code>/*查询所有字段信息:以下两种方式虽然结果相同,但是尽量使用下面的方法,方便知道返回的是那些字段*/

select * from emptable;

select id, num, name, gender, age, idcard, entdata from emptable;

/*只查员工的日期,并将日期字段列名改为:参加工作时间*/

select entdata as '参加工作时间' from emptable ;

select entdata '参加工作时间' from emptable ;/*as可以省略*/

/*查询员工姓名,去重*/

select distinct emptable.name from emptable;

5.2、条件查询

在这里插入图片描述

<code>select * from emptable;

/*更改第id是10的员工身份证信息是null*/

update emptable set idcard=null where id=10;

/*查询身份证是null的人信息:要用is null 不能用等于号=null*/

select *

from emptable

where idcard is null ;

/*查询身份证不是null的人信息:要用is not null*/

select *

from emptable

where idcard is not null ;

/*查询年龄在20到30之间的人员信息*/

select * from emptable

where age>=20&&age<=30;

select * from emptable

where age between 20 and 30;/*包含20,30*/

/*查询年龄是27/28/29的人员信息*/

select *

from emptable

where age=27 or age=28 or age=29;

/*等同于以下代码*/

select *

from emptable

where age in(27,28,29);

/*查询名字是两个字的员工信息:模糊查询like:_占用一个字符,%不限制字符数*/

select *

from emptable

where name like '__';

/*查询叫姓张的员工*/

select *

from emptable

where name like '张%';

/*查询身份证最后一位是6的员工信息*/

select *

from emptable

where idcard like '%6';

5.3、聚合函数

在这里插入图片描述

<code>/*聚合函数*/

/*查询整张表的员工数量*/

select count(*)

from emptable;

/*求平均年龄*/

select avg(emptable.age)from emptable;

/*求最大年龄*/

select max(emptable.age)from emptable;

5.4、分组查询group by

在这里插入图片描述

<code>/*分组查询*/

/*根据性别分组,分别统计每一组中员工数量*/

select gender,count(*) from emptable group by gender;

/*根据性别分组,分别统计男性员工和女性员工平均年龄*/

select gender, AVG(age) from emptable group by gender;

在这里插入图片描述

在这里插入图片描述

5.5、排序查询order by

在这里插入图片描述

<code>/*排序查询*/

/*根据年龄对公司的员工进行升序排序*/

select * from emptable order by age asc,entdata asc ;/*age asc,entdata asc当第一个参考字段年龄相同的时候参考入职时间*/

5.6、分页查询Limit

在这里插入图片描述

在这里插入图片描述

<code>/*分页查询,将查询结果进行分页*/

/*查询第一页员工数据,每页展示10条数据*/

select *

from emptable

limit 0,10;

/*查询第二页员工数据,每页展示10条数据*/

select *

from emptable

limit 10,10;/*起始索引:(2-1)*10*/

5.7、案例

在这里插入图片描述

<code>/*案例*/

/*01、查询您老是21,23,25的女性员工信息*/

select *

from emptable

where age in (23,24,25) and gender='F';code>

/*02查询性别为男,年龄在20-40(含)之间的姓名为三个字的员工*/

select *

from emptable

where gender='M'and age between 20 and 40 and name like '___';code>

/*03统计 表中年龄小于60岁的男性员工和女性员工 人数 */

select emptable.gender , count(*) /*查询的对象是分组对象才有意义*/

from emptable

where age<60 group by gender;

/*04查询所有年龄小于35岁的员工 姓名和年龄,并对查询结果按年龄排序,如果年龄相同按照入职时间降序排序*/

select name,age

from emptable

where age<35

order by age asc ,entdata desc ;

/*05查询性别为男 ,年龄在20-40(含)以内的5个员工信息,对查询结果按年龄升序排序,年龄相同按照入职时间升序排序*/

select *

from emptable

where gender='M'and age between 20 AND 40code>

ORDER BY age ASC ,entdata ASC

LIMIT 0,5;

5.8、DQL语句(执行)顺序

在这里插入图片描述

6、DCL

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6.1创建用户

1.只限制在本主机访问

在这里插入图片描述

2.任意主机均可访问:

在这里插入图片描述

<code>/*创建用户:ithiema,且只能在本地主机localhost登录,密码123456*/

create user 'itheima'@'localhost' identified by '123456';

/*查询用户信息*/

select *

from user;

/*创建用户:heima。可以在任意主机访问该数据库,密码123456*/

create user 'heima'@'%' identified by '123456';

6.2修改密码

在这里插入图片描述

在这里插入图片描述

<code>/*修改用户heima的密码为1234*/

alter user 'itheima'@'localhost' identified with mysql_native_password by '1234';

/*删除'itheima'@'localhost' 用户*/

6.3删除用户

在这里插入图片描述

6.4更改用户权限

自己创建的用户登录上去后只能访问一个自带的数据库,不像root可以访问所有数据库,因为权限不够。

在这里插入图片描述

root用户:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.3、函数

在这里插入图片描述

1、字符串函数

在这里插入图片描述

案例:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

<code>update emptable set num=lpad(num,5,'0');

select *

from emptable;

2、数值函数

在这里插入图片描述

<code>/*数值函数*/

select rand();/*生成0-1之间的随机数*/

select rand()*1000000;/*生成一个六位数的随机数*/

/*生成一个六位数整数的验证码*/

select round(rand()*1000000,0);/*round(num1,mun2):num1表示要四舍五入的对象,num2表示要保留的小数位*/

/*生成一个六位数整数的验证码,如果不够6位前面补零LPad*/

select LPAD(round(rand()*1000000,0),6,'0');

3、日期函数

在这里插入图片描述

<code>/*日期函数*/

select curdate();/*返回当前日期:2024-08-27*/

select curtime();/*返回当前时间10:29:48*/

select now();/*返回日期+时间2024-08-27 10:31:50*/

/*Year(data),month(data),Day(data)*/

select YEAR(now());/*返回当前时间所在的年份:2024*/

select MONTH(now());/*8月*/

select day(now());/*27日*/

/**/

select date_add(now(),interval 10 Day);/*当前时间往后推10天:2024-09-06 10:35:52*/

select datediff(n

4、流程函数

在这里插入图片描述

<code>/*流程函数*/

# if(num,re1,re2);如果num为true返回re1,否则返回re2

select if(true,'ok','Err');

# ifnull():如果第一个值为null返回第二个值,第一个值不为null返回第一个值

select ifnull(null,10);/*返回10*/

select ifnull(99,10);/*返回99*/

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.4、约束

1、普通约束

在这里插入图片描述

在这里插入图片描述

<code>/*新建表,并添加约束*/

use clienttest02;

create table user(

id int PRIMARY KEY auto_increment,

name varchar(10) not null unique ,

age int check ( age>0 and age<=120),

status char(1) default 1,

gender char(1)

)comment '用户表';

# 插入数据,由于id是自增的,所以不用管

insert into user(name, age, status, gender)values

('Tom',20,1,'男'),

('Mary',23,0,'女'),

('Jack',30,1,'男')

在这里插入图片描述

2、外键约束

在这里插入图片描述

在这里插入图片描述

需要在sql中建立关联

1、添加外键约束

<code># 创建部门部门表

use clienttest02;

CREATE TABLE dept (

id INT PRIMARY KEY auto_increment,

name VARCHAR(255) NOT NULL

);

INSERT INTO dept (id, name) VALUES

(1, '人事部'),

(2, '财务部'),

(3, '市场部'),

(4, '技术部'),

(5, '运营部');

添加外键约束:一种是创建表时进行添加,一种时更改表约束

在这里插入图片描述

在这里插入图片描述

<code>CREATE TABLE emp (

id INT PRIMARY KEY AUTO_INCREMENT,

name VARCHAR(255) NOT NULL,

age INT,

job VARCHAR(255),

salary int,

entrydate DATE,

manager INT,

dep_id INT,

#constraint:添加约束

constraint dep_id_deptid FOREIGN KEY (dep_id) REFERENCES dept(id)

);

INSERT INTO emp (name, age, job, salary, entrydate, manager, dep_id) VALUES

('张三', 30, '经理', 15000.00, '2020-01-01', NULL, 1),

('李四', 28, '助理', 8000.00, '2020-02-01', 1, 1),

('王五', 35, '工程师', 12000.00, '2020-03-01', 1, 4),

('赵六', 25, '设计师', 9000.00, '2020-04-01', 1, 3),

('孙七', 32, '销售员', 10000.00, '2020-05-01', 1, 2),

('周八', 29, '会计', 7000.00, '2020-06-01', 1, 2),

('吴九', 31, '市场专员', 9500.00, '2020-07-01', 1, 3),

('郑十', 27, '运营专员', 8500.00, '2020-08-01', 1, 5),

('陈十一', 33, '技术主管', 13000.00, '2020-09-01', 1, 4),

('林十二', 26, '行政助理', 6500.00, '2020-10-01', 1, 1);

/*删除外键*/

alter table emp drop foreign key dep_id_deptid;

2、外键约束行为

在这里插入图片描述

在这里插入图片描述

图形化界面设置:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.5、多表查询

1、多表关系

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

<code>use clienttest02;

#创建学生表

create table student(

id int auto_increment primary key,

name varchar(10) not null ,

non varchar(10)comment '学号'

)comment '学生表';

insert into student(name, non)values

('Jack','202401'),

('mary','202402'),

('Tom','202403'),

('Lucy','202404');

#创建课程表

create table courses(

id int auto_increment primary key ,

name varchar(10) comment '部门名称'

)comment '课程表';

insert into courses(name) values

('Java'),

('Python'),

('PHP'),

('C#');

在这里插入图片描述

在这里插入图片描述

多对多关系需要建立中间表:将两个表的主键作为此表的外键

<code>/*建立中间表*/

create table student_courses(

id int auto_increment primary key ,

student_id int not null comment '学生ID',

course_id int not null comment '课程ID',

constraint fk_course_id foreign key (course_id) references courses(id),

constraint fk_student_id foreign key (student_id) references student(id)

)comment '中间表';

insert into student_courses (student_id, course_id)values

(1,1),

(1,2),

(2,1),

(2,3),

(3,3),

(3,4),

(4,1);

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

用户教育表中的外键userid添加unique的目的是让其保持唯一,防止出现用户基本表与用户教育信息表形成一对多的情况

在这里插入图片描述

2、多表查询语法

1、笛卡尔积查询

在这里插入图片描述

在这里插入图片描述

消除无效的笛卡尔积:

注:要消除笛卡尔积,只需要在查询语句的后面加一个where条件即可。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2、多表查询分类:连接查询、子查询

在这里插入图片描述

3、内连接查询

在这里插入图片描述

如果表名比较长会起别名方便书写, 一旦对表起了别名,只能通过别名来限定字段

<code># 注意,一定得是连接的另一个表的主键才可以

alter table emp add constraint fk foreign key (dep_id) references dep(id) on update cascade on delete cascade ;

-- 内连接

-- 1、查询每一个员工的姓名,及关联的部门的名称(隐式内连接实现)

-- 表结构:emp, dep

-- 连接条件:emp.dep_id = dep.id

select emp.name, dep.dep from emp, dep where emp.dep_id = dep.id;

#如果表名比较长会起别名方便书写, 一旦对表起了别名,只能通过别名来限定字段

select e.name,d.dep from emp e, dep d where e.id = d.id ;

-- 2、查询每一个员工的姓名,及关联的部门的名称(显示内连接实现) ---INNER JOIN ... ON ...

-- 表结构:emp, dep

-- 连接条件:emp.dep_id = dep.id

select e.name, d.dep from emp e inner join dep d on e.dep_id = d.id;

select e.name, d.dep from emp e join dep d on e.dep_id = d.id;

4、外连接查询

在这里插入图片描述

<code>-- 外连接

-- 1、查询emp表所有的数据,和对应的部门信息(左外连接)

-- 表结构:emp, dep

-- 连接条件:emp.dep_id = dep.id

select e.*, d.dep from emp e left join dep d on d.id = e.dep_id;

-- 2、 查询dep表所有的数据,和对应的员工信息(右外连接)

select e.*, d.* from emp e right join dep d on d.id = e.dep_id;

5、自连接查询

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

<code>-- 自连接

-- 1、查询员工及其所属工作地址

-- 表结构: emp

select a.name, b.name from emp a, emp b where a.manageid = b.id;

-- 2、查询所有员工 emp 及其 领导的 名字,如果员工没有领导,也要查询出来

select a.name '员工', b.name '领导' from emp a left join emp b on a.manageid = b.id;

在这里插入图片描述

1、联合查询

在这里插入图片描述

在这里插入图片描述

<code>-- union all ,union

-- 1、将地址在北京的, 和年龄大于 20 岁的员工全部查询

select * from emp where workaddress = '北京'

# union all # 查询结果直接合并

union #查询结果合并并去重

select * from emp where age > 20;

# 对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致

6、子连接查询

在这里插入图片描述

1、标量子查询

在这里插入图片描述

<code>-- 标量子查询

-- 1、查询“管理部门”的所有员工信息

-- a. 查询“管理部门”的ID

select id from dep where dep = '管理部门';

-- b. 根据管理部门ID查询员工信息

select * from emp where dep_id = 3;

select * from emp where dep_id = (select id from dep where dep = '管理部门');

-- 2、 查询在“小昭”入职之后的员工信息

-- a. 查询“小昭”入职日期

select entrydate from emp where name = '小昭';

-- b. 查询指定入职日期之后的员工信息

select * from emp where entrydate > '2002-01-01';

select * from emp where entrydate > (select entrydate from emp where name = '小昭');

2、列子查询

在这里插入图片描述

(1)在基础查询语句时,用来简化or,已经用到了in(num1,num2,num3)表示只要是括号内的值就满足。

<code>-- 列子查询

-- 1、 查询“销售部” 和“研发部” 的所有员工信息

select * from emp where dep_id in (select id from dep where dep = '销售部' or dep = '研发部');

-- 2、 查询比销售部所有人工资都高的员工信息

select * from emp where salary > all((select salary from emp where dep_id = (select id from dep where dep = '销售部')));

# all 返回回来的结构都需要满足

-- 3、查询比研发部其中任意一人工资高的员工信息

select * from emp where salary > any (select salary from emp where dep_id = (select id from dep where dep = '研发部'));

# any = some

3、行子查询

在这里插入图片描述

<code>-- 行子查询 一行多列

-- 1、查询与“刘艳”的薪资及直属领导相同的员工信息

select * from emp where salary =1000 and manageid='刘东';#我们进行的正常写法code>

#改进

select * from emp where (salary,manageid) =(1000,'刘东');#一一对应写法

#子查询的结果正好是行数据:(薪资,领导名)实现了一一对应

select * from emp where (salary,manageid) = (select salary,manageid from emp where name = '刘艳');

如何确定是列子查询还是行子查询?

1.看条件-》拆解:内层,外层,内层的字段是否属于一个对象的属性?如对象:张伟可以有姓名,年龄,性别等属性,这些属性都是以行的形式排列,而以列进行排序的只是不同的对象。

我们将一个对象所拥有的信息(姓名,年龄…)称为属性,所拆分出来的内层字段如果都是属性那么久用行子查询,因为这些属性以行的形式进行排序。

在这里插入图片描述

条件:查询与(“刘艳”的薪资直属领导)相同的(员工信息)

内层:(“刘艳”的薪资直属领导):内层字段都是属性所以用行查询,返回的是一个行信息,可以用(属性1,属性2)=(属性1,属性2)方式一一对应内部的值

外层:(员工信息)

4、表子查询

在这里插入图片描述

由于返回的结果是一张表,表的每一行数据作为一个对象:

<code>(职位,薪资) in((职位1,薪资1)(职位2,薪资2))

#类似于

age in(2000,1000)

在这里插入图片描述

<code>-- 表子查询

-- 1、 查询与“李四”,“杨工”的工作地点和薪资相同的员工信息

select * from emp where (workaddress,salary) in (select workaddress,salary from emp where name = '李四' or name = '杨工');

-- 2、 查询入职日期是 “2002-01-01” 之后的员工信息,及其部门信息

select e.*, d.dep from (select * from emp where entrydate > '2002-01-01') e left join dep d on e.dep_id = d.id;

7、案例

在这里插入图片描述

涉及到的表信息:

在这里插入图片描述

<code>-- 案例

-- 1、查询员工姓名、年龄、部门信息(隐式内连接)

-- 表:emp , dept

-- 连接条件 : emp.dep_id = dep.id

select e.name,e.age, d.dep from emp e,dep d where e.dep_id = d.id;

-- 2、查询年龄大于20的员工姓名、年龄、部门信息 (显示内连接)

-- 表:emp , dept

-- 连接条件 : emp.dep_id = dep.id

select e.name,e.age,d.dep from emp e join dep d on d.id = e.dep_id where e.age > 20;#查询语句放在where后面

-- 3、查询拥有员工的部门ID、部门名称 (部门表和员工表交集的部分)

-- 表:emp , dept

-- 连接条件 : emp.dep_id = dep.id

-- distinct 去重

select distinct d.id, d.dep from emp e,dep d where e.dep_id = d.id;

-- 4、查询所有年龄大于25的员工及其归属的部门名称,如果没有分配部门,也要展示出来

-- 表:emp , dept

-- 连接条件 : emp.dep_id = dep.id

-- 外连接

select e.name,d.dep from emp e left join dep d on d.id = e.dep_id where e.age > 25;

-- 5、查询所有员工工资等级

-- 表:emp , salgrade

-- 连接条件 : emp.salary >= salgrade.losal && emp.salary <= salgrade.hisal

select * from emp e ,salgrade s where e.salary >= s.losal && e.salary <= s.hisal;

select * from emp e ,salgrade s where e.salary between s.losal and s.hisal;

-- 6、查询"研发部"所有员工信息及工资等级

-- 表:emp , salgrade, dep

-- 连接条件 :e.salary between s.losal and s.hisal; emp.dep_id = dep.id

-- 查询条件:dep.dep = '研发部'

select e.*, s.grade

from emp e,

dep d,

salgrade s

where (e.salary between s.losal and s.hisal)

and e.dep_id = d.id

and d.dep = '研发部';

-- 7、查询"研发部"员工的平均工资

-- 表:emp , dep

-- 连接条件 : emp.dep_id = dep.id

select avg(e.salary)

from emp e,

dep d

where e.dep_id = d.id

and d.dep = '研发部';

-- 8、查询工资比李四高的员工信息

-- 表:emp

select *

from emp e

where salary > (select e.salary from emp e where e.name = '李四');

-- 9、查询比平均工资高的员工信息

-- 表:emp

select *

from emp e

where salary > (select avg(salary) from emp);

-- 10、查询低于本部门平均工资的员工

-- 表:emp , dept

-- 连接条件 : emp.dep_id = dep.id

select *

from emp e2

where e2.salary < (select avg(e1.salary) from emp e1 where e1.dep_id = e2.dep_id);

-- 11、查询所有部门的信息,并统计部门的员工人数

select d.id,d.dep ,(select count(*) from emp e where e.dep_id = d.id) '人数' from dep d;

8、总结

1.多表查询先消除笛卡尔级,通过表连接条件消除,n张表需要n-1个来凝结条件,多个条件之间通过and连接

在这里插入图片描述

2.6、事务

1、简介

一组操作的集合,它是不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。

2、应用

1、自动提交事务

在这里插入图片描述

2、手动提交事务:方法1

先设置@@autocommit = 0,再使用commit提交事务和rollback回滚

在这里插入图片描述

<code>select @@autocommit;

set @@autocommit = 0;

-- 张三给李四转账1000

select * from account where name = '张三';

update account set monney = monney - 1000 where name = '张三';

update account set monney = monney + 1000 where name = '李四';

-- 提交事务

commit ;

-- 回滚事务;

rollback ;

3、手动提交事务:方法2

直接调用函数开启事务:不用设置@@autocommit = 0,提交与回滚类似

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/054156de113e49d59b07aab893356968.png

-- 张三给李四转账1000

start transaction ;

select * from account where name = '张三';

update account set monney = monney - 1000 where name = '张三';

update account set monney = monney + 1000 where name = '李四';

commit ;

rollback ;

3、事务的四大特性

在这里插入图片描述

4、并发事务引发的问题

在这里插入图片描述

1、读脏数据

指的是一个事务读取了另一个事务尚未提交的数据

在这里插入图片描述

2、不可重复读

指的是在同一个事务中,两次读取同一行数据得到的结果不一致,这种情况通常是因为在事务执行期间,另一个事务对相同的数据进行了修改或删除,导致了读取结果的不一致性。

在这里插入图片描述

3、幻读

它指的是在同一个事务中,两次查询相同条件的数据得到的结果集不一致。与不可重复读类似,幻读是由于其他事务对数据进行了插入、更新或删除操作而导致的结果不一致性。下

在这里插入图片描述

5、事务的隔离级别:解决并发事务引发的问题

在这里插入图片描述

Serializable:可串行化,安全性高,但是并发性比较低,有时会因为等待事务锁而阻塞。

在这里插入图片描述

在这里插入图片描述

2.7、SQL语句中Delete与Drop的区别

需要删除表中的某些记录或者清空表时,但希望保留表结构用于后续数据插入,选择DELETE需要彻底删除表或数据库,不再需要其结构和数据时,选择DROP

1、DELETE与DROP使用语法格式

delete格式:

<code>//删除特定条件所在的行

delete from 表名 where 条件

//删除整张表

delete from 表名

DROP格式

-- 删除一个表

DROP TABLE employees;

-- 删除一个数据库

DROP DATABASE company_db;

2、DELETE与DROP主要特点

DELETE特点:

保留表结构:仅删除表中的数据,不影响表结构和索引可选条件:可以使用 WHERE 子句来指定删除哪些记录事务支持:可以在事务中进行,可以回滚(ROLLBACK)以撤销操作性能考虑:删除大量记录时,DELETE 可能比较慢(逐行删除数据,并在每行删除时记录在日志中)

DROP特点:

删除表及其数据:DROP TABLE 会删除整个表以及表中的所有数据删除其他数据库对象:可删除索引、视图等其他数据库对象不可恢复:无法回滚,一旦执行,所有数据和表结构都会被永久删除性能:通常比 DELETE 更快,因为它直接删除表及其内容,而不逐行记录删除操作

在这里插入图片描述



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。