一、简单的查询
我们先看一些简单的查询,数据库导入脚本将在文末贴出:
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 */;
来源:oschina
链接:https://my.oschina.net/u/3730932/blog/3221613