MySQL数据库(2)

上期我们学习了对表的增删改,这一期我们来总结剩下的内容!

查询数据

MySQL 从数据表中查询数据的基本语句为 SELECT 语句。 SELECT 语句的基本格式是:
SELECT 字段列表 FROM 表1,表2... WHERE 表达式 GROUP BY 字段 HAVING 条件 ORDER BY 字段 LIMIT [<offset>,] <row count>]

单表查询

查询所有字段

SELECT * FROM 表名;
查询指定字段
SELECT 列名 FROM 表名;
查询多个字段
SELECT 字段名1,字段名2,…,字段名n FROM 表名;
SELECT empid,empname,empsex,empaddr,empbirth,empphone,deptid FROM emp;
查询的时候可以起别名
SELECT e.`empid` AS 员工编号 ,e.`empname` AS 员工名字 FROM emp e; 1
查询指定记录
数据库中包含大量的数据,根据特殊要求,可能只需要查询表中的指定数据,即对数据进行过滤。在 SELECT语句中,通过 WHERE 子句可以对数 据进行过滤,语法格式为:
SELECT 字段名1,字段名2,…,字段名n FROM 表名 WHERE 查询条件
IN 关键字的查询
N 操作符用来查询满足指定范围内的条件的记录,使用 IN 操作符,将所有检索条件用括号括起来,检索 条件之间用逗号分隔开,只要满足条件范围内的一个值即为匹配项。 在IN 关键字前面加上了 NOT 关键字,这使得查询的结果与前面一个的结果正好相反,
SELECT * FROM emp WHERE empid=1 OR empid=4 OR empid=8 OR empid=10; 
SELECT * FROM emp WHERE empid IN (1,4,8,10);
BETWEEN AND 的范围查询
BETWEEN AND 用来查询某个范围内的值,该操作符需要两个参数 , 即范围的开始值和结束值,如果字段 值满足指定的范围查询条件,则这些记录被返回。
BETWEEN AND 操作符前可以加关键字 NOT ,表示指定范围之外的 值,如果字段值不满足指定的范围内 的值,则这些记录被返回。
SELECT * FROM emp WHERE empid>=6 AND empid<=10; 
SELECT * FROM emp WHERE empid BETWEEN 6 AND 10;
LIKE 的字符匹配查询
通配符是一种在 SQL WHERE 条件子句中拥有特殊意思的字符。 SQL 语句中支持多种通配符,可以和 LIKE一起使用的通配符有 ‘%’ ‘_’
1) 百分号通配符 ‘%’ ,匹配任意长度的字符,甚至包括零字符
2) 下划线通配符 ‘_’ ,一次只能匹配任意一个字符
SELECT * FROM emp WHERE empname LIKE 'a%'; -- 以a开头 
SELECT * FROM emp WHERE empname LIKE '%a'; -- 以a结尾 
SELECT * FROM emp WHERE empname LIKE '%a%'; -- 包含a
查询空值
数据表创建的时候,设计者可以指定某列中是否包含空值( NULL )在 SELECT 语句中使用 IS NULL 子句, 可以查询某字段内容为空记录。与IS NULL 相反的是 NOT NULL ,该关键字查找字段不为空的记录。 空的查询 查询地址为空的员工信息
SELECT * FROM emp WHERE empaddr IS NULL; 
SELECT * FROM emp WHERE empaddr =''; 
SELECT * FROM emp WHERE empaddr IS NULL OR empaddr='';
非空查询
SELECT * FROM emp WHERE empaddr IS NOT NULL;
SELECT * FROM emp WHERE empaddr !=''; 
SELECT * FROM emp WHERE empaddr IS NOT NULL AND empaddr!='';
AND 的多条件查询
MySQL WHERE 子句中使用 AND 操作符限定只有满足所有查询条件的记录才会被返回。可以使用 AND 连接两个甚至多个查询条件,多个条件表达式之间用AND 分开
SELECT * FROM emp WHERE empsex='男' AND empaddr='西安锦业路';
OR 的多条件查询
AND 相反,在 WHERE 声明中使用 OR 操作符,表示只需要满足其中一个条件的记录即可返回。 OR 也可 以连接两个甚至多个查询条件,多个条件表达式之间用OR 分开
查询结果不重复
SELECT 语句中,可以使用 DISTINCT 关键字指示 MySQL 消除重复的记录值。
SELECT DISTINCT empid,empname,empsex FROM emp;
对查询结果排序
使用 ORDER BY 子句对指定的列数据进行排序。 desc: 倒叙 asc: 默认值,升序
1) 单列排序
SELECT * FROM emp ORDER BY empid DESC;
2) 多列排序
SELECT * FROM emp ORDER BY empid DESC ,deptid DESC;
聚合函数
有时候并不需要返回实际表中的数据,而只是对数据进行总结。 MySQL 提供一些查询功能,可以对获取 的数据进行分析和报告。这些函数 的功能有:计算数据表中记录行数的总数、计算某个字段列下数据的 总和, 以及计算表中某个字段下的最大值、最小值或者平均值。常用的聚合函数 MAX() MIN() 、 COUNT()、 SUM() AVG()
1 COUNT() 函数统计数据表中包含的记录行的总数,或者根据查询结果 返回列中包含的数据行数。其
使用方法有两种:
COUNT(*) 计算表中总的行数,不管某列是否有数值或者为空值。
COUNT( 字段名 ) 计算指定列下总的行数,计算时将忽略空值的行。
2 SUM() 是一个求总和的函数,返回指定列值的总和。 SUM() 函数在计算时,忽略列值为 NULL 的行。
3 AVG() 函数通过计算返回的行数和每一行数据的和,求得指定列数据的平均值。
4 MAX() 函数返回指定列中的最大值。
MAX() 函数除了用来找出最大的列值或日期值之外,还可以返回任意列 中的最大值,包括返回字符类型
的最大值。在对字符类型数据进行比较 时,按照字符的 ASCII 码值大小进行比较,从 a~z a ASCII 码最
小, z 的 最大。在比较时,先比较第一个字母,如果相等,继续比较下一个字符,一直到两个字符不相
等或者字符结束为止。例如, ‘b’ ‘t’ 比较时, ‘t’ 为最大值; “bcd” “bca” 比较时, “bcd” 为最大值。
5 MIN() 函数与 MAX() 函数类似,不仅适用于查找数值类型,也可应用于字符类型。
分组查询
GROUP BY 关键字通常和集合函数一起使用
SELECT deptid,COUNT(1) FROM emp GROUP BY deptid;
SELECT deptid,empsex,COUNT(1) FROM emp GROUP BY deptid,empsex;
分组后再排序
SELECT deptid,empsex,COUNT(1) FROM emp GROUP BY deptid,empsex ORDER BY deptid DESC,COUNT(1) DESC;
使用 HAVING 过滤分组
GROUP BY 可以和 HAVING 一起限定显示记录所需满足的条件,只有满 足条件的分组才会被显示
对于统计的每个部门的男女人数只要大于等于 3 的信息
SELECT deptid,empsex,COUNT(1) FROM emp GROUP BY deptid,empsex HAVING COUNT(1)>=3 ORDER BY COUNT(1) DESC,deptid DESC;
LIMIT
SELECT 返回所有匹配的行,有可能是表中所有的行,若仅仅需要返回 第一行或者前几行,可使用 LIMIT 关键字。

