MySQL学习笔记(一)

前言

复习内容差不多均为黑马的资料,其他都是我自己写的,😂像那种很专业的名词都是黑马视频学的

数据库的介绍

1.数据库的英文单词:Database 简称:DB
2.数据库的基本概念:用于存储和管理数据的仓库,可以把数据存储到硬盘里面,也可以把数据存放在电脑内存里面,你开机关机就没有了,像Redis这种是存储内存里面的

3.数据库是持久化存储数据的,其实数据库就是一个文件系统,为什么不放在txt文本上面呢,最大的特征:对于开发人员可以方便我们管理

常见的数据库软件

关系型数据 Oracle MySQL Microsoft SQL Server Sybase DB2 Access
非关系型数据库 Redis Hbase MongodDB

数据库的安装

MySQL的安装(我的文章里面)

MySQL的登录方式

mysql -uroot -proot

在这里插入图片描述
-host代表ip地址,-u代表用户名,-p代表密码

mysql --host=127.0.0.1 -uroot -proot

这里的–host代表ip地址
在这里插入图片描述

MySQL 退出

在MySQL安装那篇文章已经说了,就是输入 exit;MySQL的安装

数据库的目录

也在MySQL安装那篇文章说了MySQL的安装

MySQL数据库和表的关系

数据库:差不多是你创建一个数据库就是创建一个文件夹,表就是那个数据库文件夹的文件
在这里插入图片描述

什么是SQL语言

结构化查询语言(Structured Query Language)简称SQL,SQL 是用于访问和处理数据库的标准的计算机语言,其实就是操作所有关系型数据库的语言像 Oracle, Sybase, SQL Server, DB2, Access,SQL语言是一个规则,这是国际化组织的规定,但是还是有一点差异,但是学习别的关系型数据库成本非常低

SQL通用语法

1.SQL 语句可以单行或者多行书写,以 ;结尾
比如,下图

SQL语法

单行注释
在这里插入图片描述
这里 两个-后面一定要有个空格

show databases; -- 查询数据库

多行注释
在这里插入图片描述

show databases; /*查询数据库*/

SQL分类

SQL被分为四大类

1.DDL(Data Definition Language)数据定义语言
用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter 等

2 DML(Data Manipulation Language)数据操作语言
用来对数据库中表的数据进行增删改。关键字:insert, delete, update 等

3.DQL(Data Query Language)数据查询语言
用来查询数据库中表的记录(数据)。关键字:select, where 等

4.DCL(Data Control Language)数据控制语言(了解)
用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE 等

其实我们开发人员碰到的最多的就是DML和DQL
在这里插入图片描述

DDL:操作数据库、表

  1. 操作数据库:CRUD
    C(Create):创建
  • 创建数据库:
    create database 数据库名称;

  • 创建数据库,判断不存在,再创建:
    create database if not exists 数据库名称;

  • 创建数据库,并指定字符集
    create database 数据库名称 character set 字符集名;

  • 练习: 创建db4数据库,判断是否存在,并制定字符集为gbk
    create database if not exists db4 character set gbk;

R(Retrieve):查询

  • 查询所有数据库的名称:
    show databases;
  • 查询某个数据库的字符集:查询某个数据库的创建语句
    show create database 数据库名称;
    U(Update):修改
  • 修改数据库的字符集
    alter database 数据库名称 character set 字符集名称;
  1. D(Delete):删除
    删除数据库
  • drop database 数据库名称;
    判断数据库存在,存在再删除
    drop database if exists 数据库名称;
    使用数据库
  • 查询当前正在使用的数据库名称
    select database();
  • 使用数据库
    use 数据库名称;

操作表

1. C(Create):创建
 语法:
 create table 表名(
 列名1 数据类型1,
 列名2 数据类型2,
 ....
 列名n 数据类型n -- 这里不需要逗号
);
注意:最后一列,不需要加逗号(,)

 数据库类型:
	1. int:整数类型
		 age int,
		 
	2. double:小数类型
		score double(5,2)
		
	3. date:日期,只包含年月日 yyyy-MM-dd
	
	5. datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
	
	6. timestamp:时间错类型	包含年月日时分秒	 yyyy-MM-dd HH:mm:ss	
		 如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值

	7. varchar:字符串
		 name varchar(20):姓名最大20个字符
		 zhangsan 8个字符  张三 2个字符
			 
   创建表
	create table student(
		id int,
		name varchar(32),
		age int ,
		score double(4,1),
		birthday date,
		insert_time timestamp
	);
