DQL

MySQL单表查询:
目的:在MySQL管理软件中,可以通过SQL语句中的DQL语言来实现数据的
分类:
简单查询:如所有记录
通过条件查询:如某条记录
查询序列:如看看名次
限制查询记录数:如只看三条
使用集合函数查询:如看总价
分组查询:如查询结果分类
使用正则表达式查询:模糊查询

表结构:

表格.png

结构语句:
mysql> CREATE TABLE company.employee5(
id int primary key AUTO_INCREMENT not null,
name varchar(30) not null,
sex enum('male','female') default 'male' not null,
hire_date date not null,
post varchar(50) not null,
job_description varchar(100),
salary double(15,2) not null,
office int,
dep_id int
);
插入数据:
数据插入图片

一、简单查询:
查看所以信息:SELECT * FROM employee5;
查看员工姓名,工资,部门:SELECT name, salary, dep_id FROM employee5;
看看有哪些部门:SELECT post FROM employee5;
(存在重复字段)
如何解决:SELECT DISTINCT post FROM employee5;
(SELECT DISTINCT post FROM employee5;
DISTINCT 有区别的)
看看年薪:
SELECT name, salary, salary14 FROM employee5;
美化输出:
SELECT name, salary, salary
14 AS Annual_salary FROM employee5;
(as 别名)
SELECT name, salary, salary14 Annual_salary FROM employee5;
(as可以省略)
美化输出2:
CONCAT( ) 函数用于连接字符串,引号标识拼接的符号
select name,salary,salary
14 from employee5;
select concat(name,salary,salary14) from employee5;
select name,'annual salary:',salary
14 from employee5;
select concat(name,'annual salary:',salary14) from employee5;
SELECT CONCAT(name, ' annual salary: ', salary
14) AS Annual_salary FROM employee5;
二、单条件查询where
查询hr部门的员工姓名:
SELECT name,post
FROM employee5
WHERE post='hr';
多条件查询AND/OR:查询hr部门的员工,并且工资大于1000
SELECT name,salary
FROM employee5
WHERE post='hr' AND salary>10000;
查询所有部门的员工,并且工资是4000或者5000的员工:
SELECT name, salary FROM employee5
WHERE salary=4000 OR salary=5000
关键字BETWEEN AND 在什么之间:查一查薪资在5000到15000:
SELECT name,salary FROM employee5
WHERE salary BETWEEN 5000 AND 15000;
使用NOT查一查不再5000到15000之间的:
SELECT name,salary FROM employee5
WHERE salary NOT BETWEEN 5000 AND 15000;
关键字IN集合查询:工资可能是4000,也可能是5000,还有可能是9000,怎么查
OR可以组合多条件,效率如何?
SELECT name, salary FROM employee5
WHERE salary=4000 OR salary=5000 OR salary=6000 OR salary=9000 ;
优化:
是什么什么
SELECT name, salary FROM employee5
WHERE salary IN (4000,5000,6000,9000) ;
不是什么什么
SELECT name, salary FROM employee
WHERE salary NOT IN (4000,5000,6000,9000) ;
关键字IS NULL:没有岗位描述的

SELECT name,job_description FROM employee5
WHERE job_description IS NULL;
非空
SELECT name,job_description FROM employee5
WHERE job_description IS NOT NULL;
错误示范,空格''
SELECT name,job_description FROM employee5
WHERE job_description='';
关键字LIKE模糊查询:
SELECT * FROM employee5
WHERE name LIKE 'al%';
(通配符’%’代表多个任意字符,注意不是shell的"*"星号。mysql使用"%")
SELECT * FROM employee5
WHERE name LIKE 'al___';
(注意不是shell的“?”问号。mysql使用""下划线,通配符’’代表1个任意字符)

三、查询排序order by
按单列排序:
工资从低到高,怎么查(升序):
SELECT * FROM employee5 ORDER BY salary;
SELECT name, salary FROM employee5 ORDER BY salary ASC;
(默认就是升序,所以ASC可以省略)
工资从高到低,怎么查(将序):
SELECT name, salary FROM employee5 ORDER BY salary DESC;
按多列排序:在满足第一列条件下,再进行第二列的排序。
SELECT * FROM employee5
ORDER BY hire_date DESC,
salary DESC;
先按最近的入职时间,再按低薪水排序

image.png

同一个职位,谁的薪资高。
image.png

