Mysql查询

大城市里の小女人 提交于 2020-04-07 06:59:22

一、简单的查询

我们先看一些简单的查询,数据库导入脚本将在文末贴出:

SELECT * FROM t_employee;

#查询孙红雷的姓名和薪资
SELECT ename,salary FROM t_employee WHERE ename='孙红雷'

#查询孙红雷的姓名和领导编号
SELECT ename,`mid` FROM t_employee WHERE ename='孙红雷'

#给查询结果取别名
SELECT ename AS "姓名", salary AS "薪资" FROM t_employee;

二、运算符

1、算数运算符

/*
算术运算符:
加:+
减:-
乘:*
除:/  或  div
	div只保留整数部分
模:%  或  mod
*/

#查询员工的姓名和薪资
SELECT ename,salary FROM t_employee;

#查询员工的姓名和原来的薪资和涨薪1000元后的薪资
SELECT ename,salary,salary + 1000 FROM t_employee;

#查询9/4的结果
mysql> SELECT 9/4;
+-------+
| 9 / 4 |
+-------+
| 2.25  |
+-------+
#查询9/4的结果
mysql> SELECT 9 DIV 4;
+---------+
| 9 DIV 4 |
+---------+
|       2 |
+---------+

#查询员工的姓名,和每天的薪资,假设每个月的工作日是22天
SELECT ename AS "姓名", salary / 22 AS "日薪" FROM t_employee

#查询9%4的结果
mysql> select 9%4, 9 MOD 4;
+-----+---------+
| 9%4 | 9 MOD 4 |
+-----+---------+
|   1 |       1 |
+-----+---------+
1 row in set

2、比较运算符

/*
比较运算符
大于:>
小于:<
大于等于:>=
小于等于:<=
等于:=    
   赋值和比较都是用=
不等于:!=  或  <>
安全等于:<=>
*/

#查询薪资大于20000的员工
SELECT * FROM t_employee WHERE salary > 20000;

#查询薪资等于9000
SELECT * FROM t_employee WHERE salary = 9000;

#查询部门编号不是1的员工
SELECT * FROM t_employee WHERE did != 1;
SELECT * FROM t_employee WHERE did <> 1;

#查询奖金比例是NULL的员工
SELECT * FROM t_employee WHERE commission_pct = NULL;#错误的
SELECT * FROM t_employee WHERE commission_pct <=> NULL;
SELECT * FROM t_employee WHERE commission_pct IS NULL;

3、逻辑运算符

/*
逻辑运算符
与:&& 或 and
或:|| 或 or
非:!  或 not
*/
#查询薪资高于10000 并且低于15000的女员工
SELECT * FROM t_employee
WHERE salary > 10000 && salary <15000 AND gender = '女'

#查询薪资高于20000  或者  籍贯是 浙江
SELECT * FROM t_employee
WHERE salary > 20000 || native_place = '浙江';

#查询非浙江籍的男生
SELECT * FROM t_employee
WHERE NOT native_place = '浙江' AND gender = '男';

#查询奖金比例非空的员工
SELECT * FROM t_employee
WHERE commission_pct IS NOT NULL;

4、区间范围和集合范围运算符

/*
区间范围和集合运算符

区间范围:
between xx and yy:[xx,yy]
not between xx and yy:  小于xx 或 大于yy

集合范围:
in (值列表)
not in(值列表)
*/


#查询薪资大于等于10000 并且小于等于15000的员工
SELECT * FROM t_employee
WHERE salary BETWEEN 10000 AND 15000;

#查询籍贯是 “浙江”、“北京”、“上海”、“黑龙江”的员工
SELECT * FROM t_employee
WHERE native_place IN ('浙江','上海','北京','黑龙江');

#查询籍贯不是 “浙江”、“北京”、“上海”、“黑龙江”的员工
SELECT * FROM t_employee
WHERE native_place NOT IN ('浙江','上海','北京','黑龙江');

5、模糊查询运算符

/*
模糊查询:
like 'xx'

xx可以用占位符:
 _:代表确定的一个字符
 %:代表是任意个数的字符,0~n个
*/

#查询名字中,第二个字是“冰”
SELECT * FROM t_employee
WHERE ename LIKE '_冰%';

6、位运算符:<<,>>,&,|,^,~,>>>

