MYSQL大杂烩

 

外键创建方法:

 

1.alter table 表名 add constraint FK_ID foreign key(外键字段名) references 外表名(外表键名)

2.create table 表名(id int(4) not null primary key auto_increment,gid int(4) ,constraint FK_ID foreign key(外键字段名) references

外表名(外表键名) )

 注意:

1.  两个字段的类型或者大小不严格匹配。例如,如果一个是int(10),那么外键也必须设置成int(10),而不是int(11),也不能是tinyint。另外,你还必须确定两个字段是否一个为 signed,而另一个又是unsigned(即:无符号),这两字段必须严格地一致匹配。

2. 试图设置外键的字段没有建立起索引,或者不是一个primary key(主键)。如果其中一个不是primary key的话,你必须先为它创建一个索引。

3. 其中一个或者两个表是MyISAM引擎的表。若想要使用外键约束,表必须是InnoDB引擎(实际上,如果两个表都是MyISAM 引擎的,这个错误根本不会发生,但也不会产生外键,只会建立索引)你需要检查表的引擎类型。

4. 外键的名字不能重复。你应该检查你的数据库以确保外健名字是唯一的,或者你在键名后面加上几个随机的字符以测试是否是这个原因。

5. 你可能设置了ON DELETE SET NULL,但是相关的键的字段又设置成了NOTS NULL值。你可能通过修改cascade的属性值或者把字段属性设置成allow null来解决。

6. 请确定你的Charset和Collate选项在表级和字段级上的一致。

7. 你可能设置为外键设置了一个默认值,如default=0。

8. ALTER声明中有语法错误

删除外键

alter table locstock drop foreign key locstock_ibfk2

查看表有哪些外键

show create table locstock

sql格式: select 列名/* from 表名 where 条件 group by 列 having 条件 order by 列 asc/desc;

select sex, count(Sex) as count from tch_teacher where id > 15 group by Sex having count > 5 order by Sex asc limit 1;

我们知道标准查询关键字执行顺序为 from->where->group by->having->order by

 

1-> from 表 : 首先拿到表

2-> where 条件 : 根据where后面的条件筛选一遍数据集合A

3-> group by 分组 : 对筛选出的数据A, 根据group by后面的列进行分组, 得到数据集B

4-> having 筛选 : 对数据集B进行进一步筛选, 得到数据集C

5-> select 数据 : 这里有四步

                         第一步 : 根据select后面的列名, 去数据集C中取数据. 得到数据集D

                         第二步 : 对数据集D中的数据进行去重操作(这一步是建立在 sql中有distinct 情况下), 得到数据集E

                         第三步 : 对数据集E进行排序操作, 得到数据集F

                         第四步 : 对数据集F进行截取数据操作, 得到最终的数据集(执行 limit 10 操作)

left join 是在from范围类所以 先on条件筛选表,然后两表再做left join。

而对于where来说在left join结果再次筛选。
 

一、连表查询

1. 交叉连接 -- 笛卡尔乘积  cross join

select * from tch_teacher cross join tch_contact

2. 内连接 -- inner join 

内连接在不加on的情况下, 也是去求笛卡尔乘积. 不加on的用法并不推荐使用, 容易造成内存溢出的情况. 加on的时候, 在连表的时候, 就会对数据进行筛选, 以此来缩减有效数据范围

3. 外连接 -- left/right join on 

这里我特意加了一个on在上面, 因为不加on是会报错的.

left join 称之为左连接, 连接以左侧表数据为准, 当右表没有数据与之匹配的时候, 则会用null填补

right join 称之为右连接, 与 left join 相反, 这个是以右表为准

select * from tch_teacher left join tch_contact on tch_teacher.Id = tch_contact.TId;

4.union查询

除了把几个表通过内部关系拼成一个表结果, 还可以, 把多个表的查询表结果拼成一个表结果. 所使用的方法就是union.

这里要注意的是, 列的顺序. 如果害怕列的顺序不一致不好排查, 可以把表结果的列名都重命名为相同的.

select Id, Sex, BId, `No`, Name, CreateDate from tch_teacher

union

select 0 as Id, Sex, BId, `No`, Name, CreateDate from tch_teacher_temp

union是会对最后的表结果进行去重操作的, 如果我不想去重, 只想快速得到拼接的结果, 可以使用 union all 来拼接. 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值