天天看点

MySQL之个人记录

在定义外键约束前想两个问题(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';