MySQL学习笔记(五):SQL语句之查询语句

By AverageJoeWang
 标签:

一.简介

数据库查询是数据库的核心操作,SQL提供了SELECT语句进行查询,其格式为

SELECT [ALL | DISTINCT] <目标列表达式> [,<目标列表达式>] ...
FROM <表名或视图名> [, <表名或视图名>] ...
[WHERE <条件表达式>]#条件表达式
[GROUP BY <列名1> [HAVING <条件表达式>]]#having指有条件
[ORDER BY <列名2> [ASC | DESC]];#升序或者降序

二.查询语句

CREATE TABLE Student(
    Sno char(9) primary key,#主键
    Sname char(20) unique,#唯一
    Ssex char(2),
    Sage SMALLINT,
    Sdept char(20)
);
  • 根据Student表进行以下操作

2.1.选择表中若干列

  • 查询名字为Bill Gates的学生信息
SELECT * FROM Student where Sname='Bill Gates';
  • 查询名字中有Bill的学生信息,通配符“下划线”代表任意单词字符,‘百分号%’代表任意长度的通配符。(使用通配符与like语句)
SELECT * FROM Student where Sname like '%Bill%';
  • 查询年龄在20-23岁(包括20和23)之间的学生信息(BETWEEN…AND…和NOT BETWEEN …AND…)
SELECT * FROM Student where Sage BETWEEN 20 AND 23;
  • 查询计算机系CS,信息系MA和数学系IS学生姓名与性别(IN和NOT IN的使用方法)
SELECT Sname, Ssex FROM Student WHERE Sdept IN('CS','MA','IS');
  • 查询表中没有年龄信息的学生
SELECT * FROM Student WHERE Sage IS NULL;
#Sage is null

2.2.ORDER BY子句

  • 可以通过ORDER BY语句对查询结果按照一个或者多个属性的升序(ASC)或降序(DESC)排列,默认为升序
  • 在表中按学生年龄值升序检索出全部学生的信息
SELECT * FROM Student ORDER BY Sage;
  • 查询表中所有学生,先按专业升序排列,然后同一专业的学生再按照年龄降序排列,并且输出所有学生信息(连续使用排序只要写一个ORDER BY语句)
SELECT * FROM Student ORDER BY Sdept, Sage DESC;

2.3.LIMIT子句

  • LIMIT用于查询返回的前几条或者中间某几行数据,格式为
SELECT * FROM TABLE LIMIT [offset,] rows | rows OFFSET offset;
  • LIMIT可以接受一个或者两个参数。参数必须是整数常量
  • 如果给两个参数,第一个参数制定第一个返回记录行的偏移量,第二个参数返回记录行的最大数目
  • 初始记录行的偏移量是0,而不是1
SELECT * FROM Student LIMIT 5, 10; //检索记录行6 - 15行
  • 如果参数只有一个,表示返回最前面的记录行数目
SELECT * FROM Student LIMIT 5; //检索前5个记录行
  • LIMIT n 等价于 LIMIT 0,n;

  • 列出一个论坛版面第一页(每页显示20个)的帖子post标题title,并按照发布时间create-time降序排列

SELECT title FROM post ORDER BY create-time DESC LIMIT 0,20;

2.4.聚集函数

聚集函数有一下几种:count,sum,avg,max,min

  • 用法为
SELECT count(*) as totalcount from table1;//总数
SELECT sum(field1) as sumvalue from table1;//求和
SELECT avg(field1) as avgvalue from table1;//平均
SELECT max(field1) as maxvalue from table1;//最大
SELECT min(field1) as minvalue from table1;//最小

2.5.GROUP BY子句

  • GROUP BY子句根据一个或者多个属性的值对元组进行分组,值相等的为一组

+ 对查询分组目的是为了细化聚集函数的作用对象,分组后聚集函数将作用于每个组

  • 查询表中具有相同年龄的每个组的人数
select * Sage,cout(*) from Student group by Sage;
  • 对上一结果输出进行条件筛选,使用having
select * Sage,cout(*) from Student group by Sage having cout(*) > 1;

yuanzu

2.6.连接查询

  • 连接查询涉及到多个表
  • 有表Student与表SC(选课表),查询每个学生选择的课程
select Student.*, SC.*
from Student, SC
WHERE Student.Sno=SC.Sno;
//此连接为自然连接与内连接,舍弃没有选课学生的信息
  • 以Student表为主题,不舍弃没有选课的学生信息,称为外连接
select Student.*,SC.*
from Student LEFT JOIN SC ON(Student.Sno=SC.Sno);
//左连接,左外连接列出左边表中的所有元组