花花世界蕾 发表于 2018-9-28 09:47:10

MySQL数据库基础(五)——SQL查询

MySQL数据库基础(五)——SQL查询
一、单表查询
1、查询所有字段
  在SELECT语句中使用星号“”通配符查询所有字段
  在SELECT语句中指定所有字段
  selectfrom TStudent;
2、查询指定字段
  查询多个字段
  select Sname,sex,email from TStudent;
3、查询指定记录
  在SELECT 语句中通过WHERE子句,对数据进行过滤,语法格式为:
  SELECT 字段名1,字段名2,…,字段名n FROM 表名WHERE 查询条件

  select Sname,sex,email,Class from TStudent where>4、带IN关键字的查询
  查询满足指定范围内的条件的记录,使用IN操作符,将所有检索条件用括号括起来,检索条件用逗号分隔开,只要满足条件范围内的一个值即为匹配项。
  查新姓 王 刘 石的学生
  select * from TStudent where left(sname,1) in ('王','刘','石');
5、带BETWEEN AND的范围查询
  查询某个范围内的值,该操作符需要两个参数,即范围的开始值和结束值,如果字段值满足指定的范围查询条件,则这些记录被返回。
  以下查询条件,查询学号100到150的学生,包括100和150
  select from TStudent where convert(studentid,signed) between 100 and 150
  等价于
  selectfrom TStudent where convert(studentid,signed)>=100
  and convert(studentid,signed)
9、带OR的多条件查询
  OR操作符,表示只需要满足其中一个条件的记录即可返回。OR也可以连接两个甚至多个查询条件,多个条件表达式之间用AND分开。

  select * from TStudent where sname like '%志%' or>10、查询结果不重复
  在SELECT语句中可以使用DISTINCE关键字指示MySQL消除重复的记录值。
  SELECT DISTINCT 字段名 FROM 表名;
  查询一共有几个班

  select distinct>11、用LIMIT限制查询结果的数量
  LIMIT关键字可以返回指定位置的记录。
  LIMIT [位置偏移量,] 行数
  返回前10个学生
  select from TStudent limit 10;
  返回第11-20个学生,偏移量是10,就意味着从第11个开始取10条记录。
  select   from TStudent limit 10,10;
12、合并查询结果
  利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同。各个SELECT语句之间使用UNION或UNION ALL关键字分隔。
  要求第一个SQL语句返回的列和第二条返回的列数相同,
  select studentid,sname from TStudent where studentidTStudent group by>  SUM()函数
  查询每个学生总分
  select concat(a.StudentID,'',a.sname) ss,SUM(b.mark) from TStudent a join TScore b on a.StudentID=b.StudentID group by ss;
  AVG()函数
  统计每个班平均分

  Select>TStudent a join TScore b on a.StudentID=b.StudentID group by>3、多字段分组
  统计每班每科平均分,需要按两列分组class和subJectName

  select>4、使用HAVING过滤分组
  查询平局分大于80的学生
  select concat(a.StudentID,'',a.sname) ss,avg(b.mark) m from TStudent a join TScore b on a.StudentID=b.StudentID group by ss having m>80;
5、GROUP BY和ORDER BY使用
  查找平均分大于80分,按平均分排序。
  select concat(a.StudentID,'',a.sname) ss,avg(b.mark) m from TStudent a join TScore b on a.StudentID=b.StudentID group by ss having m>80 order by m;
6、在GROUP BY子句中使用WITH ROLLUP
  使用GROUP BY的WITH ROLLUP子句可以检索出更多的分组聚合信息,不仅仅可以检索出各组的聚合信息,还能检索出本组类的整体聚合信息。

  select>  能够统计每班每科的平均成绩,每班的平均成绩也能统计,全部班级的全部课程平均成绩也能统计。
五、子查询
1、带IN关键字的子查询
  IN关键字进行子查询时,内层查询语句仅仅返回一个数据列,数据列里的值将提供给外层查询语句进行比较操作。
  select * from TStudent where studentid in (select distinct studentid from TScore where mark>98);