复制表:
	create table 表名 like 被复制的表名;	  	
2. R(Retrieve):查询
	查询某个数据库中所有的表名称
		show tables;
	查询表结构
		desc 表名;
3. U(Update):修改
	1. 修改表名
		alter table 表名 rename to 新的表名;
	2. 修改表的字符集
		alter table 表名 character set 字符集名称;
	3. 添加一列
		alter table 表名 add 列名 数据类型;
	4. 修改列名称 类型
		alter table 表名 change 列名 新列别 新数据类型;
		alter table 表名 modify 列名 新数据类型;
	5. 删除列
		alter table 表名 drop 列名;
4. D(Delete):删除
	drop table 表名;
	drop table if exists 表名 ;		

DML:增删改表中数据(重点)

1. 添加数据:
 语法:
	insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
	
 注意:
	列名和值要一一对应。
	如果表名后,不定义列名,则默认给所有列添加值
	insert into 表名 values(值1,值2,...值n);
	除了数字类型,其他类型需要使用引号(单双都可以)引起来
	
2. 删除数据:
语法:
	delete from 表名 [where 条件]
注意:
	如果不加条件,则删除表中所有记录。
	如果要删除所有记录
		delete from 表名; -- 不推荐使用。有多少条记录就会执行多少次删除操作
	    TRUNCATE TABLE 表名; -- 推荐使用,效率更高 先删除表,然后再创建一张一样的表。
	    
3. 修改数据:
语法:
	update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 条件];
注意:
	1. 如果不加任何条件,则会将表中所有记录全部修改。

DQL:查询表中的记录(重点)

1. 语法:	
 基础查询
	1. 多个字段的查询
		select 字段名1,字段名2... from 表名;
		注意:
		如果查询所有字段,则可以使用*来替代字段列表。
		select * from 表名;
		
	2. 去除重复:
		distinct
		
	3. 计算列
	 一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
		ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
			表达式1:哪个字段需要判断是否为null
			如果该字段为null后的替换值。
	4. 起别名:
		as:as也可以省略
		
4. 条件查询
	1. where子句后跟条件
	2. 运算符
		 ><<=>==<>
		BETWEEN 字段名 AND  
		IN( 集合) 
		
		LIKE:模糊查询
			 占位符:
				 _:单个任意字符
				 %:多个任意字符
				 
		IS NULL  
		and  或 &&
		or  或 || 
		not  或 !
		
-- 查询年龄大于20岁
SELECT * FROM 表名 WHERE age > 20;

-- 查询年龄大于20的总数 
select count(*) from 表名 where age>20; 
 
-- 查询数学成绩总分 
select sum(math) 总分 from 表名; 
 
-- 查询数学成绩平均分 
select avg(math) 平均分 from 表名; 
 
-- 查询数学成绩最高分 
select max(math) 最高分 from 表名; 
 
-- 查询数学成绩最低分 
select min(math) 最低分 from 表名;

-- 查询年龄等于20岁
SELECT * FROM 表名 WHERE age = 20;

-- 查询年龄不等于20岁
SELECT * FROM 表名 WHERE age != 20;

-- 查询年龄大于等于20 小于等于30
SELECT * FROM 表名 WHERE age >= 20 &&  age <=30;
SELECT * FROM 表名 WHERE age >= 20 AND  age <=30;
SELECT * FROM 表名 WHERE age BETWEEN 20 AND 30;

-- 查询年龄22岁,18岁,25岁的信息
SELECT * FROM 表名 WHERE age = 22 OR age = 18 OR age = 25
SELECT * FROM 表名 WHERE age IN (22,18,25);

-- 查询英语成绩为null
SELECT * FROM 表名 WHERE english = NULL; -- 不对的。null值不能使用 =!=)判断
SELECT * FROM 表名 WHERE english IS NULL;

-- 查询英语成绩不为null
SELECT * FROM 表名WHERE english  IS NOT NULL;

-- 查询姓马的有哪些? like
SELECT * FROM 表名 WHERE NAME LIKE '马%';

