外键的变种,单表的查询,多表的查询

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;

 ###查出来的任何表都是虚拟的表,当关闭服务器,或者退出,都将不存在.###

  

原文地址:https://www.cnblogs.com/ljc-0923/p/9801310.html