查询 数据指从数据库 获取所需要的数据。 查询 数据是数据库操作 最常用,也是最重要的操作。用户可以根据自己对数据的需求,使用不同的 查询 方式。通过不同的 查询 方式,可以获得不同的数据。My SQL 是使用SELECT语句来 查询 数据的。在这一章 将讲解的内容包括。 1、 查询 语句的基本语法 2、在单表上 查询 数据 3、使用聚合函数 查询 数据 4、多表上联合 查询 5、子 查询 6、合并 查询 结果 7、为表和 字段 取别名 8、使用正则表达式 查询 什么是 查询 ? 怎么查的? 数据的准备如下: [ sql ] view plain copy create table STUDENT( STU_ID int primary KEY, STU_NAME char(10) not null, STU_AGE smallint unsigned not null, STU_SEX char(2) not null insert into STUDENT values(2001,'小王',13,'男'); insert into STUDENT values(2002,'明明',12,'男'); insert into STUDENT values(2003,'红红',14,'女'); insert into STUDENT values(2004,'小花',13,'女'); insert into STUDENT values(2005,'天儿',15,'男'); insert into STUDENT values(2006,'阿猎',13,'女'); insert into STUDENT values(2007,'阿猫',16,'男'); insert into STUDENT values(2008,'阿狗',17,'男'); insert into STUDENT values(2009,'黑子',14,'男'); insert into STUDENT values(2010,'小玉',13,'女'); insert into STUDENT values(2011,'头头',13,'女'); insert into STUDENT values(2012,'冰冰',14,'女'); insert into STUDENT values(2013,'美丽',13,'女'); insert into STUDENT values(2014,'神乐',12,'男'); insert into STUDENT values(2015,'天五',13,'男'); insert into STUDENT values(2016,'小三',11,'男'); insert into STUDENT values(2017,'阿张',13,'男'); insert into STUDENT values(2018,'阿杰',13,'男'); insert into STUDENT values(2019,'阿宝',13,'女'); insert into STUDENT values(2020,'大王',14,'男'); 然后这是学生成绩表,其 定义了外键约束 [ sql ] view plain copy create table GRADE( STU_ID INT NOT NULL, STU_SCORE INT, foreign key(STU_ID) references STUDENT(STU_ID) insert into GRADE values(2001,90); insert into GRADE values(2002,89); insert into GRADE values(2003,67); insert into GRADE values(2004,78); insert into GRADE values(2005,89); insert into GRADE values(2006,78); insert into GRADE values(2007,99); insert into GRADE values(2008,87); insert into GRADE values(2009,70); insert into GRADE values(2010,71); insert into GRADE values(2011,56); insert into GRADE values(2012,85); insert into GRADE values(2013,65); insert into GRADE values(2014,66); insert into GRADE values(2015,77); insert into GRADE values(2016,79); insert into GRADE values(2017,82); insert into GRADE values(2018,88); insert into GRADE values(2019,NULL); insert into GRADE values(2020,NULL); 一、 查询 语句的基本语法 查询 数据是指从数据库 的数据表或视图 获取所需要的数据,在my sql ,可以使用SELECT语句来 查询 数据。根据 查询 条件的不同,数据库系统会找到不同的数据。 SELECT语句的基本语法格式如下: [ sql ] view plain copy SELECT 属性列表 FROM 表名或视图列表 [WHERE 条件表达式1] [GROUP BY 属性名1 [HAVING 条件表达式2]] [ORDER BY 属性名2 [ASC|DESC]] 属性列表: 表示 需要 查询 字段 名。 表名或视图列表: 表示 即将进行数据 查询 的数据表或者视图,表或视图可以有多个。 条件表达式1:设置 查询 的条件。 属性名1: 表示 按该 字段 的数据进行分组。 条件表达式2: 表示 满足该表达式的数据才能输出。 属性2: 表示 按该 字段 的数据进行排序,排序方式由ASC或DESC参数指定。 ASC: 表示 按升序的顺序进行排序。即 表示 值按照从小到大的顺序排列。这是默认参数。 DESC: 表示 按降序的顺序进行排序。即 表示 值按照从大到小的顺序排列。 如果有WHERE子句,就按照“条件表达式1”指定的条件进行 查询 ;如果没有WHERE子句,就 查询 所有记录。 如果有GROUP BY子句,就按照“属性名1”指定的 字段 进行分组;如果GROUP BY子句后面带着HAVING关键字,那么只有满足“条件表达式2” 指定的条件的记录才能够输出。GROUP BY子句通常和COUNT()、SUM()等聚合函数一起使用。 如果有ORDER BY子句,就按照“属性名2”指定的 字段 进行排序。排序方式由ASC或DESC参数指定。默认的排序方式为ASC。 二、在单表上 查询 数据 2.1、 查询 所有 字段 [ sql ] view plain copy select * from STUDENT; 2.2、按条件 查询 (1) 比较运算符 > , < ,= , != (),>= , 13; in(v1,v2..vn) ,符合v1,v2,,,vn才能被查出 IN关键字可以判断某个 字段 的值是否在指定的集合 。如果 字段 的值在集合 ,则满足 查询 条件,该纪录将被 查询 出来。如果不在集合 ,则不满足 查询 条件。其语法规则如下:[ NOT ] IN ( 元素1, 元素2, …, 元素n ) [ sql ] view plain copy select * from STUDENT where STU_AGE in(11,12); between v1 and v2 在v1至v2之间(包含v1,v2) BETWEEN AND关键字可以判读某个 字段 的值是否在指定的范围内。如果 字段 的值在指定范围内,则满足 查询 条件,该纪录将被 查询 出来。如果不在指定范围内,则不满足 查询 条件。其语法规则如下: [ NOT ] BETWEEN 取值1 AND 取值2 [ sql ] view plain copy select * from STUDENT where STU_AGE between 13 and 15; not ( ! ) 逻辑非 [ sql ] view plain copy select * from STUDENT where STU_AGE NOT IN(13,14,16); or ( || ) 逻辑或 OR关键字也可以用来联合多个条件进行 查询 ,但是与AND关键字不同。使用OR关键字时,只要满足这几个 查询 条件的其 一个 ,这样的记录将会被 查询 出来。如果不满足这些 查询 条件 的任何 一个 ,这样的记录将被排除掉。OR关键字的语法规则如下: 条件表达式1 OR 条件表达式2 [ …OR 条件表达式n ] 其 ,OR可以用来连接两个条件表达式。而且,可以同时使用多个OR关键字,这样可以连接更多的条件表达式。 [ sql ] view plain copy select * from STUDENT where STU_ID2015; and ( && ) 逻辑与 AND关键字可以用来联合多个条件进行 查询 。使用AND关键字时,只有同时满足所有 查询 条件的记录会被 查询 出来。如果不满足这些 查询 条件的其 一个 ,这样的记录将被排除掉。AND关键字的语法规则如下: 条件表达式1 AND 条件表达式2 [ … AND 条件表达式n ] 其 ,AND可以连接两个条件表达式。而且,可以同时使用多个AND关键字,这样可以连接更多的条件表达式。 (3)模糊 查询 like 像 LIKE关键字可以匹配字符串是否相等。如果 字段 的值与指定的字符串相匹配,则满足 查询 条件,该纪录将被 查询 出来。如果与指定的字符串不匹配,则不满足 查询 条件。其语法规则如下:[ NOT ] LIKE '字符串' “NOT”可选参数,加上 NOT 表示 与指定的字符串不匹配时满足条件;“字符串” 表示 指定用来匹配的字符串,该字符串必须加单引号或双引号。 % 任意字符 [ sql ] view plain copy select * from STUDENT where STU_NAME LIKE '%王'; 表示 匹配任何以王结尾的 [ sql ] view plain copy select * from STUDENT where STU_NAME LIKE '阿%'; 表示 匹配任何以阿开头的 _ 单个字符 比如说插入 [ sql ] view plain copy insert into STUDENT values(2021,'天下无镜',14,'男'); [ sql ] view plain copy select * from STUDENT where STU_NAME LIKE '_下_'; 查询 的结果为空 但是如果下后面加两个_符号 [ sql ] view plain copy select * from STUDENT where STU_NAME LIKE '_下__'; 查询 结果不为空 “字符串”参数的值可以是 一个 完整的字符串,也可以是包含百分号(%)或者下划线(_)的通配字符。二者有很大区别 “%”可以代表任意长度的字符串,长度可以为0; “_”只能 表示 单个字符。 如果要匹配姓张且名字只有两个字的人的记录,“张”字后面必须要有两个“_”符号。因为 一个 汉字是两个字符,而 一个 “_”符号只能代表 一个 字符。 (4)空值 查询 IS NULL关键字可以用来判断 字段 的值是否为空值(NULL)。如果 字段 的值是空值,则满足 查询 条件,该记录将被 查询 出来。如果 字段 的值不是空值,则不满足 查询 条件。其语法规则如下: IS [ NOT ] NULL 其 ,“NOT”是可选参数,加上NOT 表示 字段 不是空值时满足条件。 IS NULL是 一个 整体,不能将IS换成”=”. 三、使用聚合函数 查询 数据 3.1、group by 分组 [ sql ] view plain copy select * from STUDENT group by STU_SEX; 不加条件,那么就只取每个分组的第一条。 如果想看分组的内容,可以加groub_concat [ sql ] view plain copy select STU_SEX,group_concat(STU_NAME) from STUDENT group by STU_SEX; 3.2、一般情况下group需与统计函数(聚合函数)一起使用才有意义 先准备一些数据: [ sql ] view plain copy create table EMPLOYEES( EMP_NAME CHAR(10) NOT NULL, EMP_SALARY INT unsigned NOT NULL, EMP_DEP CHAR(10) NOT NULL insert into EMPLOYEES values('小王',5000,'销售部'); insert into EMPLOYEES values('阿小王',6000,'销售部'); insert into EMPLOYEES values('工是不',7000,'销售部'); insert into EMPLOYEES values('人人乐',3000,'资源部'); insert into EMPLOYEES values('满头大',4000,'资源部'); insert into EMPLOYEES values('天生一家',5500,'资源部'); insert into EMPLOYEES values('小花',14500,'资源部'); insert into EMPLOYEES values('大玉',15000,'研发部'); insert into EMPLOYEES values('条条',12000,'研发部'); insert into EMPLOYEES values('笨笨',13000,'研发部'); insert into EMPLOYEES values('我是天才',15000,'研发部'); insert into EMPLOYEES values('无语了',6000,'审计部'); insert into EMPLOYEES values('什么人',5000,'审计部'); insert into EMPLOYEES values('不知道',4000,'审计部'); my sql 的五种统计函数: (1)max:求最大值 求每个部门的最高工资: [ sql ] view plain copy select EMP_NAME,EMP_DEP,max(EMP_SALARY) from EMPLOYEES group by EMP_DEP; (2)min:求最小值 求每个部门的最仰工资: [ sql ] view plain copy select EMP_NAME,EMP_DEP,min(EMP_SALARY) from EMPLOYEES group by EMP_DEP; (3)sum:求总数和 求每个部门的工资总和: [ sql ] view plain copy select EMP_DEP,sum(EMP_SALARY) from EMPLOYEES group by EMP_DEP (4)avg:求平均值 求每个部门的工资平均值 [ sql ] view plain copy select EMP_DEP,avg(EMP_SALARY) from EMPLOYEES group by EMP_DEP; (5)count:求总行数 求每个部门工资大于一定金额的人数 [ sql ] view plain copy select EMP_DEP,count(*) from EMPLOYEES where EMP_SALARY>=500 group by EMP_DEP; 3.3、带条件的groub by 字段 having,利用HAVING语句过滤分组数据 having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件 经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。 having 子句被限制子已经在SELECT语句 定义的列和聚合表达式上。通常,你需要通过在HAVING子句 重复聚合函数表达式来引用聚合值,就如你在SELECT语句 做的那样。 [ sql ] view plain copy select EMP_DEP,avg(EMP_SALARY),group_concat(EMP_NAME)from EMPLOYEES group by EMP_DEP HAVING avg(EMP_SALARY) >=6000; 查找平均工资大于6000的部门,并把部门里的人全部列出来 四、多表上联合 查询 多表上联合 查询 分为内连接 查询 和外连接 查询 (1)隐式内连接 查询 [ sql ] view plain copy select STUDENT.STU_ID,STUDENT.STU_NAME,STUDENT.STU_AGE,STUDENT.STU_SEX,GRADE.STU_SCORE from STUDENT,GRADE WHERE STUDENT.STU_ID=GRADE.STU_ID AND GRADE.STU_SCORE >=90; 查找大于90分的学生信息: (2)显式内连接 查询 [ sql ] view plain copy select STUDENT.STU_ID,STUDENT.STU_NAME,STUDENT.STU_AGE,STUDENT.STU_SEX,GRADE.STU_SCORE from STUDENT inner join GRADE on STUDENT.STU_ID=GRADE.STU_ID AND GRADE.STU_SCORE >=90; 用法:select .... from 表1 inner join 表2 on 条件表达式 (3)外连接 查询 left join.左连接 查询 。 用法 :select .... from 表1 left join 表2 on 条件表达式 意思是表1查出来的数据不能为null,但是其对应表2的数据可以为null [ sql ] view plain copy select STUDENT.STU_ID,STUDENT.STU_NAME,STUDENT.STU_AGE,STUDENT.STU_SEX,GRADE.STU_SCORE from STUDENT left join GRADE on STUDENT.STU_ID=GRADE.STU_ID; right join就是相反的了,用法相同 用left join的时候,left join操作符左侧表里的信息都会被 查询 出来,右侧表里没有的记录会填空(NULL).right join亦然;inner join的时候则只有条件合适的才会显示出来 full join() 完整外部联接返回左表和右 表中 的所有行。当某行在另 一个 表中 没有匹配行时,则另 一个 表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据 仅当至少有 一个 同属于两表的行符合联接条件时,内联接才返回行。内联接消除与另 一个 表中 的任何行不匹配的行。而外联接会返回 FROM 子句 提到的至少 一个 表或 视图的所有行,只要这些行符合任何 WHERE 或 HAVING 搜索条件。将检索通过左向外联接引用的左表的所有行,以及通过右向外联接引用的右表的所有行。完整外 部联接 两个表的所有行都将返回。 五、子 查询 一个 查询 select的结果作为另 一个 查询 的条件 语法:select * from 表1 wher 条件1(select ..from 表2 where 条件2) 1、与In结合 [ sql ] view plain copy select * from STUDENT where STU_ID IN(select STU_ID from GRADE where STU_SCORE>85); 查找大于85分的学生信息 2、与EXISTS结合 EXISTS和NOT EXISTS操作符只测试某个子 查询 是否返回了数据行。如果是,EXISTS将是true,NOT EXISTS将是false。 [ sql ] view plain copy select * from STUDENT where EXISTS (select STU_ID from GRADE where STU_SCORE>=100); 如果有学生成绩大于100,才 查询 所有的学生信息 3、ALL、ANY和SOME子 查询 any和all的操作符常见用法是结合 一个 相对比较操作符对 一个 数据列子 查询 的结果进行测试。它们测试比较值是否与子 查询 所返回的全部或一部分值匹配。比方说,如果比较值小于或等于子 查询 所返回的每 一个 值,<=all将是true,只要比较值小于或等于子 查询 所返回的任何 一个 值,<=any将是true。some是any的 一个 同义词。 [ sql ] view plain copy select STU_ID from GRADE where STU_SCORE = any (select STU_ID from GRADE where STU_SCORE 80 order by STU_SCORE; 默认是按升序的, 也可以这么写 [ sql ] view plain copy select * from GRADE where STU_SCORE >80 order by STU_SCORE ASC; 结果如下: 如果想换成降序的: [ sql ] view plain copy select * from GRADE where STU_SCORE >80 order by STU_SCORE desc; 7.2、limit limit [offset,] N offset 偏移量,可选,不写则相当于limit 0,N N 取出条目 取分数最高的前5条 [ sql ] view plain copy select * from GRADE order by STU_SCORE desc limit 5; 取分数最低的前5条 [ sql ] view plain copy select * from GRADE order by STU_SCORE asc limit 5; 取分数排名在10-15之间的5条 [ sql ] view plain copy select * from GRADE order by STU_SCORE desc limit 10,5 九、使用正则表达式 查询 正则表达式是用某种模式去匹配一类字符串的 一个 方式。例如,使用正则表达式可以 查询 出包含A、B、C其 任一 字母 的字符串。正则表达式的 查询 能力比通配字符的 查询 能力更强大,而且更加的灵活。正则表达式可以应用于非常复杂 查询 。 My SQL ,使用REGEXP关键字来匹配 查询 正则表达式。其基本形式如下: 属性名 REGEXP '匹配方式' 在使用前先插入一些数据: [ sql ] view plain copy insert into STUDENT values(2022,'12wef',13,'男'); insert into STUDENT values(2023,'faf_23',13,'男'); insert into STUDENT values(2024,'fafa',13,'女'); insert into STUDENT values(2025,'ooop',14,'男'); insert into STUDENT values(2026,'23oop',14,'男'); insert into STUDENT values(2027,'woop89',14,'男'); insert into STUDENT values(2028,'abcdd',11,'男'); (1)使用字符“^”可以匹配以特定字符或字符串开头的记录。 查询 所有以阿头的 [ sql ] view plain copy select * from STUDENT where STU_NAME REGEXP '^阿'; 以数字开头 [ sql ] view plain copy select * from STUDENT where STU_NAME REGEXP '^[0-9]'; (2)使用字符“$”可以匹配以特定字符或字符串结尾的记录 以数字结尾 [ sql ] view plain copy select * from STUDENT where STU_NAME REGEXP '[0-9]$'; (3)用正则表达式来 查询 时,可以用“.”来替代字符串 的任意 一个 字符。 [ sql ] view plain copy select * from STUDENT where STU_NAME REGEXP '^w....[0-9]$'; 以w开头,以数字结束, 间有4个 (4)使用方括号([])可以将需要 查询 字符组成 一个 字符集。只要记录 包含方括号 的任意字符,该记录将会被 查询 出来。 例如,通过“[abc]”可以 查询 包含a、b、c这三个 字母 任何 一个 的记录。 使用方括号可以指定集合的区间。 “[a-z]” 表示 从a-z的所有 字母 ; “[0-9]” 表示 从0-9的所有数字; “[a-z0-9]” 表示 包含所有的小写 字母 和数字。 “[a-zA-Z]” 表示 匹配所有 字母 。 [ sql ] view plain copy select * from STUDENT where STU_NAME REGEXP '[0-9a-z]'; 查询 所有包含有数字和小写 字母 的 使用“[^字符集合]”可以匹配指定字符以外的字符 (5){} 表示 出现的次数 正则表达式 ,“字符串{M}” 表示 字符串连续出现M次;“字符串{M,N}” 表示 字符串联连续出现至少M次,最多N次。例如,“ab{2}” 表示 字符串“ab”连续出现两次。“ab{2,4}” 表示 字符串“ab”连续出现至少两次,最多四次。 o出现2次 [ sql ] view plain copy select * from STUDENT where STU_NAME REGEXP 'o{2}'; (6)+ 表示 到少出现一次 fa至少出现一次 [ sql ] view plain copy select * from STUDENT where STU_NAME REGEXP '(fa)+'; 正则表达式可以匹配字符串。当 表中 的记录包含这个字符串时,就可以将该记录 查询 出来。如果指定多个字符串时,需要用符号“|”隔开。只要匹配这些字符串 的任意 一个 即可。每个字符串与”|”之间不能有空格。因为, 查询 过程 ,数据库系统会将空格也当作 一个 字符。这样就 查询 不出想要的结果。 正则表达式 ,“*”和“+”都可以匹配多个该符号之前的字符。但是,“+”至少 表示 一个 字符,而“*”可以 表示 零个字符。
1. 字符函数 写 一个 查询 ,用首 字母 大写,其它 字母 小写显示雇员的ename,显示名字的长度,并给每列 一个 适当的标签,条件是满足所有雇员名字的开始 字母 是J、A 或 M 的雇员,并对询结果按雇员的ename升序排序。(提示:使用initcap、length、substr) select initcap(ename), le...... 查询 Northwind数据库 orders表的ShipCountry列以B或C或D或F开始且 第三个 字符为"a"的OrderID、CustomerID和ShipCountry的信息。 SQL 查询 代码: USE Northwind SELECT ShipCountry,OrderID,CustomerID FROM orders WHERE ShipCountry L
在Oracle ,我们可以使用UPDATE语句来更新 一个 表中 的多条数据,并且将 字段 的值设置为另 一个 表中 对应的数据。具体的 SQL 语句可以按照以下步骤编写: 1. 首先,我们需要确定需要更新的表和 字段 。假设我们有两个表:表A和表B,需要将表A 字段 X更新为表B 对应的 字段 Y的值。 2. 接下来,我们可以使用UPDATE语句来更新表A 的数据。 SQL 语句的基本语法如下: UPDATE 表A SET 字段 X = (SELECT 字段 Y FROM 表B WHERE 条件) WHERE 条件; 其 字段 X是需要更新的 字段 字段 Y是我们需要从表B 获取的 字段 ,条件可以根据具体的需求进行设置。 3. 在上述 SQL 语句 ,我们使用了子 查询 ,即将表B 的特定 字段 值作为更新操作的目标,这样可以确保每条数据都能够正确地更新到表A 。 4. 根据实际情况,我们可以进一步添加条件或者使用JOIN语句来获取和更新表A 的数据。具体的语句可以根据具体需求进行调整和优化。 需要注意的是,更新操作会修改 表中 的数据,请在执行更新语句之前谨慎检查和备份数据,以避免误操作或者数据丢失。