首页 > 数据库 >必备SQL和表关系

必备SQL和表关系

时间:2024-01-30 12:56:16浏览次数:48  
标签:info depart name -- 必备 和表 SQL id select

必备SQL和表关系

1.必备SQL

创建数据


create table depart(
	  id int(4) not null auto_increment primary key,
    title varchar(20) not null
);

create table info(
	  id int(4) not null auto_increment primary key,
    name varchar(20) not null,
    emall varchar(20) not null,
    age int(3)  not null,
  	depart_id  INT COMMENT '部门id',
    FOREIGN KEY (depart_id) REFERENCES depart(id)
);

1.1 条件

1.1.1 where 条件
-- 查找名称为陈旭的员工信息
select * from info where name = '陈旭'

1.1.2 between and 筛选范围操作符
-- 查找年龄在18-49之间的员工信息
select * from info where age between 18 and 49

1.1.3 and 逻辑运算符,用于结合两个或多个条件,确保这些条件同时成立
-- 查找年龄18 并且部门id是1的员工
select * from info where age = 18 and depart_id = 1

1.1.4 or 逻辑运算符,用于结合两个或多个条件,确保其中至少一个条件为真
-- 查找部门是2或者3的
select * from info where depart_id = 2 or depart_id = 3

1.1.5 in 用于指定条件范围,检查某一列是否在指定的值列表中
-- 查找部门是2或者3的
select * from info where depart_id IN(2,3)

1.1.6 exists 用于检查子查询是否返回任何行的关键字。它常常与 select 语句结合使用
-- 存在返回,不存在返回空
-- exists select * from depart where id=5,去查数据是否存在,如果存在,如果不存在。
select * from info where exists (select * from depart where id=5);
select * from info where not exists (select * from depart where id=5);

1.2 通配符,模糊搜索

  • 在 MySQL 中,通配符用于模糊搜索,常见的通配符包括百分号 % 和下划线 _

  • 百分号 % 用于表示零个、一个或多个字符。例如,LIKE 'a%' 表示以字母 "a" 开头的任意字符串。

  • 下划线 _ 用于表示一个单一的字符。例如,LIKE '_r%' 表示第二个字符是 "r" 的任意三个字符的字符串

1.2.1 %
-- 模糊查询 name %y% 前后任意字符,中间为y的数据
select * from info where name like "%y%"

1.2.2 _
-- 模糊查询 name 两个字符的 "_y" 第一二字符是y的数据

1.3 排序 order by

1.3.1 升序 asc ,默认是升序
-- 根据年龄升序排序
select * from info order by age asc

1.3.2 倒序 desc
-- 根据年龄倒序排序
select * from info order by age DESC

1.3.3 同时使用 asc和desc

 -- 优先按照age从小到大;如果age相同则按照id从大到小
select * from info order by age asc,id desc

1.4 取部分数据 limit

1.4.1 Limit 取部分数据
-- 获取前5条数据
select * from info limit 5;  

-- 先排序,再获取前3条数据
select * from info order by id desc limit 3;	


1.4.2 limit offset 从xx位置开始取xx条
-- 从位置2开始,向后获取前3数据
select * from info limit 3 offset 2;	

1.5 分组 gorup by

  • select * from 表名 group by 分组条件
1.5.1 group by 分组
-- 根据年龄分组并统计每个年龄段有多少人
select age,count(1) from info group by age;

1.5.2 having 是在分组之后进行的过滤操作
select age,count(id) from info where id > 2 group by age having count(id) > 1 order by age desc limit 1;
- 要查询的表info
- 条件 id>2
- 根据age分组
- 对分组后的数据再根据聚合条件过滤 count(id)>1
- 根据age从大到小排序
- 获取第1条

分组注意
  • where和group by可以同时使用,但是要注意顺序
  • where不能使用聚合函数
  • 聚合条件放在having后面
sql执行顺序
    where 
    group by
    having 
    order by
    limit 

1.6 distinct 去重

-- 根据部门去重显示
select distinct depart_id from info

1.7 多表查询