2、带EXISTS关键字的子查询
  EXISTS关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断子查询是否返回行,如果至少返回一行,那么EXISTS的结果为true,此时外层查询语句将进行查询;如果子查询没有返回任何行,那么EXISTS返回的结果是false,此时外层语句将不进行查询。
  select from TStudent where studentid='01001' and exists (select from TScore where studentid='01001');
3、带ANY、SOME关键字的子查询
  ANY和SOME关键字是同义词,表示满足其中任一条件,允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。
  select from TStudent where studentid=any (select distinct studentid from TScore where mark>98)
  等价于
  selectfrom TStudent where studentid=some (select distinct studentid from TScore where mark>98);
  等价于
  select from TStudent where studentid in (select distinct studentid from TScore where mark>98);
  子查询时还可以使用其他的比较运算符,如some (select distinct studentid from TScore where mark>98)
  以下SQL语句子查询查出考试成绩大于98的学生的studentid,比如查出的结果有三个‘00010’,‘00021’,‘00061’,外查询将会查询比00061学号小的学生。
  select * from TStudent where studentid<some (select distinct studentid from TScore where mark>98);
4、带ALL关键字的子查询
  ALL关键字与ANY和SOME不同,使用ALL时需要同时满足所有内层查询的条件。
  以下SQL语句子查询查出考试成绩大于98的学生的studentid,比如查出的结果有三个‘00010’,‘00021’,‘00061’,外查询将会查询比00010学号小的学生。
  select * from TStudent where studentid<all (select distinct studentid from TScore where mark>98)
  以下SQL语句子查询查出考试成绩大于98的学生的studentid,比如查出的结果有三个‘00010’,‘00021’,‘00061’,外查询将会查询比00061学号大的学生。
  select * from TStudent where studentid>all (select distinct studentid from TScore where mark>98);
六、使用正则表达式查询
  正则表达式作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。MySQL用WHERE子句对正则表达式提供了初步的支持,允许指定用正则表达式过滤SELECT检索出的数据。
  在SQL查询语句中,查询条件REGEXP后所跟的东西作为正则表达式处理。
1、查询以特定字符或字符串开头的记录
  字符‘^’匹配以特定字符或者字符串开头的文本。
  select * from TStudent where sname regexp '^刘平';
2、查询以特定字符或字符串结尾的记录
  字符‘$’匹配以特定字符或者字符串结尾的文本。
  select * from TStudent where cardid regexp '36$';
3、用符号"."来替代字符串中的任意一个字符
  字符‘.’匹配任意一个字符。
  select * from TStudent where sname regexp '.康.';
4、使用"*"和"+"来匹配多个字符
  星号‘’匹配前面的字符任意多次,包括0次。
  加号‘+’匹配前面的字符至少一次。
  找出×××以19开始,以6结束的学生
  selectfrom TStudent where cardid regexp '^19.6$'
  找出×××号中有123的学生
  selectfrom TStudent where cardid regexp '.123+.';
5、匹配指定字符串
  正则表达式可以匹配指定字符串,只要匹配字符串在查询文本中即可,如要匹配多个字符串,多个字符串之间使用分隔符‘|’隔开。
  select * from TStudent where sname regexp '武|尹|罗';
6、匹配指定字符中的任意一个
  方括号“[]”指定一个字符集合,只匹配其中任何一个字符,即为所查找的文本。不支持汉字。
  select from TStudent where email regexp '';
  selectfrom TStudent where cardid regexp '^';
7、匹配指定字符以外的字符
  “[^字符集合]”匹配不在指定集合中的任何字符。
  select * from TStudent where cardid regexp '^[^1-7]';
8、使用{M}或者{M,N}来指定字符串连续出现的次数
  “字符串{n,}”表示至少匹配n次前面的字符。“字符串{n,m}”表示匹配前面的字符串不少于n次,不多于m次。
  查找×××中出现138并且后面有8位0-9的数字的学生。
  select * from TStudent where cardid regexp '138{15}';

页: [1]
查看完整版本: MySQL数据库基础(五)——SQL查询