三、关联查询

/*
关联查询:
1、内连接:inner join
2、外连接
(1)左外连接:left join
(2)右外连接:right join
(3)全外连接:full join  mysql不支持

关联查询的结果一共有七种:
关联查询必须有两张或两张以上,以下用两张来示例:
(1)A ∩ B
	用内连接
(2)A
(3)A - A ∩ B
	(2)和(3)用左连接
(4)B
(5)B - A ∩ B
	(4)(5)用右连接
(6)A ∪ B
(7)A ∪ B - A ∩ B
	(6)(7)过去应该用全外连接,现在用union
	(6)(2)的结果 union (4)B
	(7)(3)的结果 union (5)的结果
*/

关联查询图解

(1)A∩B


(2)A


(3)A - A∩B


(4)B


(5)B-A∩B


(6)A∪B


(7)A∪B - A∩B


1、内连接

/*
内连接
(1)形式一:
select 字段列表
from A表 inner join B表
on 关联条件
【where 其他筛选条件】

说明:
   如果不写关联条件,会出现一种现象:笛卡尔积
   关联条件的个数 = n - 1,n是几张表关联
   on只能和join一起用
   
(2) 形式二
select 字段列表
from A表 , B表
where 关联条件 【and 其他筛选条件】
*/

#查询所有的员工的姓名和他所在部门的编号和部门的名称,不包括那些没有安排部门的员工
SELECT ename,did,dname FROM t_employee INNER JOIN t_department  #错误
#1052 - Column 'did' in field list is ambiguous,因为did没有说明是哪个表的

SELECT ename,t_employee.did,dname
FROM t_employee INNER JOIN t_department
ON t_employee.did = t_department.did;

SELECT ename,t_employee.did,dname
FROM t_employee , t_department
WHERE t_employee.did = t_department.did;

#查询所有的女员工的姓名和他所在部门的编号和部门的名称,不包括那些没有安排部门的员工
SELECT ename,t_employee.did,dname
FROM t_employee INNER JOIN t_department
ON t_employee.did = t_department.did
WHERE gender = '女';

SELECT ename,t_employee.did,dname
FROM t_employee , t_department
WHERE t_employee.did = t_department.did AND gender = '女';


#查询员工编号,员工的姓名,部门编号,部门名称,职位编号,职位名称
#需要t_employee,t_department, t_job
SELECT t_employee.eid, t_employee.`ename`, t_department.did,t_department.`dname`, t_job.`job_id`,t_job.`job_name`
FROM t_employee INNER JOIN t_department INNER JOIN t_job
ON t_employee.did = t_department.did AND t_employee.`job_id` = t_job.`job_id`;


SELECT t_employee.eid, t_employee.`ename`, t_department.did,t_department.`dname`, t_job.`job_id`,t_job.`job_name`
FROM t_employee , t_department , t_job
WHERE t_employee.did = t_department.did AND t_employee.`job_id` = t_job.`job_id`;

2、左连接

/*
左连接:
第一种结果:A
select 字段列表
from A表 left join B表
on 关联条件

第二种结果:A - A∩B
select 字段列表
from A表 left join B表
on 关联条件
where 从表的关联字段 is null

左连接和右连接的区别:
(1)left换成right
(2)以左边的表为主还是以右边的表为主
右连接
第一种结果:B
select 字段列表
from A表 right join B表
on 关联条件

第二种结果:B - A∩B
select 字段列表
from A表 right join B表
on 关联条件
where 从表的关联字段 is null
*/

#查询所有员工和他的部门编号,部门名称,包括那些没有部门的员工
SELECT * 
FROM t_employee LEFT JOIN t_department
ON t_employee.did = t_department.did;

#查询所有没有部门的员工
#不用关联查询也可以实现
SELECT * FROM t_employee WHERE did IS NULL;

#用关联查询
SELECT * 
FROM t_employee LEFT JOIN t_department
ON t_employee.did = t_department.did
WHERE t_employee.did IS NULL;

3、全连接

/*
使用union实现全连接的效果
(1)A ∪ B
select 字段列表
from A表 left join B表
on 关联条件
union
select 字段列表
from A表 right join B表
on 关联条件

(2)A ∪ B - A ∩ B

select 字段列表
from A表 left join B表
on 关联条件
where 从表的关联字段 is null
union
select 字段列表
from A表 right join B表
on 关联条件
where 从表的关联字段 is null
*/