1.7.1 子查询
-- 将一条SQL语句的查询结果加括号当做另外一条SQL语句的查询条件
-- select * from * where (select * from * where * ;);
1.7.2 联表查询
1.7.2.1 左连接
  • 左连接,左表所有的数据都展示出来,没有对应的项就用null表示
  • info主表,就以info数据为主,depart为辅
  • select * from 主表表名 left join 辅表表名 on 条件筛选;
-- 联查 查看每个人属于那个部门
select info.id,info.name,info.emall,depart.title from info left outer join depart on info.depart_id = depart.id;

1.7.2.2 右链接
  • 右链接,右表所有的数据都展示出来,没有对应的项就用null表示
  • depart主表,,就以depart数据为主,info为辅
  • select * from 主表表名 right join 辅表表名 on 条件筛选;
select info.id,info.name,info.emall,depart.title from info right outer join depart on info.depart_id = depart.id;

1.7.2.3 内链接
  • 只拼接两张表中共有的数据部分
  • 表 inner join 表 on 条件
select * from info inner join depart on info.depart_id=depart.id;

1.7.2.4 全连接
  • 左右两表的数据都展示出来
-- 全连接显示depart表的id和title 和info表的id和name
select id,title from depart 
union
select id,name from info;

2.表关系

2.1 单表,单独一张表就可以将信息保存

  • QQ用户
id name age gender email phone addr

# 用户表
id name age gender detail_id

# 用户详情表
id email phone addr

2.2 一对多,需要两张表来存储信息,且两张表存在 一对多多对一关系

  • 以员工表和部门表来说
    • 员工可不可以只对应一个部门?
      • 默认是可以的
    • 部门是不是可以有多个员工?
      • 部门可以有多个员工
  • 总结
    • 部门是一
    • 员工是多
  • 一对多关系将外键建立在哪一方?
    • 将外键建在多的这一方
# 员工表
id name age

# 部门表
id dep_name dep_desc emp_id
1 技术部	1
2 技术部	2
2 技术部	2
3 后勤部

# 员工表
id name age dep_id
1 dream 18 1
2 hope 28  1

# 部门表
id dep_name dep_desc
1 技术部
2 后勤部
# 创建被约束的表
create table dep(
	id int(4) primary key auto_increment comment "部门表id",
    dep_name varchar(32) comment "部门名称",
    dep_desc text comment "部门介绍"
);

# 创建外键约束的表,前提是被建立连接的表先创建
create table emp(
	id int(4) primary key auto_increment  comment "员工id",
    name varchar(32) comment "员工名字",
    age int(4) comment "员工年龄",
    dep_id int(4) comment "外键关联部门id",
	foreign key(dep_id) references dep(id)
);

2.3 多对多,需要三张表来存储信息,两张单表 + 关系表,创造出两个单表之间多对多关系

  • 以图书和作者为例
    • 一本书可以有多个作者吗?
      • 一本数据可以有多个作者
    • 一个作者可以写多本书吗?
      • 一个作者可以写多本书
  • 总结
    • 图书和作者之间的关系就是多对多
# 图书表
id title price author_id

# 作者表
id name gender book_id 
create table book(
  id int primary key auto_increment,
  title varchar(32),
  price float(10,2),
);


create table author(
  id int primary key auto_increment,
  name varchar(32),
  gender enum('male','female','others'),
);


create table author_book(
  id int primary key auto_increment,
  book_id int,
  foreign key(book_id) references book(id),
  author_id int,
  foreign key(author_id) references author(id) 
);
# 图书表
id title price
1    1     1      
2   2     2

# 作者表
id name gender
1   1     1
2   2     2

# 第三张表 :author_book
id book_id author_id
1     1       1
2     1       2
3     2       1

注意:

在上述的表:一对多的、多对多的 直接用整型存储就可以,因为他们只要存储关联表的主键ID即可。

在开发中往往还会为他们添加一个 外键约束,保证某一个列的值必须是其他表中的特定列已存在的值,例如:author_book.book_id的值必须是 book.id中已存在的值。