-- 查询姓名第二个字是杰的人
SELECT * FROM 表名 WHERE NAME LIKE "_杰%";

-- 查询姓名是3个字的人
SELECT * FROM 表名 WHERE NAME LIKE '___';

-- 查询姓名中包含杰的人
SELECT * FROM 表名 WHERE NAME LIKE '%杰%';

分组查询是指使用 GROUP BY 语句对查询信息进行分组,相同数据作为一组 
SELECT 字段 1,字段 2... FROM 表名 GROUP BY 分组字段 [HAVING 条件]; 

-- 按性别进行分组,求男生和女生数学的平均分 
select sex, avg(math) from 表名 group by sex; 

-- 查询年龄大于 25 岁的人,按性别分组,统计每组的人数,并只显示性别人数大于 2 的数据 
SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex having COUNT(*) >2;

1. 排序查询
语法:order by 子句
	order by 排序字段1 排序方式1 ,  排序字段2 排序方式2...
select * from 表名 order by 排序字段1
分页查询并且分组 
	select 
		字段列表 
	from 
		表名列表 
	where 
		条件列表 
	group by 
		分组字段 
	having 
		分组之后的条件
	order by
		排序
	limit
		分页限定
		
排序方式:
	ASC:升序,默认的。
    DESC:降序。

注意:
如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件	

聚合函数:将一列数据作为一个整体,进行纵向的计算。
count:计算个数
一般选择非空的列:主键
	count(*)
	max:计算最大值
	min:计算最小值
	sum:计算和
	avg:计算平均值	
	
注意:聚合函数的计算,排除null值。
解决方案:
1. 选择不包含非空的列进行计算
2. IFNULL函数
3. 分组查询:
4. 语法:group by 分组字段;
5. 注意:
6. 分组之后查询的字段:分组字段、聚合函数
7. where 和 having 的区别?
8. where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
9. where 后不可以跟聚合函数,having可以进行聚合函数的判断。

-- 按照性别分组。分别查询男、女同学的平均分
SELECT sex , AVG(math) FROM student GROUP BY sex;

-- 按照性别分组。分别查询男、女同学的平均分,人数
SELECT sex , AVG(math),COUNT(id) FROM student GROUP BY sex;

-- 按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex;

-- 按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组,分组之后。人数要大于2个人
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;

-- 查询所有数据,使用年龄降序排序 
select * from student order by age desc;

-- 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩升序排序 
select * from student order by age desc, math asc; 

-- 查询id字段,如果为null,则使用0代替 
select ifnull(id,0) from student; 

我们可以利用 IFNULL()函数,如果记录为 NULL,给个默认值,这样统计的数据就不会遗漏 
select count(ifnull(id,0)) from student; 

-- 查询学生总数 
select count(id) as 总人数 from student; 
select count(*) as 总人数 from student;

4. 分页查询
 语法:limit 开始的索引,每页查询的条数;
 公式:开始的索引 = (当前的页码 - 1* 每页显示的条数
-- 每页显示3条记录 
SELECT * FROM student LIMIT 0,3; --1页
SELECT * FROM student LIMIT 3,3; --2页
SELECT * FROM student LIMIT 6,3; --3页

limit 是一个MySQL"方言"
约束
概念: 对表中的数据进行限定,保证数据的正确性、有效性和完整性。	
分类:
	1. 主键约束:primary key
	2. 非空约束:not null
	3. 唯一约束:unique
	4. 外键约束:foreign key
如果一个字段设置了非空与唯一约束,该字段与主键的区别? 
	主键数在一个表中,只能有一个。不能出现多个主键。主键可以单列,也可以是多列。 
	自增长只能用在主键上 5
	
非空约束:not null,值不能为null
1. 创建表时添加约束
CREATE TABLE stu(
	id INT,
	NAME VARCHAR(20) NOT NULL -- name为非空
);

2. 创建表完后,添加非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;

3. 删除name的非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
唯一约束:unique,值不能重复

4. 创建表时,添加唯一约束
CREATE TABLE stu(
	id INT,
	phone_number VARCHAR(20) UNIQUE -- 添加了唯一约束
);
注意mysql中,唯一约束限定的列的值可以有多个null

2. 删除唯一约束
ALTER TABLE 表名 DROP INDEX phone_number;

3. 在创建表后,添加唯一约束
ALTER TABLE 表名 MODIFY phone_number VARCHAR(20) UNIQUE;

主键约束:primary key。
1. 注意:
 含义:非空且唯一
 一张表只能有一个字段为主键
 主键就是表中记录的唯一标识

2. 在创建表时,添加主键约束
create table stu(
	id int primary key,-- 给id添加主键约束
	name varchar(20)
);

3. 删除主键
ALTER TABLE 表名 DROP PRIMARY KEY;

4. 创建完表后,添加主键
ALTER TABLE 表名 MODIFY id INT PRIMARY KEY;

5. 自动增长:
1.  概念:如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长

2. 在创建表时,添加主键约束,并且完成主键自增长
create table stu(
	id int primary key auto_increment,-- 给id添加主键约束
	name varchar(20)
);

3. 删除自动增长
ALTER TABLE 表名 MODIFY 字段名 INT;

4. 添加自动增长
ALTER TABLE 表名 MODIFY 字段名 INT AUTO_INCREMENT;

外键约束:foreign key,让表于表产生关系,从而保证数据的正确性。
1. 在创建表时,可以添加外键
语法:
create table 表名(
	....
	外键列
	constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
);

2. 删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

3. 创建表之后,添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);

