sql查询

1.基础查询

#单行注释        /*

多行注释         */

--单行注释

#基础查询

select:查看、选择、显示

语法:

select要显示的东西

类似于System.out.println(要打印的东西);

要显示的东西:

①常量

②表达式

③函数

④字段,但要显示字段必须添加from 表名

语法:

select字段 from 表;

#1.显示常量

SELECT 100;

SELECT 'john';

#2.显示表达式

SELECT 98*23;

#3.显示函数(方法)

SELECT LENGTH('john');

SELECT VERSION();

#4.显示表中的字段

SELECT last_name FROM employees;

#5.显示表中的多个字段

SELECT `last_name`,`phone_number`,`first_name`,`salary`,`commission_pct`,`manager_id`

FROM `employees`;

#6.显示表中所有字段

SELECT * FROM employees;

#7.起别名

#方式一:

SELECT last_name AS姓,first_name AS 名 FROM employees;

#方式二:

SELECT last_name姓,first_name  名 FROM employees;

#示例:别名:out name

SELECT last_name  "out name" FROM employees;

#8.如何去重

#查询employees表中的所有部门编号

-- distinct

SELECT DISTINCT department_id FROM employees;

2.条件查询

#条件查询

概念:根据指定的条件过滤出数据

语法:

select字段 from 表名

where条件;

分类:

1、按条件表达式查询

条件运算符:

>、< 、>=、 <=、 =、 !=、 <>、 ,<=>安全等于,用于判断是否为null

2、按逻辑表达式查询

逻辑运算符:

and、&&两个条件都为true,结果为true,反之为false

or、||两个条件只要有一个为true,结果为true,反之为false

not、!如果连接的条件本身为false,结果为true,反之为false

//优先级

not > and > or

3、模糊查询:

#一、按条件表达式查询

#案例1:查询月薪>5000的员工信息

SELECT * FROM employees WHERE salary>5000;

#案例2:查询月薪=12000的员工信息

SELECT * FROM employees WHERE salary=12000;

#案例  查询月薪不等于12000的员工信息

SELECT * FROM employees WHERE salary<>12000;

#案例3:查询没有奖金的员工名

SELECT last_name,commission_pct FROM employees

 WHERE commission_pct<=>NULL;

二、按逻辑表达式查询

#案例1:查询月薪在5000到12000的员工工资和姓名

SELECT salary,last_name FROM employees WHERE salary>= 5000 AND salary<=12000;

#案例2:查询月薪不在5000到12000的员工工资和姓名

SELECT salary,last_name FROM employees WHERE NOT(salary>= 5000 AND salary<=12000);

#案例3:查询部门编号=90 或 月薪>10000并且月薪<15000的员工信息

SELECT * FROM employees WHERE department_id = 90 OR (salary>10000 AND salary<15000);

-- ceil rand

SELECT CEIL(RAND()*30);

3.模糊查询

#模糊查询

1.like

一般搭配着通配符使用,用作字符型的判断

通配符:

% 任意多个字符

_任意单个字符1  

2.between and

特点:在...之间

①等价于使用  字段>=值1 and字段<=值2

②两个临界值是包含的[1,10]  

③两个临界值不能颠倒顺序

3.in

特点:判断某个字段的值是否在某个列表内

in(值1,值2,...)

等价于or 

4.is null/is not null

#1.like

#案例1:查询姓名中包含字符 e的员工信息

SELECT * FROM employees

WHERE last_name LIKE '%e%';

#案例2:查询姓名中第二个字符为e,第四个字符为a的员工信息

SELECT * FROM employees

WHERE last_name LIKE '_e_a%';

#案例3:查询姓名中第三个字符为_的员工信息

SELECT * FROM employees

WHERE last_name LIKE '__\_%';

//斜线                         \  ->   window  斜线

/  ->    Linux斜线

//反斜线 

#ESCAPE自定义 转移符

SELECT * FROM employees

WHERE last_name LIKE '__$_%' ESCAPE '$';

// ESCAPE '$';这句话是 让$ 拥有转义字符的形式和功能

UPDATE employees SET last_name='' '' WHERE employee_id=100;

#2.between and

#案例1:显示出表employees部门编号在80-100之间 的姓名、职位

