cross join 交叉链接,是完全没有条件,直接连接在一起
full outer join的写法在mysql不支持
可以把左外连接和右外连接union 纵向合并
union起来就实现了完全外连接
A表B表进行连接,但是把交集部分排除了
子查询就是select语句嵌套
交集不要就是teacherid为null,或者tid为空
名字不明确就需要过滤下
创建一个表塞入数据,auto_increment自动递增
每个员工的名字,和上司的ID
现在想查每个员工的上司姓名
如果用inner join 会丢失mage的记录
outer可以省略不写
一个学生可能参加多门课程学习,每门课都可能多个学生参加学习*
查学生姓名和考试成绩
inner join就变成参加科目有成绩的人了
子查询一般性能比较差
select语句的执行顺序,先from,where,group by,having,order by ,select,limit
视图
视图本身并不存放数据,就是对实体表的查询结果,存放在虚拟表里,经常要查,就可以定义成视图
这个不是表只是一个查询结果
可以对它进行查询操作
可以看到创建视图的时候定义的命令
这里显示的就是视图
如果是表就没有view的提示
可以对视图插入数据
实际上修改了物理表
视图定义的是大于30的
本质上还是放到表里了
删除视图
用户在使用视图的时候,不需要关心数据来自哪些表,可以实现在显示的时候加约束,表结构发生变化,如果用的视图,只需要修改视图定义,不用修改程序
系统函数有很多
如果系统函数满足不来要求,也可以自定义函数UDF
可以创建一个函数
函数调用,要加()
换个数据库无法调用
加上数据库的前缀才可以调用,跨数据库了
select function status 当前显示所有的函数
函数定义好后,存放在mysql数据库种
定义在proc中
可以加参数,UNSIGNED只能正数
**定义有参数的命令需要把DELIMITER执行一下,
是因为在定义函数的时候可能有多条语句,多条语句就需要分号,分号带来的问题,系统就会自动认为是独立语句要执行,但是实际上却是完整的一个命令,
所以把以前认为分号;是执行命令的情况改一下,改成认为// **
有两个函数,把delimiter 结束符改成原来的分号;
查看ID
函数不能直接使用,必须要调用
删除27条记录,还剩26条
第27条被删除了
xy是虚拟参数,以后往里面传入的值就是实际参数
set赋值和select into赋值
把执行的结果作为值赋值给x存储过程是存在mysql.proc找个表里的
函数也是存放在里面的
存储过程可以有多个返回结果,自定义函数就一个,存储过程可以理解是一个shell命令,函数一般嵌套在sql语句使用
查看所有存储过程列表
now是显示当前系统时间
mysql数据库是用CALL来调用,
sqlserver 可以直接调用procedure ,当命令用,更新bash脚本直接调用
存储过程和函数都是语句块的集合
存储过程是可以当命令来用的
也支持加参数IN id代表这个参数是传入用的
这个数值就赋值给了id,用 下面的语句去查
存储过程和函数,有一个趋向就是数据库就是数据库不用 搞那么复杂,其他处理的用善于处理这些语言来进行处理REPEAT 等于循环,,不断的+1,直到i>n
把26条删除了,也只是影响一条
存储过程还可以用到其他语法
相当于break continue
现在sql数据库的性能瓶颈是比较严重的,应该想尽办法减轻数据库的负担,逻辑处理交给语言处理就可以了
一般mysql并发达到100,200用户就差不多 了,所以尽量减少对数据库的负担