4. 级联操作
  添加级联操作
语法:ALTER TABLE 表名 ADD CONSTRAINT 外键名称 
FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE  ;

分类:
	 级联更新:ON UPDATE CASCADE 
	 级联删除:ON DELETE CASCADE 
外键约束(重点)

单表的缺点,创建一个员工表包含如下列(id, name, age, dep_name, dep_location),id 主键并自动增长,添加 5 条数据

CREATE TABLE emp(
	id INT PRIMARY KEY AUTO_INCREMENT,  
	NAME VARCHAR(30),  
	age INT,  
	dep_name VARCHAR(30),  -- 部门名称
	dep_location VARCHAR(30) -- 部门地址
 ); 
 -- 添加数据 INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('张三', 20, '研发部', '广州'); INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('李四', 21, '研发部', '广州'); INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('王五', 20, '研发部', '广州'); 
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('老王', 1, '销售部', '深圳'); 
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('大王', 2, '销售部', '深圳'); 
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('小王', 3, '销售部', '深圳'); 
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('张三', 4, '研发部', '湖南'); 
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('李四', 5, '研发部', '湖南'); 
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('王五', 6, '研发部', '湖南'); 

查出来会发现一个问题,数据的冗余,那怎么解决呢?
思路:做一个表的拆分,分成2张表
在这里插入图片描述
删除原来的表,重新创建两张表
在这里插入图片描述

-- 解决方案:分成2张表 注意你有一个表是关联了外键,你先得有一个外键表才能去关联对吧,所以这张
-- 表是先创建的
create table department(  
	id int primary key auto_increment,  
	dep_name varchar(20), 
	dep_location varchar(20) 
); 

create table employee(  
	id int primary key auto_increment,  
	name varchar(20),  
	age int,  
	dep_id int,  -- 外键对应主表的主键
	CONSTRAINT emp_dept_fk FOREIGN KEY(dep_id) REFERENCES department(id)
); 
 
-- 添加2个部门 
insert into department values(null, '研发部','广州'),(null, '销售部', '深圳'); 

-- 添加员工,dep_id表示员工所在的部门 
INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1); 
INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1); 
INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1); 
INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2); 
INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2); 
INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);

在这里插入图片描述
在这里插入图片描述
这里这两张表扯的有外键关系,不能被随便删除,也不能随随便便添加,外键可以为null,但是不能存在没有的,这里的比如李四中的dep_id 对应department的id

数据库的设计(重点)

其实设计数据库,就是设计表,数据库的设计直接影响了你项目开发的程度,如果数据库没有设计好,你的项目开发将会非常难,亲身体验过那种痛苦

多表之间的关系
  1. 多表之间的关系(重点)
    分类:
  2. 一对一(了解)
    如:人和身份证
    分析:一个人只有一个身份证,一个身份证只能对应一个人
  3. 一对多(多对一)
    如:部门和员工
    分析:一个部门有多个员工,一个员工只能对应一个部门
  4. 多对多:
    如:学生和课程
    分析:一个学生可以选择很多门课程,一个课程也可以被很多学生选择