SELECT last_name,job_id,department_id

FROM employees

WHERE department_id BETWEEN 80 AND 100;

WHERE department_id BETWEEN 100 AND 80;  ×

#等价于

SELECT last_name,job_id,department_id

FROM employees

WHERE department_id<=100 AND department_id>=80;

#3.in

#案例1:显示出表employees的manager_id 是 100,101,110 的员工姓名、职位

SELECT last_name,job_id,manager_id

FROM employees

WHERE manager_id IN(100,101,110);

#等价于

SELECT last_name,job_id,manager_id

FROM employees

WHERE manager_id=100 OR manager_id=101 OR manager_id = 110;

#案例2:查询 job_id 为AD_VP或ST_MAN或SA_MAN

SELECT last_name,job_id,manager_id

FROM employees

WHERE job_id IN('AD_VP','S_\_MAN');# ×

#4.is null / is not null

#案例1:查询没有奖金的员工

SELECT * FROM employees

WHERE commission_pct IS NULL;

#案例2:查询有奖金的员工

SELECT * FROM employees

WHERE commission_pct  IS NOT  NULL;

SELECT * FROM employees

WHERE NOT(commission_pct  IS   NULL);

SELECT * FROM employees WHERE last_name IS NULL;

4.排序查询

#排序查询

语法:

select字段|表达式|常量

from表

【where 条件】

order by排序的字段;

1.升序 asc

降序desc

默认是 升序asc

2.可以按表达式、函数、别名、多个字段进行排序

3.一般来讲order by放到查询的语句的最后,在不使用分页的情况下

#一、按单个字段进行排序

SELECT * FROM employees ORDER BY salary ;

SELECT * FROM employees ORDER BY salary DESC;

#二、按多个字段进行排序

SELECT * FROM employees

ORDER BY salary DESC,employee_id ASC;

#三、按表达式排序

#案例:按年薪降序

SELECT *,salary*12*(1+IFNULL(commission_pct,0))年薪

FROM employees

ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;

#四、按别名排序

#案例:按年薪降序

SELECT *,salary*12*(1+IFNULL(commission_pct,0))年薪

FROM employees

ORDER BY 年薪 DESC;

#五、按函数排序

#案例:按姓名中的字节长度大小降序

SELECT last_name,LENGTH(last_name)

FROM employees

ORDER BY LENGTH(last_name) DESC;

分组查询

#分组查询

和分组函数一起搭配使用的查询,我们叫做分组查询,换句话说,分组查询一般都会用到分组函数

#引入:查询各部门的最高工资

SELECT MAX(salary) FROM employees WHERE department_id IN(20,90,30);

SELECT MAX(salary) FROM employees GRO UP BY  department_id;

语法:

select分组函数 别名,分组后的字段

from表

【where 分组前筛选】

group by分组的字段

【having 分组后筛选】

【order by 排序的字段】

从上到下依次顺序,不能颠倒顺序

分组查询的特点:

1、按多个字段分组,字段间用逗号隔开,没有顺序要求

2、可以和分组函数一起查询的字段,只能是分组后的字段,不能是任意字段

3、分组筛选

    针对的表     位置       使用的关键字

分组前筛选 原始表 group by的前面    where

分组后筛选 分组后的结果集 group by的后面     having

顺序:where——group by——having

4、having和group by支持别名

#一、普通的分组查询

#01案例:查询各部门的最高工资和部门号

SELECT MAX(salary),department_id FROM employees GROUP BY department_id;

#二、按多个字段分组

#案例:查询每个工种、每个部门的平均工资

SELECT AVG(salary),job_id,department_id

FROM employees

GROUP BY job_id,department_id;

#三、分组查询+筛选having

筛选条件分两类:

分组前筛选:筛选的条件针对的是原始表

分组后筛选:筛选的条件针对的是分组后的结果集

针对的表 位置 使用的关键字

分组前筛选 原始表 group by的前面 where

分组后筛选 分组后的结果集 group by的后面  having

where——group by——having

#案例1:查询奖金的,每个部门的最高奖金率

SELECT MAX(commission_pct)最高奖金率,department_id

FROM employees

WHERE commission_pct IS NOT NULL

GROUP BY department_id;