四、限制查询的记录数limit
SELECT * FROM employee5 ORDER BY salary DESC
LIMIT 5; (默认初始值为0)
SELECT * FROM employee5 ORDER BY salary DESC
LIMIT 0,5; (逗号步长)
SELECT * FROM employee5 ORDER BY salary DESC
LIMIT 3,5;(从第三条开始,共显示5条)
五、使用集合函数查询MAX()
SELECT COUNT() FROM employee5;(共多少员工,count()计数)
SELECT COUNT(
) FROM employee5 WHERE dep_id=101;(101部门多少人)
SELECT MAX(salary) FROM employee5;(谁的工资最高)
SELECT MIN(salary) FROM employee5;(谁的工资最低)
SELECT AVG(salary) FROM employee5;(平均薪资是多少)
SELECT SUM(salary) FROM employee5;(全公司薪资总和是多少)
SELECT SUM(salary) FROM employee5 WHERE dep_id=101;(101部门薪资总和多少)
select group_concat(name) from employee5 ;(将员工名称集中起来)
(注意:
concat显示的是独立字段
image.png

group_concat显示结果是一整条记录
image.png


六、分组查询GROUP BY
SELECT dep_id,GROUP_CONCAT(name) FROM employee5 GROUP BY dep_id;
(每个部门的人员名单)
SELECT dep_id FROM employee5 GROUP BY dep_id;
(请思考group by 的效果)
select dep_id,SUM(salary) from employee5 group by dep_id;
(每个部门的工资总和)
image.png

select dep_id,AVG(salary) from employee5 group by dep_id;
(每个部门的工资平均值)
image.png

七、使用正则表达式查询REGEXP
SELECT * FROM employee5 WHERE name REGEXP '^ali';
image.png

SELECT * FROM employee5 WHERE name REGEXP 'yun$';
(查询yun结尾的记录)
SELECT * FROM employee5 WHERE name REGEXP 'm{2}';
(查询m出现过2次的记录)
总结:对字符串匹配的方式
image.png

SELECT 查询操作
MySQL多表查询:
前言:
如何根据部门总表中,查询分支表信息


图示3

一、分类

  1. 多表连接查询,复合条件连接查询
  2. 子查询 ,根据查询结果查询。
    准备员工信息表
    create table info(
    name char(50),
    age int,
    dep_num int,
    level_num int);

desc info;

insert into info values
('zhangsan',23,101,1),
('lisi',25,102,2),
('wangwu',30,102,3),
('zhaosi',30,103,4),
('sunba',35,NULL,NULL);

select * from info;
准备部门信息表:

create table department(
dep_num int,
dep_name varchar(50),
dep_des varchar(100));

insert into department values
(101,'hr','recruit,training'),
(102,'tec','system,network,service'),
(103,'exp','C++,python,php'),
(104,'admin','administrator');

desc department;

select * from department;

二、多表的连接查询
交叉连接: 生成笛卡尔积,它不使用任何匹配条件
特点:全部组合(A表5行,B表7行,最后5*7=35行)
语法:生成笛卡尔积,它不使用任何匹配条件
touch {a..c}{1..3}
示范:select info.name,info.age,info.dep_num,department.dep_name from info,department;
mysql> select info.name,info.age,info.dep_num,department.dep_name from info,department;
+----------+------+---------+----------+
| name | age | dep_num | dep_name |
+----------+------+---------+----------+
| zhangsan | 23 | 101 | hr |
| zhangsan | 23 | 101 | tec |
| zhangsan | 23 | 101 | exp |
| zhangsan | 23 | 101 | admin |
| lisi | 25 | 102 | hr |
| lisi | 25 | 102 | tec |
| lisi | 25 | 102 | exp |
| lisi | 25 | 102 | admin |
| wangwu | 30 | 102 | hr |
| wangwu | 30 | 102 | tec |
| wangwu | 30 | 102 | exp |
| wangwu | 30 | 102 | admin |
| zhaosi | 30 | 103 | hr |
| zhaosi | 30 | 103 | tec |
| zhaosi | 30 | 103 | exp |
| zhaosi | 30 | 103 | admin |
| qianqi | 30 | 104 | hr |
| qianqi | 30 | 104 | tec |
| qianqi | 30 | 104 | exp |
| qianqi | 30 | 104 | admin |
| sunba | 35 | NULL | hr |
| sunba | 35 | NULL | tec |
| sunba | 35 | NULL | exp |
| sunba | 35 | NULL | admin |
+----------+------+---------+----------+
24 rows in set (0.00 sec)

内连接:只连接匹配的行
特点:两列相同时,才会显示
需求:显示员工的部门信息
语法:SELECT 字段列表
FROM 表1 , 表2
WHERE 表1.字段 = 表2.字段;
示例:
select info.name,info.age,info.dep_num,department.dep_name from info,department where info.dep_num = department.dep_num;


图示4

请思考:孙八去哪了。
外链接:
特点:两列相同时显示,并,已左/右表为主。
语法:A表 left join B表 on 条件是
外连接(左连接 left join on): 会显示左边表内所有的值,不论在右边表内匹不匹配
需求:找出所有员工及所属的部门,包括没有部门的员工
查看所有员工的部门信息。
示例:
select info.name,info.age,info.dep_num,department.dep_name from info left join department on info.dep_num = department.dep_num;


图示5

请思考:是否显示了所有部门。
如果,希望显示所有部门中的员工,该如何查询?

外连接(右连接right join on): 会显示右边表内所有的值,不论在左边表内匹不匹配
需求:显示所有的部门的员工信息。
示范:
select info.name,info.age,info.dep_num,department.dep_name from info right join department on info.dep_num = department.dep_num;


图示6

需求2:找出公司所有部门中年龄大于25岁的员工
示例:
select info.name,info.age,info.dep_num,department.dep_name
from
info right join department
on
info.dep_num = department.dep_num

AND age > 25;


图示7

需求3:找出公司所有部门中的员工,对他们的年龄排序
示例:
select info.name,info.age,info.dep_num,department.dep_name
from
info right join department
on
info.dep_num = department.dep_num
ORDER BY
age
ASC;


同时8

三、子查询
简介:

子查询是指:父查询 需要 依赖 子查询的结果。
子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
还可以包含比较运算符:= 、 !=、> 、<等

  1. 带IN关键字的子查询(范围)
    需求:查询员工年龄大于等于35岁的部门(查询老龄化的部门)
    示例:
    select dep_num,dep_name
    from
    department
    where
    dep_num
    in
    (select distinct dep_num from info where age >=35);


    图示9
  2. 带EXISTS关键字的子查询(返回值)
    简介:
    EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值。
    Ture或False,当返回Ture时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询
    需求:如果部门101存在(返回为真),查询所有员工信息。
    示例:
    true:无结果
    select * from info
    where
    exists
    (select * from department where dep_num=102);
    false:无结果
    select * from info where exists (select * from department where dep_num=105);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容