实现关系:

  1. 一对多(多对一)
    如:部门和员工
    实现方式:在多的一方建立外键,指向一的一方的主键。
    在这里插入图片描述
  2. 多对多
    如:学生和课程
    实现方式:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的
    在这里插入图片描述
  3. 一对一(了解):
    如:人和身份证
    实现方式:一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键。
    在这里插入图片描述
数据库设计的范式

好的数据库设计对数据的存储性能和后期的程序开发,都会产生重要的影响。建立科学的,规范的数据库就需 要满足一些规则来优化数据的设计和存储,这些规则就称为范式。
在这里插入图片描述
详细看下百度百科 数据库的设计范式

  1. 第一范式(1NF):每一列都是不可分割的原子数据项
  2. 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非主属性对主码的部分函数依赖)
  3. 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
    第一范式
    在这里插入图片描述

函数依赖:
A–>B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A
例如:学号–>姓名。 (学号,课程名称) --> 分数
完全函数依赖:A–>B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。
例如:(学号,课程名称) --> 分数
部分函数依赖:A–>B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。
例如:(学号,课程名称) – > 姓名
传递函数依赖:A–>B, B – >C . 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称 C 传递函数依赖于A
例如:学号–>系名,系名–>系主任
码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
例如:该表中码为:(学号,课程名称)
主属性:码属性组中的所有属性
非主属性:除过码属性组的属性

第二范式
在这里插入图片描述
第三范式
在这里插入图片描述

数据库备份和还原(了解)

备份的应用场景 : 在服务器进行数据传输、数据存储和数据交换,就有可能产生数据故障。比如发生意外停机或存储介质损坏。 这时,如果没有采取数据备份和数据恢复手段与措施,就会导致数据的丢失,造成的损失是无法弥补与估量的,这个操作一般属于DBA数据库人员搞的
命令行:的方式
语法:
备份: mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
在这里插入图片描述

mysqldump -u用户名 -p密码 数据库名称 > 保存的路径

在这里插入图片描述

备份与还原的语句
  • 还原:
    1. 登录数据库
    2. 创建数据库
    3. 使用数据库
    4. 执行文件。source 文件路径
source 文件路径

在这里插入图片描述
回车
在这里插入图片描述
在这里插入图片描述
图形化的方式,我是Navicat Premium 12
在这里插入图片描述
还原
在这里插入图片描述
打开选中就可以了
在这里插入图片描述

多表查询(重点)

多表查询的分类
1. 内连接查询
2. 外链接查询
3. 子查询
练习

# 创建部门表
CREATE TABLE dept(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20)
);
INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部');
# 创建员工表
CREATE TABLE emp (
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(10),
	gender CHAR(1), -- 性别
	salary DOUBLE, -- 工资
	join_date DATE, -- 入职日期
	dept_id INT,
	FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外键,关联部门表(部门表的主键)
);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013-02-24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010-12-02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);
SELECT * from emp,dept;

执行发现后发现有非常多的数据,而这个查询结果会被成为笛卡尔积
在这里插入图片描述
笛卡尔积
有两个集合A,B .取这两个集合的所有组成情况。
要完成多表查询,需要消除无用的数据

emp表有5条记录
在这里插入图片描述
而dept有3条记录
在这里插入图片描述
所以他们的笛卡尔积为15条,A乘以B
在这里插入图片描述
会发现数据错误性

多表查询的分类

1. 内连接查询
隐式内连接

-- 查询所有员工信息和对应的部门信息
SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`;

-- 查询员工表的名称,性别。部门表的名称
SELECT emp.name,emp.gender,dept.name FROM emp,dept WHERE emp.`dept_id` = dept.`id`;

在这里插入图片描述
在这里插入图片描述
上面写的太麻烦,所以可以起别名

SELECT 
	t1.name, -- 员工表的姓名
	t1.gender,-- 员工表的性别
	t2.name -- 部门表的名称
FROM
	emp t1,
	dept t2
WHERE 
	t1.`dept_id` = t2.`id`;

显式内连接
语法: select 字段列表 from 表名1 [inner] join 表名2 on 条件

select * from emp inner join dept on emp.dept_id = dept.id;

这里起别名也可以,inner也可以省略在这里插入图片描述

今天就复习到这里在这里插入图片描述

明天继续

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值