连接查询

  • 连接查询分类如下:
    表A inner join 表B:表A与表B匹配的行会出现在结果中
    表A left join 表B:表A与表B匹配的行会出现在结果中,外加表A中独有的数据,未对应的数据使用null填充
    表A right join 表B:表A与表B匹配的行会出现在结果中,外加表B中独有的数据,未对应的数据使用null填充
  • 在查询或条件中推荐使用“表名.列名”的语法
  • 如果多个表中列名不重复可以省略“表名.”部分
  • 如果表的名称太长,可以在表名后面使用’ as 简写名’或’ 简写名’,为表起个临时的简写名称

问:查询每个学生每个科目的分数

  • 分析:学生姓名来源于students表,科目名称来源于subjects,分数来源于scores表,怎么将3个表放到一起查询,并将结果显示在同一个结果集中呢?
  • 答:当查询结果来源于多张表时,需要使用连接查询
  • 关键:找到表间的关系,当前的关系是
    students表的id—scores表的stuid
    subjects表的id—scores表的subid
  • 则上面问题的答案是:
select students.sname,subjects.stitle,scores.score
from scores
inner join students on scores.stuid=students.id
inner join subjects on scores.subid=subjects.id;
  • 结论:当需要对有关系的多张表进行查询时,需要使用连接join