#查询所有员工和部门信息,包括那些没有部门的员工和没有员工的部门
SELECT *
FROM t_employee LEFT JOIN t_department
ON t_employee.did = t_department.did
UNION
SELECT *
FROM t_employee RIGHT JOIN t_department
ON t_employee.did = t_department.did;

#查询那些没有部门的员工和没有员工的部门
/*
where xxx  is null
xxx 看从表

员工表和部门表来说,员工表是从表。
因为主表的字段,例如did是不可能为null
*/
SELECT *
FROM t_employee LEFT JOIN t_department
ON t_employee.did = t_department.did
WHERE t_employee.did IS NULL
UNION
SELECT *
FROM t_employee RIGHT JOIN t_department
ON t_employee.did = t_department.did
WHERE t_employee.did IS NULL;

4、自连接

/*
特例:自连接
联合查询需要两张表,现在自连接,就一张表当两张表用。

通过给表取别名的方式,把一张表变成“两张表”
表的别名不要加""
*/

#查询员工的编号,员工的姓名,领导的编号,领导的姓名
#因为员工的信息和领导的信息都在t_employee表
SELECT emp.eid,emp.ename,emp.`mid`,mgr.ename
FROM t_employee AS emp INNER JOIN t_employee AS mgr  #emp代表员工表,mgr代表领导表
ON emp.`mid` = mgr.`eid`;  #员工的领导编号 = 领导的员工编号

附、数据库导入脚本

/*
SQLyog Ultimate v11.25 (64 bit)
MySQL - 5.5.27 : Database - mysqldb
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`test` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `test`;

/*Table structure for table `t_department` */

DROP TABLE IF EXISTS `t_department`;