#案例2:查询员工姓名中包含字符a,每个部门的最低工资高于3000的部门编号

SELECT department_id,MIN(salary)最低工资

FROM employees

WHERE last_name LIKE '%a%'  

GROUP BY department_id

HAVING MIN(salary)>3000;

#案例3:查询电话以“515”开头的,工种号包含字符'T'的,每个工种的平均工资>5000的工种号和平均工资

SELECT job_id,AVG(salary)

FROM employees

WHERE phone_number LIKE '515%' AND job_id LIKE '%T%'

GROUP BY job_id

HAVING AVG(salary)>5000;

#案例4:查询每个地区的部门个数,求个数大于2的部门个数和地区号

SELECT COUNT(*)个数,location_id

FROM departments

GROUP BY location_id

HAVING COUNT(*)>2;

#四、having子句支持别名

#案例:查询每个地区的部门个数,求个数大于2的部门个数和地区号

SELECT COUNT(*)个数,location_id

FROM departments

GROUP BY location_id

HAVING个数>2;

#五、排序 order by 支持别名

#案例:查询员工姓名中包含字符a,每个部门的最低工资高于3000的部门编号

,按照最低工资降序排序

SELECT department_id,MIN(salary)最低工资

FROM employees

WHERE last_name LIKE '%a%'  

GROUP BY department_id

HAVING MIN(salary)>3000

ORDER BY最低工资 DESC;

多表连接(等值连接)

#如果想查询女神的名称,并且同事查询出对用男神的名称怎么办??

SELECT * FROM beauty;

SELECT * FROM boys;

SELECT NAME,boyname FROM beauty,boys

WHERE boyfriend_id=boys.id;

#连接查询

概念:查询的字段来自于多个表

语法:

select字段1,字段2

from表1,表2

【where 连接条件】

笛卡尔乘积:

产生原因:没有加连接条件,导致结果为 表1 的行数*表2 的行数

解决方法:添加上有效的`myemployees`

分类:

一、传统模式的多表连接

等值连接(where)——非等值连接

二、sql99推出的标准,使用join关键字实现连接

内连接——外连接

三、自连接

#一、传统模式的多表连接

#也叫等值连接

特点有

①表的顺序没有要求

②n表连接,至少需要n-1个连接条件

③一般需要为表起别名,这样可以提高语句简洁度,并且防止字段有歧义

④可以添加分组、排序、筛选,一起混合使用

#①案例1:查询员工名、部门名

SELECT `last_name`,`department_name`

FROM `employees`,`departments`

WHERE `employees`.`department_id`=`departments`.`department_id`;

#②为表起别名

一般需要为表起别名,好处:

a、提高语句简洁度

b、防止字段有歧义,比如说 两张表中都有name字段,使用b.name 或者a.name 这样表示就没有歧义

c、提高效率

如果已经为表起别名,则使用字段时,只能用别名限定而不能用表名限定

SELECT e.`last_name`,d.`department_name`

FROM `employees`  e,`departments` d

WHERE e.`department_id`=d.`department_id`;

#③添加筛选条件

#案例:查询 工资>5000的工种名和员工名、工资

SELECT job_title,last_name,salary

FROM employees e,jobs j

WHERE e.`job_id`=j.`job_id`

AND salary>5000;

#④添加分组和筛选

#01案例:查询每个部门的员工个数和部门名, 每个部门人数大于3

SELECT COUNT(*)个数,department_name

FROM employees e,departments d

WHERE e.`department_id`=d.`department_id`

GROUP BY e.`department_id`

HAVING个数>3;

#⑤排序

#01案例:查询每个部门的员工个数和部门名, 每个部门人数大于3,按照人数倒序排序

SELECT COUNT(*)个数,department_name

FROM employees e,departments d

WHERE e.`department_id`=d.`department_id`

GROUP BY e.`department_id`

HAVING个数>5

ORDER BY个数 DESC;

#⑥ 三表连接

#案例:查询员工名、部门名和所在城市

SELECT last_name,department_name,city

FROM employees e,departments d,locations l

WHERE e.`department_id`=d.`department_id`

AND d.`location_id`=l.`location_id`;

非等值查询

多表连接之—非等值连接

#2.非等值连接

