外键的变种,单表的查询,多表的查询
1,表的三种对应关系:
1.1>一对多:比如一个出版社可以出多种书.
同样的,先建立主表,在建立从表,插入数据也是先插入主表的数据,在插入从表的数据.
1.2>多对多的对应关系:一个作者可以写多本数,一本书也可以被多个作者写
当有多对多的对用关系的时候,需要借助于第三章表来表明二者的对应关系.
对于多对多的建立表,需要先把主表创建出来,再创建从表 ,插入数据也是一样的,当多对多第三章表插入数据的时候,需要和每一个主表都要有外键(在这里相当于是两个表之间联系的桥梁.)
1.3>一对一,就是一一建立对应关系在谁那设置外键都可以.
2,单表查询(重中之重)
语句:select 字段1, 字段2...from 表名
where 条件
group by filed
having 筛选
order by filed
limit 限制条件
重点中的重点:关键字的执行优先级
from
where
group by
having
select
distinct
order by
limit
1,找到表:from
2,拿着where指定的约束条件,去文件/表中取出一条条记录
3,将取出的一条条记录进行分组group by,如果没有group by,则整体做为一组
4,将分组的结果进行having过滤
5,执行select
6,去重
7,将结果按条件排序:order by
8,限制结果的显示条数
2.1>where约束
#where 字句中可以使用 1,比较运算符:>,<,>=,<=,<>,!= 2,范围值between 80 and 100:表示在80~100之间 3,in (80,90,100)值是10或20或30 4,like "xiaomagepattern":pattern可以是$或者_.%表示多字符,_表示一个字符 5,逻辑运算:在多个条件直接可以使用逻辑运算符 and or not
2.2>单条件查询
mysql> select id,name from employee where id > 5;
2.3>多条件查询
mysql> select name from employee where post='teacher' and salary>10000;
2.4>关键字查询:
select name,salary from employee where salary between 10000 and 20000; select name,salary from employee where salary not beyween 10000 and 2000;
#在这里""是表示空的字符串,不是null select name,post_comment from employee where post_comment= ""; 此时得到的结果是:查不到 当执行下边的指令的时候: update employee set post_comment = "" where id = 2;
就可以查到结果了.
2.5>关键字in集合查询
mysql> SELECT name,salary FROM employee WHERE salary=3000 OR salary=3500 OR salary=4000 OR salary=9000 ;
2.6>关键字like模糊查询(通配符"%表示后边可以跟多个字符,通配符"_"表示后边陪一个字符")
mysql> SELECT * FROM employee WHERE name LIKE 'liang%';
3,分组查询:group by
要设置:mysql> set global sql_mode='only_full_group_by';
并查看是否设置成功:mysql> select @@gloabl.sql_mode;
设置完以后,一定要退出,重新进入.然后登录才有效.
同过group by分组以后,只能查看当前字段,如果想要查看组内信息,需要借助于聚合函数.
4,聚合函数
max()求最大值 min()求最小值 avg()求平均值
sum()求和 count()求总个数
###聚合函数聚合的是组内的内容, 若是没有分组则默认是一组.
#每个部门有多少员工 select post,count(id) from employee group by post;
#每个部门的最高薪水 select post ,max(salary) from employee group by post;
#每个部门最低薪水 select post,min(salary) from employee group by poost;
#每个部门的平均薪资 select post,avg(salary) from employee group by post;
#每个部门的锁有薪水总和 select post,sum(salary) from employee group by post;
#查看每个部门的所有人, select post, group_concat(name) from employee group by post;
#查询每个部门的男员工数和女员工数 select post,count("male"),count("female") from employee group by post;
5,having:过滤的意思
having是发生在group by 之后,所以having中可以使用分组的字段,无法直接去到其他字段,可以使用聚合函数.
1. 查询各岗位内包含的员工个数小于2的岗位名、岗位内包含员工名字、个数 2. 查询各岗位平均薪资大于10000的岗位名、平均工资 3. 查询各岗位平均薪资大于10000且小于20000的岗位名、平均工资
6,order by查询排序
6.1>按单列查询:
select * from employee order by age;
select * from employee order by ASC;
select * from employee order by DESC;
6.2>按多列查询:先按照age升序,如果年纪相同,则按照id降序
select * from employee
order by age ASC(升序),
id DESC(降序);
select * from employee order by asc,hire_date desc;
7,limit限制查询的记录数:
select * from employee order by salary desc limit 3;
表示按照薪资倒序,并取前三位.
select * from employee order by salary desc limit 0,5;
表示从0开始查,,查出钱5条数据
select * from employee order by salary desc limit 5,5;
表示查出从第6要数据开始再查5条数据
#分页操作 mysql> select * from employee limit 0,5; mysql> select * from employee limit 5,5; mysql> select * from employee limit 10,5; mysql> select * from employee limit 15,5;
###查出来的任何表都是虚拟的表,当关闭服务器,或者退出,都将不存在.###