单表查询和连表查询

单表查询

增删改查和筛选条件

'''
增删改查

增:
insert into [数据库名].表名 values(数据);

删:
delete from [数据库名].表名 [条件];

改:
update [数据库名].表名 set 字段=值 [条件];

查:
select [distinct] 字段 from [数据库名].表名 [条件];
'''

'''
筛选条件
from 
where 
group by -> 分组
having 
distinct -> 去重
order by -> 排序
limit -> 限制

注:一条查询语句,可以有多重筛选条件,筛选条件的顺序必须按照上方的顺序,distinct的书写位置特殊,筛选条件的种类可以不全,但是不能乱序
'''

distinct

# 建表
create table t1(
    id int,
    x int,
    y int
);

# 插入数据
insert into t1 values(1,1,1),(2,1,2),(3,2,2),(4,1,1);

# distinct查询
select distinct * from t1;
'''
+------+------+------+
| id   | x    | y    |
+------+------+------+
|    1 |    1 |    1 |
|    2 |    2 |    3 |
|    3 |    1 |    1 |
|    4 |    3 |    2 |
+------+------+------+
'''

select distinct x,y from t1;
'''
+------+------+
| x    | y    |
+------+------+
|    1 |    1 |
|    2 |    3 |
|    3 |    2 |
+------+------+
'''

select distinct y from t1;
'''
+------+
| y    |
+------+
|    1 |
|    3 |
|    2 |
+------+
'''

# 总结:distinct对参与查询的所有字段,整体去重(所查字段的值全部相同,才会认为是重复数据)

数据准备

create table emp(
    id int primary key auto_increment,
    name varchar(16) not null,
    sex enum('男','女') default '男',
    age int not null,
    salary decimal(5, 2) default 0,
    area varchar(20) default '中国',
    port varchar(20) default '未知',
    dep varchar(20) not null
);

insert into emp values
	(1, '刘一', '男', 26, 6, '上海', '浦东', '教学部'),
	(2, '陈二', '女', 23, 5, '云南', '昆明', '咨询部'),
	(3, '张三', '女', 21, 5.5, '江苏', '南京', '咨询部'),
	(4, '李四', '男', 22, 9, '广东', '广州', '教学部'),
	(5, '王五', '男', 24, 6.5, '福建', '厦门', '教职部'),
	(6, '赵六', '男', 25, 8, '四川', '成都', '教职部'),
	(7, '孙七', '女', 23, 7.5, '山东', '青岛', '教学部'),
	(8, '周八', '男', 26, 9, '安徽', '合肥', '咨询部'),
	(9, '吴九', '男', 22, 11, '浙江', '杭州', '教学部'),
	(10, '郑十', '女', 24, 10, '江西', '南昌', '教职部'),
	(11, '钱十一', '男', 25, 10.5, '湖北', '武汉', '教学部'),
	(12, '冯十二', '男', 27, 9.5, '湖南', '长沙', '教学部'),
	(13, '褚十三', '女', 28, 7, '陕西', '西安', '教职部'),
	(14, '卫十四', '女', 24, 6, '山西', '太原', '教职部'),
	(15, '蒋十五', '女', 23, 6.5, '河南', '洛阳', '咨询部');

常用函数

'''
拼接:concat() | concat_ws()
大小写:upper() | lower()
浮点型操作:ceil() | floor() | round()
整型:可以直接运算
'''

where

'''
判断规则

比较符合: > | >= | < | <= | = | !=
区间符合: between 开始 end 结束 | in(自定义容器)
逻辑符合: and | or | not
相似符合: like _(一个下划线代表一个字符) | %(0-n个任意字符)
正则符合: regexp 正则语法
'''

group by

'''
聚合函数
max(): 最大值
min(): 最小值
avg(): 平均值
sum(): 和
count(): 计数
group_concat(): 组内字段拼接,用来查看组内其他字段
'''

limit

'''
limit 条数
limit 偏移量,条数
'''

连表查询

连接

'''
连接:将有联系的多张表通过关联字段,进行连接,形成一张大表
连表查询:在大表的基础上进行查询,就称之为连表查询
将表与表建立连接的四种方式:内连接,左连接,右连接,全连接
'''

数据准备

mysql> create database db3;
mysql> use db3;

mysql> 
create table dep(
	id int primary key auto_increment,
	name varchar(16),
	work varchar(16)
);
create table emp(
	id int primary key auto_increment,
	name varchar(16),
	salary float,
	dep_id int
);

insert into dep values(1, '市场部', '销售'), (2, '教学部', '授课'), (3, '管理部', '开车');
insert into emp(name, salary, dep_id) values('egon', 3.0, 2),('yanghuhu', 2.0, 2),('sanjiang', 10.0, 1),('owen', 88888.0, 2),('liujie', 8.0, 1),('yingjie', 1.2, 0);

笛卡尔积

# 笛卡尔积: 集合X{a, b} * Y{o, p, q} => Z{{a, o}, {a, p}, {a, q}, {b, o}, {b, p}, {b, q}}

mysql> select * from emp, dep;

# 笛卡尔积是两张表记录的所有排列组合,数据没有利用价值

内连接

# 关键字: inner join on
# 语法: from A表 inner join B表 on A表.关联字段=B表.关联字段

mysql> select 
emp.id,emp.name,salary,dep.name,work
from emp inner join dep on emp.dep_id=dep.id
order by emp.id;

# 内连接只保留与两张表有关联的数据

左连接

# 关键字: left join on
# 语法: from 左表 left join 右表 on 左表.关联字段=右表.关联字段

mysql> select
emp.id,emp.name,salary,dep.name,work
from emp left join dep on emp.dep_id=dep.id
order by emp.id;

# 保留左表的全部数据,右表有对应数据直接连表显示,没有对应关系空填充

右连接

# 关键字: right join on
# 语法: from 左表 right join 右表 on 左表.关联字段=右表.关联字段

mysql> select 
emp.id,emp.name,salary,dep.name,work
from emp right join dep on emp.dep_id=dep.id
order by emp.id;

# 保留右表的全部数据,左表有对应数据直接连表显示,没有对应关系空填充

左右可以互相转换

mysql> select
emp.id,emp.name,salary,dep.name,work
from emp left join dep on emp.dep_id=dep.id
order by emp.id;

mysql> select
emp.id,emp.name,salary,dep.name,work
from dep right join emp on emp.dep_id=dep.id
order by emp.id;

# 更换一下左右表的位置,相对应更换左右连接关键字,结果相同

全连接

mysql> select
emp.id,emp.name,salary,dep.name,work
from emp left join dep on emp.dep_id=dep.id

union

select
emp.id,emp.name,salary,dep.name,work
from emp right join dep on emp.dep_id=dep.id
order by id;

# 左表右表数据都保留,彼此有对应关系正常显示,彼此没有对应关系均空填充对方
原文地址:https://www.cnblogs.com/yunluo/p/11752981.html