#创建数据库
create database test
#删除数据库
drop database test
#选数据库
use test
#创建表
create table if not exists user2(mid int unsigned auto_increment,PRIMARY KEY ( mid )) engine=InnoDB default charset=utf8
#删除表
drop table user2
#获取表
show tables
#多条插入;now()是mysql函数,返回日期和时间。
insert into user (name,datetime) values ('heng',now()),('yue',now());
//distinct去重,name和datetime 同时相同才会去重
select distinct name,datetime from user
在两个具有关联关系的表中删除数据时,一定要先删除从表中的数据,再删除主表中的数据。
内连接(交叉连接)
A:select a.*,b.* from table1 a,table2 b where a.id=b.id
B:select * from table1 a cross join table2 b where a.id=b.id (注:cross join后加条件只能用where,不能用on)
C:select * from table1 a inner join table2 b on a.id=b.id
// 一般不建议使用方法A和B,因为如果有WHERE子句的话,往往会先生成两个表行数乘积的行的数据表然后才根据WHERE条件从中选择。
外连接(左left/右right连接)
当返回的查询结果不仅需要包含符合条件的数据,还需要包含其中一个表或者两个表的所有数据的时候,需要用到外连接查询
select * from bbs left join user on bbs.user=user.id where bbs.id=16
//LEFT JOIN ——左连接:返回包括左表中的所有记录和右表中符合条件的记录。
//right join右连接:与左连接相反,返回包括右表中的所有记录和左表中符合条件的记录。
子查询
子查询是指一个查询语句嵌套在另一个查询语句内部的查询。在执行时,首先执行子查询中的语句,然后将返回的结果作为外层查询的过滤条件。
// 带 IN 关键字的子查询(查询年龄为20岁的员工的部门)
SELECT * FROM department WHERE id IN (SELECT did FROM employee WHERE age=20);
//带not in(查询不存在年龄为20岁的员工的部门)
SELECT * FROM department WHERE did NOT IN (SELECT did WHERE age=20);
//带 EXISTS 关键字的子查询
// EXISTS 关键字后面的参数可以是任意一个子查询,这个子查询不产生任何数据,只返回 TRUE 或 FALSE,当返回 TRUE 时,外层查询才会执行。
SELECT * FROM department WHERE EXISTS (SELECT did FROM employee WHERE age >21 );
//带 ALL 关键字的子查询
//ALL关键字类似于ANY ,只是ALL关键字的子查询返回的结果需要同时满足所有内查询条件。
SELECT * FROM department WHERE did > ALL (SELECT did FROM employee);
//带 ANY 关键字的子查询
//ANY 关键字表示只要满足内层子查询中的任意一个条件,就返回一个结果作为外层查询条件。
SELECT * FROM department WHERE did >ANY (SELECT did FROM employee);
//带 比较运算符的子查询
SELECT did,name FROM department WHERE did = (SELECT did FROM employee WHERE name='赵四');
in和exists区别及应用场景
in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。