#案例1:查询员工的工资以及对应的工资级别

SELECT salary,grade_level

FROM employees e,job_grades g

WHERE e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`;

#案例2:查询名字中第三个字符为a,第五个字符为e的员工的工资以及对应的工资级别

SELECT salary,grade_level

FROM employees e,job_grades g

WHERE e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`

AND e.`last_name` LIKE '__a_e%';

SELECT * FROM employees;

SELECT * FROM job_grades;

CREATE TABLE job_grades

(grade_level VARCHAR(3),

 lowest_sal  INT,

 highest_sal INT);

INSERT INTO job_grades

VALUES ('A', 1000, 2999);

INSERT INTO job_grades

VALUES ('B', 3000, 5999);

INSERT INTO job_grades

VALUES('C', 6000, 9999);

INSERT INTO job_grades

VALUES('D', 10000, 14999);

INSERT INTO job_grades

VALUES('E', 15000, 24999);

INSERT INTO job_grades

VALUES('F', 25000, 40000);

内连接

#join连接  

join关键字属于sql99语法的标准,1999推出了sql的一种新标准,使用到的关键字,叫做join

join连接,属于sql99语法

分类:

内连接:[inner] join on

外连接:

左外连接left 【outer】 join on

右外连接right【outer】 join on

全外连接full 【outer】 join on   ,mysql中不支持!!! sqlserver 和oracle 没有问题

#1.内连接

语法:

select字段1,字段2,...

from表1

inner join表2 on 连接条件;

特点:

① 效果和等值连接是一样的!

② 表的顺序可以调换

③ 可以为表起别名

④ 可以添加筛选、分组、排序

⑤ 将筛选条件和连接条件实现了分类,提高代码的可读性

⑥n表连接,至少需要n-1 个连接条件

大家好,刚刚我们学习了内连接的概念,现在我们来做几个内连接的案列,来进行学习内连接

#案例1 :查询员工名、部门名

SELECT last_name,department_name

FROM departments d

 JOIN employees e ON e.`department_id`=d.`department_id`;

#案例2:查询有奖金的员工名、部门名

SELECT last_name,department_name

FROM departments d

 JOIN employees e ON e.`department_id`=d.`department_id`

 WHERE commission_pct IS NOT NULL;

#案例3:查询城市名、员工名和部门名

SELECT city,last_name,department_name

FROM employees e

INNER JOIN departments d ON e.`department_id`=d.`department_id`

INNER JOIN locations l ON l.`location_id`=d.`location_id`;

外链接

#外连接

语法:

select字段1,字段2,...

from表1

left|right【outer】 join 表2

on连接条件

特点:

①查询结果:内连接的结果+主表中有但从表没有的记录(从表的字段用null填充)

②左连接,左边的就是主表; 右连接,右边的就是主表

③一般来讲要查询的字段来自于哪个表,那哪个表就是主表

④一般用于查询主表中有但从表中没有的记录

#案例1:查询没有男朋友的女神名称 (girls 数据库)

USE girls;

SELECT `name`,boyName

FROM beauty b

LEFT OUTER JOIN boys bo

ON b.`boyfriend_id`=bo.`id`

WHERE bo.id IS NULL;

#案例2:查询哪个城市没有部门  (myemployees数据库)

SELECT city,department_name

FROM locations l

LEFT OUTER JOIN departments d ON l.`location_id`=d.`location_id`

WHERE d.`department_id` IS NULL;

#案例3:查询哪个工种没有员工  (myemployees数据库)

SELECT j.job_id,e.`employee_id`

FROM employees e

RIGHT OUTER JOIN jobs j ON e.`job_id`=j.`job_id`

WHERE  e.`job_id` IS NULL;

全外连接和自连接

SELECT j.job_id,e.`employee_id`

FROM employees e

FULL OUTER JOIN jobs j ON e.`job_id`=j.`job_id`

#三、自连接 自己连接自己

#案例:查询员工名和上级领导的名字

SELECT e.last_name,m.last_name

FROM employees e

INNER JOIN employees m ON e.`manager_id`=m.employee_id;

SELECT e.last_name,m.last_name

FROM employees e,employees m WHERE e.`manager_id`=m.employee_id;

你可能感兴趣的:(sql查询)