字符串函数

  • 查看字符的ascii码值ascii(str),str是空串时返回0
    select ascii('a');
  • 查看ascii码值对应的字符char(数字)
    select char(97);
  • 拼接字符串concat(str1,str2…)
    select concat(12,34,'ab');
  • 包含字符个数length(str)
    select length('abc');
  • 截取字符串
    left(str,len)返回字符串str的左端len个字符
    right(str,len)返回字符串str的右端len个字符
    substring(str,pos,len)返回字符串str的位置pos起len个字符
    select substring('abc123',2,3);
  • 去除空格
    ltrim(str)返回删除了左空格的字符串str
    rtrim(str)返回删除了右空格的字符串str
    trim([方向 remstr from str)返回从某侧删除remstr后的字符串str,方向词包括both、leading、trailing,表示两侧、左、右
select trim('  bar   ');
select trim(leading 'x' FROM 'xxxbarxxx');
select trim(both 'x' FROM 'xxxbarxxx');
select trim(trailing 'x' FROM 'xxxbarxxx');
  • 返回由n个空格字符组成的一个字符串space(n)
    select space(10);
  • 替换字符串replace(str,from_str,to_str)
    select replace('abc123','123','def');
  • 大小写转换,函数如下
    lower(str)
    upper(str)
    select lower('aBcD');

数学函数

  • 求绝对值abs(n)
    select abs(-32);
  • 求m除以n的余数mod(m,n),同运算符%
select mod(10,3);
select 10%3;
  • 地板floor(n),表示不大于n的最大整数
    select floor(2.3);
  • 天花板ceiling(n),表示不小于n的最大整数
    select ceiling(2.3);
  • 求四舍五入值round(n,d),n表示原数,d表示小数位置,默认为0
    select round(1.6);
  • 求x的y次幂pow(x,y)
    select pow(2,3);
  • 获取圆周率PI()
    select PI();
  • 随机数rand(),值为0-1.0的浮点数
    select rand();

日期时间函数

  • 获取子值,语法如下
    year(date)返回date的年份(范围在1000到9999)
    month(date)返回date中的月份数值
    day(date)返回date中的日期数值
    hour(time)返回time的小时数(范围是0到23)
    minute(time)返回time的分钟数(范围是0到59)
    second(time)返回time的秒数(范围是0到59)
    select year('2016-12-21');

  • 日期计算,使用±运算符,数字后面的关键字为year、month、day、hour、minute、second
    select '2016-12-21'+interval 1 day;

  • 日期格式化date_format(date,format),format参数可用的值如下

    获取年%Y,返回4位的整数

    * 获取年%y,返回2位的整数

    * 获取月%m,值为1-12的整数

    获取日%d,返回整数

    * 获取时%H,值为0-23的整数

    * 获取时%h,值为1-12的整数

    * 获取分%i,值为0-59的整数

    * 获取秒%s,值为0-59的整数

select date_format('2016-12-21','%Y %m %d');

  • 当前日期current_date()
    select current_date();
  • 当前时间current_time()
    select current_time();
  • 当前日期时间now()
    select now();

视图

  • 对于复杂的查询,在多次使用后,维护是一件非常麻烦的事情
  • 解决:定义视图
  • 视图本质就是对查询的一个封装
  • 定义视图
create view stuscore as
select students.*,scores.score from scores
inner join students on scores.stuid=students.id;
  • 视图的用途就是查询
    select * from stuscore;

子查询

  • 查询支持嵌套使用
  • 查询各学生的语文、数学、英语的成绩
select sname,
(select sco.score from scores sco inner join subjects sub on sco.subid=sub.id where sub.stitle='语文' and stuid=stu.id) as 语文,
(select sco.score from  scores sco inner join subjects sub on sco.subid=sub.id where sub.stitle='数学' and stuid=stu.id) as 数学,
(select sco.score from  scores sco inner join subjects sub on sco.subid=sub.id where sub.stitle='英语' and stuid=stu.id) as 英语
from students stu;

事务

  • 当一个业务逻辑需要多个sql完成时,如果其中某条sql语句出错,则希望整个操作都退回
  • 使用事务可以完成退回的功能,保证业务逻辑的正确性
  • 事务四大特性(简称ACID)
    原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行
    一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致
    隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的
    持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障
  • 要求:表的类型必须是innodb或bdb类型,才可以对此表使用事务
  • 查看表的创建语句
    show create table students;
  • 修改表的类型
    alter table '表名' engine=innodb;
  • 事务语句
    开启begin;
    提交commit;
    回滚rollback;

外键

  • 创建表的语句如下
create table scores(
id int primary key auto_increment,
stuid int,
subid int,
score decimal(5,2)
);
  • 思考:怎么保证关系列数据的有效性呢?任何整数都可以吗?
  • 答:必须是学生表中id列存在的数据,可以通过外键约束进行数据的有效性验证
  • 为stuid添加外键约束
    alter table scores add constraint stu_sco foreign key(stuid) references students(id);
  • 此时插入或者修改数据时,如果stuid的值在students表中不存在则会报错
  • 在创建表时可以直接创建约束
create table scores(
id int primary key auto_increment,
stuid int,
subid int,
score decimal(5,2),
foreign key(stuid) references students(id),
foreign key(subid) references subjects(id)
);

外键的级联操作

  • 在删除students表的数据时,如果这个id值在scores中已经存在,则会抛异常

  • 推荐使用逻辑删除,还可以解决这个问题

  • 可以创建表时指定级联操作,也可以在创建表后再修改外键的级联操作

  • 语法
    alter table scores add constraint stu_sco foreign key(stuid) references students(id) on delete cascade;

  • 级联操作的类型包括:
    restrict(限制):默认值,抛异常
    cascade(级联):如果主表的记录删掉,则从表中相关联的记录都将被删除
    set null:将外键设置为空
    no action:什么都不做

mysql关联查询 事务 索引 外键相关推荐

  1. mysql关联查询去重_MySQL外键和高级查询(连接查询、联合查询、子查询、去重查询)...

    MySQL的外键 什么是外键,很简单保持数据一致性的一个约束键.如果你有两张表,第一张是学生表,第二张表是一个成绩表,我们来看看保持数据一致性,其实在Django等框架的模型中中也能做关联获取对象. ...

  2. mysql授权、关联查询、主外键关系

    创建用户: 无密码: create user bbb@localhost; 加密码的: create user bbb@localhost identified by "123"; ...

  3. 数据表中通过关联查询到每个外键ID所指的name以及其他属性

    之前我在网上百度,想要找到一个合适的方法老是找不到,自己现在解决了,在这里记录一下. 前提条件: 我有一张歌曲表.一张专辑表.一张歌手表. 其中歌曲表中有两个外键song_albumId.song_s ...

  4. MySQL数据类型、约束、外键、索引、存储引擎

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 MySQL中数据类型 整型 浮点型 字符串类型 枚举和集合 时间类型 timestamp YYYYMMDDHHMMSS(时间 ...

  5. 数据库表设计索引外键设计_关于索引的设计决策 数据库管理系统

    数据库表设计索引外键设计 Introduction: 介绍: The attributes whose values are required inequality or range conditio ...

  6. 如何在SQL Server中索引外键列

    Before going through the main concern of this article, indexing the foreign key columns, let's take ...

  7. Mysql 关联查询的优化 及 子查询优化

    Mysql 关联查询的优化 left join ①EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card = book.card; ②如何优化 ...

  8. mysql中为表增加外键_如何在Excel 2013中为符号分配键盘快捷键

    mysql中为表增加外键 We've previously shown you how to add keyboard shortcuts to symbols in Word 2013 to mak ...

  9. mysql关联查询操作表最新数据

    mysql关联查询操作表最新数据 mysql关联查询操作表最新数据的几种方式(max,order by)和性能分析,再数据量较多,关联ID存在索引的情况下建议使用方式二,速度更快.具体请看SQL及EX ...

最新文章

  1. 删数据,还要删AI模型:美国科技公司遭遇最严厉隐私泄露处罚
  2. 校园二手平台的开发和利用
  3. 关于mbzuai的offer的三点思考
  4. P3225-[HNOI2012]矿场搭建【tarjan,图论】
  5. 学习,学习javascript
  6. 【发现问题】IDEA设置全局新创建文件默认换行符
  7. java中位数_java 计算中位数方法
  8. #CSP 201912-1 报数(C语言)(100分)
  9. 国家开放大学2021春1067知识产权法题目
  10. 【虚拟机装黑苹果(第三弹)】macOS安装镜像格式转换(dmg转iso,非UltraISO方法)
  11. 微信收藏保存服务器,微信的收藏和保存功能有啥区别?
  12. 转载来自朱小厮博客的 一文看懂Kafka消息格式的演变
  13. 如何将自己网络计算机更名,如何将自己的win7电脑变身wifi无线网络热点
  14. 设计一个最优算法来查找一n个元素数组中的最大值和最小值
  15. python英文文本情感分析_sentimentpy模块进行中文文本情感分类
  16. 利用NCBIdatasets批量下载大规模生信数据集
  17. PHP/Golang实现—数据结构之顺序栈
  18. 服务器硬盘 frn bad,【服务器问题】浪潮inspur服务器个别硬盘亮红灯且发出1长的滴滴声响...
  19. 计算机基础重点考题解析(二)
  20. ZFS文件系统(8) -- SLOG

热门文章

  1. 装cv2加速_手动安装OpenCV下的IPP加速库
  2. NativeScaler()与loss_scaler
  3. vuejs项目开发环境搭建(ESlint安装)
  4. phpcmsV9子栏目调用其父栏目名称、URL、catid等信息 - 方法总结
  5. WordPress主题:Zibll子比主题 V4.0 绿色版
  6. 测带宽的工具_发送端测试的主力设备 - 实时示波器朝向高带宽高位数发展
  7. 单处理机系统的进程调度实验_Chcore -- 上交IPADS操作系统银杏书配套Lab实验笔记 - Lab3进程与异常(一)...
  8. 中国首个开源学校教务管理系统、网站布局自动化、学生/成绩/教师、成绩查询
  9. Spring Boot 2.0 开源项目--云收藏。收藏你所喜欢的一切。
  10. mysql不能写重复键_mysql主键重复,不抱错,只更新的骚操作 (如果没有插入,如果有更新)...