在定义外键约束前想两个问题(1:那个是主表?2:那个是从表?) 内连接和外连接查询前想的两个问题(1:查询那些表?2:确定表的连接条件?) 子查询涉及多表操作查询前需要想四个问题(1:查询那些数据?2:查询条件是什么?3:是否是主表查询?4:确定连接条件)
约束: 主键 primary key 自增:auto_increment 唯一 Unique 非空 not null 默认 Default 外键 foreign key
on update cascade 级联更新 on delete cascade 级联删除
like % 匹配多个
例如:select * from t_bm where name like 'ja%'; #查询以ja开头结尾任意字符的所有内容like _ 匹配一个
例如:select * from t_bm where age like '_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; #根据升续查询所有数据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总和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的内容隐式内连接:看不到 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关联左外连接:用左边表的记录去匹配右边表的记录,如果符合条件的则显示;否则,显示 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.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';