连接查询和子查询

连接查询

连接是关系数据库模型的主要特点。连接查询是关系数据库中最主要的查询,主要包括内连接、外连接 等。通过连接运算符可以实现多个表查询。 在关系数据库管理系统中,表建立时各数据之间的关系不必 确定,常把一个实体的所有信息存放在一个表中。当查询数据时,通过连接操作查询出存放在多个表中 的不同实体的信息。当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连 接查询。本节将介绍多表之间的内连接查询、外连接查询以及复合条件连接查询.
内连接查询
内连接( INNER JOIN )使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条 件相匹配的数据行,组合成新的记录,也就是说,在内连接查询中,只有满足条件的记录才能出现在结 果关系中。
SELECT * FROM dept d INNER JOIN emp e ON d.`deptid`=e.`deptid`;
外连接查询
左外连接
SELECT * FROM dept LEFT JOIN emp ON dept.`deptid`=emp.`deptid`
右外连接
SELECT dept.*,emp.* FROM emp RIGHT JOIN dept ON dept.`deptid`=emp.`deptid

子查询

子查询
-- 查询员工信息,并展示员工所在的部门名字 
SELECT emp.*, (SELECT deptname FROM dept WHERE dept.`deptid`=emp.`deptid`)deptname FROM emp WHERE emp.`deptid` IN (SELECT deptid FROM dept)
any,some
ANY SOME 关键字是同义词,表示满足其中任一条件,它们允许创建一个表达式对子查询的返回值列 表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。

SELECT num1 FROM tb1 WHERE num1> ANY(SELECT num2 FROM tb2);
 -- 或 
SELECT num1 FROM tb1 WHERE num1> SOME(SELECT num2 FROM tb2);
ANY 关键字接在一个比较操作符的后面,表示若与子查询返回的任何值比较为 TRUE ,则返回 TRUE
tbl1 中的 num1 列的值与之进行比较,只要大于 num2 列的任意一个数即为符合条件的结果。
All
ALL 关键字接在一个比较操作符的后面,表示与子查询返回的所有值比较为 TRUE ,则返回 TRUE
SELECT num1 FROM tb1 WHERE num1> ALL(SELECT num2 FROM tb2);
-- 找到工资比人事部工资高的信息 
SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE emp.deptid= (SELECT deptid FROM dept WHERE deptname='人事部')) ;
EXISTS
EXISTS 关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少 返回一行,那么EXISTS 的结果为 true ,此时外层查询语句将进行查询;如果子查询没有返回任何行,那 么EXISTS返回的结果是 false ,此时外层语句将不进行查询。
SELECT * FROM tb1 WHERE EXISTS (SELECT * FROM tb2 WHERE num2>10) AND num1>10;
如果 SELECT * FROM tb2 WHERE num2>10 有返回结果,则执行外部查询,此时会查询 tb1 表,并且要 过来num1 的值大于 10 的。如果将 num2 大于 100 的没有结果,则外部查询不执行。
NOT EXISTS EXISTS 相反
UNION
SELECT * FROM tb1 
 UNION ALL 
SELECT * FROM tb2;

SELECT * FROM tb1 
 UNION 
SELECT * FROM tb2;

 正则查询

正则表达式通常被用来检索或替换那些符合某个模式的文本内容,根据 指定的匹配模式匹配文本中符合 要求的特殊字符串。例如,从一个文本文件 中提取电话号码,查找一篇文章中重复的单词或者替换用户 输入的某些敏感词语等,这些地方都可以使用正则表达式。正则表达式强大而且灵活,可以应用于非常 复杂的查询。

-- 以字母a开头 
SELECT * FROM employees WHERE first_name REGEXP '^a'; 
-- $结尾 
SELECT * FROM employees WHERE first_name REGEXP 'a$'; 
-- b中间是任意字符c b与c之间得有一个任意字符, 
SELECT * FROM employees WHERE first_name REGEXP 'b.c'; 
-- +b必须得出现到n次 
SELECT * FROM employees WHERE first_name REGEXP 'b+c'; 
-- * 必须得0到n次 
SELECT * FROM employees WHERE first_name REGEXP 'b*c'; 
SELECT * FROM employees WHERE first_name REGEXP 'b{2,}c'; 
-- {2,5} 2到5次 
SELECT * FROM employees WHERE first_name REGEXP 'b{2,4}c';

后言:

我们MySql数据库的基本操作就整理完成。剩下还有系统函数等。下周将进行更新。

愿与君共勉!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值