CREATE TABLE `t_department` (
  `did` int(11) NOT NULL AUTO_INCREMENT,
  `dname` varchar(20) NOT NULL,
  `description` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`did`),
  UNIQUE KEY `dname` (`dname`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8;

/*Data for the table `t_department` */

insert  into `t_department`(`did`,`dname`,`description`) values (1,'教学部','负责教学工作'),(2,'咨询部','负责咨询工作'),(3,'运营部','负责运营工作'),(4,'财务部','负责财务工作'),(5,'后勤部','负责后勤工作');

/*Table structure for table `t_employee` */

DROP TABLE IF EXISTS `t_employee`;

CREATE TABLE `t_employee` (
  `eid` int(11) NOT NULL AUTO_INCREMENT,
  `ename` varchar(20) NOT NULL,
  `tel` char(11) NOT NULL,
  `gender` char(1) DEFAULT '男',
  `salary` double DEFAULT NULL,
  `commission_pct` double DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `hiredate` date DEFAULT NULL,
  `job_id` int(11) DEFAULT NULL,
  `email` varchar(32) DEFAULT NULL,
  `mid` int(11) DEFAULT NULL,
  `address` varchar(150) DEFAULT NULL,
  `native_place` varchar(10) DEFAULT NULL,
  `did` int(11) DEFAULT NULL,
  PRIMARY KEY (`eid`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8;

/*Data for the table `t_employee` */

insert  into `t_employee`(`eid`,`ename`,`tel`,`gender`,`salary`,`commission_pct`,`birthday`,`hiredate`,`job_id`,`email`,`mid`,`address`,`native_place`,`did`) values (1,'孙红雷','13789098765','男',8000.46,0.4,'1980-10-08','2011-07-28',2,'shl@atguigu.com',7,'白庙村西街','浙江',1),(2,'何炅','13456732145','男',7000.67,0.32,'1984-08-03','2015-07-03',2,'hj@atguigu.com',7,'半截塔存','河北',1),(3,'邓超','18678973456','男',8000,NULL,'1985-04-09','2014-07-01',2,'dc@atguigu.com',7,'宏福苑','陕西',1),(4,'黄晓明','13609876789','男',9456,0.12,'1986-09-07','2015-08-08',11,'hxm@atguigu.com',22,'白庙村东街','黑龙江',3),(5,'陈赫','13409876545','男',8567,0.23,'1978-08-02','2015-01-01',2,'ch@atguigu.com',7,'回龙观','吉林',1),(6,'韩庚','18945678986','男',12000,0.24,'1985-04-03','2015-02-02',2,'hg@atguigu.com',7,'龙泽','内蒙古',1),(7,'贾乃亮','15490876789','男',15700,0.14,'1982-08-02','2015-03-03',1,'jnl@atguigu.com',7,'霍营','新疆',1),(8,'李晨','13587689098','男',9000,0.15,'1983-03-02','2015-01-06',3,'lc@atguigu.com',7,'东三旗','西藏',1),(9,'李易峰','13467676789','男',7897,NULL,'1984-09-01','2015-04-01',2,'lyf@atguigu.com',7,'西山旗','天津',1),(10,'鹿晗','13689876789','男',8789,NULL,'1989-04-02','2014-09-03',2,'lh@atguigu.com',7,'天通苑一区','江苏',1),(11,'黄渤','13787876565','男',15678,NULL,'1983-05-07','2014-04-04',2,'hb@atguigu.com',7,'立水桥','安徽',1),(12,'范冰冰','13576234554','女',8909,NULL,'1986-04-02','2014-02-08',2,'fbb@atguigu.com',7,'立城苑','贵州',1),(13,'李冰冰','13790909887','女',18760,NULL,'1987-04-09','2015-06-07',2,'lbb@atguigu.com',7,'王府温馨公寓','四川',1),(14,'谢娜','13234543245','女',18978,NULL,'1990-01-01','2015-09-05',4,'xn@atguigu.com',14,'园中园','成都',2),(15,'董洁','13876544333','女',8978,NULL,'1987-05-05','2015-08-04',5,'dj@atguigu.com',14,'小辛庄','云南',2),(16,'汤唯','18264578930','女',9878,NULL,'1988-03-06','2015-03-06',5,'tw@atguigu.com',14,'西二旗','宁夏',2),(17,'李诗诗','18567899098','女',9000,NULL,'1990-08-09','2013-06-09',5,'lss@atguigu.com',14,'清河','河南',2),(18,'舒淇','18654565634','女',16788,NULL,'1978-09-04','2013-04-05',6,'sq@atguigu.com',18,'名流花园','福建',4),(19,'周迅','13589893434','女',7876,NULL,'1988-06-13','2014-04-07',7,'sq@atguigu.com',18,'小汤山','广西',4),(20,'章子怡','15634238979','女',15099,NULL,'1989-12-11','2015-08-04',8,'zzy@atguigu.com',20,'望都家园','广东',5),(21,'白百何','18909876789','女',9787,NULL,'1989-09-04','2014-06-05',9,'bbh@atguigu.com',20,'西湖新村','海南',5),(22,'刘烨','18890980989','男',130990,0.1,'1990-11-09','2016-08-09',10,'ly@atguigu.com',22,'多彩公寓','北京',3),(23,'陈坤','18712345632','男',130990,0.2,'1990-02-04','2016-05-09',2,'ck@atguigu.com',2,'天通苑二区','上海',1),(24,'迪丽热巴','17290876543','女',10289,0.4,'1990-04-01','2017-02-06',7,'dlrb@atguigu.com',18,'北苑','北京',5),(25,'姚笛','18709675645','女',9087,NULL,'1989-08-01','2017-09-01',7,'yd@atguigu.com',18,'望京','北京',5);

/*Table structure for table `t_job` */

DROP TABLE IF EXISTS `t_job`;

CREATE TABLE `t_job` (
  `job_id` int(11) NOT NULL AUTO_INCREMENT,
  `job_name` varchar(20) DEFAULT NULL,
  `description` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`job_id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

/*Data for the table `t_job` */

insert  into `t_job`(`job_id`,`job_name`,`description`) values (1,'教学总监','负责教学管理工作'),(2,'讲师','负责教学工作'),(3,'助教','负责辅导工作'),(4,'咨询主管','负责咨询管理工作'),(5,'咨询师','负责咨询工作'),(6,'财务主管','负责财务工作'),(7,'出纳','负责出纳工作'),(8,'后勤主管','负责后勤管理工作'),(9,'网络管理员','负责网络管理'),(10,'运营主管','负责运营管理'),(11,'运营工程师','负责运营推广');

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!