标签:info,depart,name,--,必备,和表,SQL,id,select
From: https://www.cnblogs.com/Formerly/p/17996856

相关文章

  • python操作mysql
    python操作mysql1.数据库连接池在操作数据库时需要使用数据库连接池。pip3.9installpymysql#安装pymysqlpip3.9installdbutils#安装dbutilsimportthreadingimportpymysqlfromdbutils.pooled_dbimportPooledDBMYSQL_DB_POOL=PooledDB(creator=pym......
  • SQL变量数据加工在Java规则引擎中的应用案例分析
    SQL变量加工SQL加工背景,在决策配置过程中,一些复杂的逻辑或模型可通过自定义SQL脚本编写创建数据变量,通过SQL脚本可以便捷的从数据库中取数,并且自定义SQL支持传参,可满足更复杂多变的数据加工处理。注意,SQL变量加工和算子编排加工的方式不同,SQL变量加工依赖于对应数据源的服务器的性......
  • MySQL查看bin_log日志
    有这样一段业务逻辑,首先保存业务数据,然后发送报文,最后确认报文回来以后更新业务数据。伪代码大概是这样的:/***保存数据,并调用发送报文方法*/publicvoidsave(){//0.保存数据//调用send()方法send();}/***发送报文*/publicvoidsend(){/......
  • PLSQL Developer汉语设置
    PLSQLQDeveloper是由Oracle公司推出的数据库开发工具,具有很好的移植性和适应性.但是当我们安装完成Oracle11gPLSQLDeveloper工具后发现状态栏的显示是英文,对于大多数人来说都是看不懂,如果长期使用的话或许还能接受,对于小新真的十分困难,下面就是如何将PLSQLDeveloper工具设置为......
  • MySQL连接控制插件导致的连接数过多问题处理
    生产环境收到一波连接数告警,而该业务实际压力并不大。查看后发现有大量的waitinginconnection_controlplugin状态的连接等待。该等待连接数有一千多个。connection_control组件是由于前段时间的安全合规审查要求安装的。怕影响生产真实连接,将单个用户的登陆失败重试connectio......
  • 查询SQL SERVER 软件版本信息、授权许可等
    SQLSERVER软件授权许可查询概述在使用SQLServer数据库管理系统时,了解软件授权许可是非常重要的。SQLServer提供了多种许可方式,以满足不同用户的需求。本文将介绍SQLServer软件授权许可的查询方法,并提供相应的代码示例。许可方式SQLServer提供了多种许可方式,包括:企业......
  • 【数据库】对大数据量数据集,PostgreSQL分组统计数量,使用 row_number() over
    在处理大数据量数据集时,我们经常需要进行分组统计。而在PostgreSQL中,我们可以使用row_number()函数结合over(partitionby)子句来实现这个功能。同时,通过设置row_num<=100的条件,我们可以限定每组最多数量为100。本文将详细介绍如何使用这种方法进行分组统计。一、row_......
  • MySQL 系统变量 group_replication_get_communication_protocol
    MySQL系统变量group_replication_get_communication_protocol(MonJan2923:14:512024)[root@GreatSQL][(none)]>selectversion(),group_replication_get_communication_protocol();+-----------+------------------------------------------------+|version()|gr......
  • node后端中sql使用的表达式和函数
    参考:https://xiaoman.blog.csdn.net/article/details/135903790一.表达式MySQL表达式是一种在MySQL数据库中使用的计算式或逻辑式。它们可用于查询、更新和过滤数据,以及进行条件判断和计算。算术表达式:可以执行基本的数学运算,例如加法、减法、乘法和除法。例如:SELECTcol1+co......
  • 【数据库】对大数据量数据集,PostgreSQL分组统计数量,使用 row_number() over
    在处理大数据量数据集时,我们经常需要进行分组统计。而在PostgreSQL中,我们可以使用row_number()函数结合over(partitionby)子句来实现这个功能。同时,通过设置row_num<=100的条件,我们可以限定每组最多数量为100。本文将详细介绍如何使用这种方法进行分组统计。一、row......