在定义外键约束前想两个问题(1:那个是主表?2:那个是从表?)
内连接和外连接查询前想的两个问题(1:查询那些表?2:确定表的连接条件?)
子查询涉及多表操作查询前需要想四个问题(1:查询那些数据?2:查询条件是什么?3:是否是主表查询?4:确定连接条件)
约束:
主键 primary key 自增:auto_increment
唯一 Unique
非空 not null
默认 Default
外键 foreign key
on update cascade 级联更新
on delete cascade 级联删除
1:去除重复数据:DISTINCT
例如:SELECT DISTINCT NAME FROM t_bm; #查询name字段去除重复数据的内容
2:区间查询:between 10 and 100;
例如:SELECT * FROM t_bm WHERE age BETWEEN 10 AND 100; #查询年龄在10到100之间的所有数据内容
3:模糊查询:
like % 匹配多个
例如:select * from t_bm where name like 'ja%'; #查询以ja开头结尾任意字符的所有内容
like _ 匹配一个
例如:select * from t_bm where age like '_4'; #查询某个字符开头结尾为4的所有内容
4:排序
DESC:降续
例如:SELECT * FROM t_bm WHERE NAME='java' ORDER BY age DESC; #查询name字段为java对age字段进行降续排序查询
ASC:升续
例如:SELECT * FROM t_bm ORDER BY age ASC; #根据升续查询所有数据
5:组合排序
例如:SELECT * FROM t_bm ORDER BY age DESC,id ASC; #根据age降续查询,如果age相同,那么再根据id升续排序
6:聚合函数 一般配合分组进行统计数据查询
max():SELECT MAX(age) FROM t_bm; #查询age最大值
min():SELECT MIN(age) FROM t_bm; #查询age最小值
avg():SELECT avg(age) FROM t_bm; #查询age平均值
count():SELECT COUNT(NAME) FROM t_bm;
SELECT COUNT(IFNULL(NAME,'te')) FROM t_bm; #注意:对于 NULL 的记录不会统计,建议如果统计个数则不要使用有可能为 null 的列,可以利用 IFNULL()函数,如果记录为 NULL,给个默认值,这样统计的数据就不会遗漏
sum():SELECT SUM(age) FROM t_bm; #查询age总和
7:分组 GROUP BY 分组的目的就是为了统计,一般分组会跟聚合函数一起使用(注意:where和having)
where:分组前过滤,后面不可以跟聚合函数
having:分组后过滤,后面可以跟聚合函数
例如:
SELECT NAME,COUNT(NAME) FROM t_bm GROUP BY NAME; #根据name字段分组查询每个name的数量
SELECT NAME,COUNT(NAME) FROM t_bm WHERE age > 20 GROUP BY NAME; #根据name进行分组,查询age大于20的name数量统计
SELECT NAME,COUNT(NAME) FROM t_bm WHERE age > 20 GROUP BY NAME HAVING COUNT(NAME)>1; #根据name进行分组,查询age大于20的name数量统计并只显示分组后的name数量大于1的内容
8:内连接
隐式内连接:看不到 JOIN 关键字,条件使用 WHERE 指定
例如:select * from emp,dept where emp.`dept_id` = dept.`id`; #一对多关联关系:查询所有员工和部门,根据员工外键关联部门id作为条件查询
显示内连接:使用 INNER JOIN … ON 语句, 可以省略 INNER
例如:select * from emp e inner join dept d on e.`dept_id` = d.`id`; 注意:查询前思考左表和右表是主表还是从表,如果是左表是从表则根据外键关联,如果左表是主表则根据主表id关联
9:外连接
左外连接:用左边表的记录去匹配右边表的记录,如果符合条件的则显示;否则,显示 NULL,就是在内连接的基础上保证左表的数据全部显示
例如:select * from dept d left join emp e on d.`id` = e.`dept_id`;
右外连接:用右边表的记录去匹配左边表的记录,如果符合条件的则显示;否则,显示 NULL,就是在内连接的基础上保证右表的数据全部显示
例如:select * from dept right join emp on dept.`id` = emp.`dept_id`;
10:子查询:一个查询的结果做为另一个查询的条件,有查询的嵌套,内部的查询称为子查询。
10.1:子查询结果只要是单列单行(子查询的结果只是一个值),可以在 WHERE 后面作为条件,父查询使用:比较运算符,如:> 、<、<>、= 等
例如:select * from emp where salary = (select max(salary) from emp);
10.2:子查询结果是单列多行(子查询的结果是多个值),结果集类似于一个数组,父查询使用 IN 运算符
例如:select name from dept where id in (select dept_id from emp where salary > 5000);
10.3:子查询结果只多列多行(查询多列,子查询的结果是多个值)。
select * from dept d, (select * from emp where join_date >='2011-1-1') e whered.`id`= e.dept_id;
仔细看它可以使用内连接进行查询
例如:select * from emp inner join dept on emp.`dept_id` = dept.`id` and join_date >='2011-1-1';