查询一

DQL语言

SELECT语法

SELECT   [ALL | DISTINCT] 
{  * |  table.* | [ table.field1 [ as  alias1] [, table.field2 [as  alias2]][, …]] }
FROM  table_name  [ as  table_ alias  ]
    [ left|out|inner  join  table_name2 ]    #联合查询
    [ WHERE  … ]    #指定结果需满足的条件
    [ GROUP BY …]   #指定结果按照哪几个字段来分组
    [ HAVING …] #过滤分组的记录必须满足的次要条件
    [ ORDER BY… ]   #指定查询记录按一个或者多个条件排序
    [ LIMIT  {   [ offset,] row_count    |   row_count OFFSET offset   }] ;
 
查所有
 
select   *   from student
 
查指定的结果
 
SELECT     StudentNo, StudentName, Phone  FROM  student;

SELECT  student.StudentNo , StudentName, StudentResult   
FROM   student  , result ;

 
AS子句
作用
可给数据列取一个新别名 可给表取一个新别名 可把经计算或总结的结果用另外一个新名称来代替
 
SELECT   StudentNo   AS “学号”   FROM   student;
SELECT   a.StudentNo   FROM   student AS  a;
SELECT   Phone+1  AS  Tel    FROM   student;


DISTINCT关键字

作用
去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同),只返回一条
 
SELECT     DISTINCT   字段名1, 字段名2...     FROM   表名

 
在SQL语句中使用表达式
 
SELECT  version() ,   100*3        #返回MySQL版本和计算结果
SELECT  SubjectName “课程名称”, ClassHour+10  AS “新学时”  FROM subject;
#给返回结果中的课时都加10个课时


where条件语句

用于检索数据表中符合条件的记录 搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假 搜索条件的组成 逻辑操作符 比较操作符

逻辑操作符

操作符名称

语法

描述

AND或&&

a AND b 或 a && b

逻辑与,同时为真,结果才为真

OR或||

a OR b 或 a||b

逻辑或,只要一个为真,则结果为真

NOT或!

NOT a 或 !a

逻辑非,若操作数为假,结果则为真

比较操作符

操作符名称

语法

描述

IS NULL

a IS NULL

若操作符为NULL,则结果为真

IS NOT NULL

a IS NOT NULL

若操作符不为NULL,则结果为真

BETWEEN

a BETWEEN b AND c

若a范围在b与c之间则结果为真

LIKE

a LIKE b

SQL模式匹配,若a匹配b,则结果为真

IN

a IN (a1,a2,a3,….)

若a等于a1,a2…中的某一个,则结果为真

BETWEEN AND范围查询

SELECT  字段列1,字段2 ,…FROM 表名 WHERE   字段x  BETWEEN  值1 AND  值2
 
LIKE模糊查询
在WHERE子句中,使用LIKE关键字进行模糊查询 与“%”一起使用,表示匹配0或任意多个字符 与“_”一起使用,表示匹配单个字符
 
#查询包含“数学”的所有课程
SELECT   *  FROM subject WHERE SubjectName  LIKE  "%数学%";
#查询所有姓名为“李**”三个字的学生信息
SELECT  StudentNo,StudentName FROM student  
  WHERE StudentName LIKE "李__";

 
使用IN进行范围查询
 
SELECT  字段列1,字段2 ,…FROM 表名 WHERE   字段x  IN  ( 值1,值2,值3…)
 
SELECT  *  FROM  subject  where    ClassHour = 100  OR ClassHour =110 OR ClassHour  = 120;  #普通处理方式
SELECT  *  FROM  subject  where ClassHour  IN ( 100, 110,120 );
#使用IN进行查询方式,更为简洁,效率更高

 
连接查询
如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询 分类包括 内连接 ( inner join) 等值和非等值的连接查询 自身连接查询 外连接 ( out join ) 左连接(LEFT JOIN) 右连接 ( RIGHT JOIN)
内连接查询
INNER JOIN内连接
在表中至少一个匹配时,则返回记录
 
SELECT   字段1,字段2,…  FROM  table_1 
INNER  JOIN   table_2    ON  table_1.字段x   =  table_2.字段y;
#  INNER JOIN  与 JOIN 是相同的;
#  如table_1中的行在table_2中没有匹配,则不返回
 
等值和非等值的连接查询 与单表查询类似,都是SELECT语句 把多个表放到FROM后,并用逗号隔开 可使用AS关键字取别名,便于引用 如无重名查询字段则可省略数据表的指定
 
#要求:从subject和grade数据表查询课程名称和所属年级名称
#非等值连接查
SELECT  SubjectName, GradeName  FROM  subject,  grade;  
#等值查询
SELECT  SubjectName, GradeName  FROM  subject,  grade 
WHERE  subject.GradeID = grade.GradeID;  

 
左外连接(LEFT JOIN)
从左表(table_1)中返回所有的记录,即便在右(table_2)中没有匹配的行
 
SELECT   字段1,字段2,… FROM table_1 
LEFT  [ OUTER ]   JOIN   table_2    ON  table_1.字段x   =  table_2.字段y;

 
右外连接(RIGHT JOIN)
从右表(table_2)中返回所有的记录,即便在左(table_1)中没有匹配的行
 
SELECT   字段1,字段2,… FROM table_1 
RIGHT   [ OUTER ]   JOIN   table_2    ON  table_1.字段x   =  table_2.字段y;

三个join对比

操作符名称

描述

INNER JOIN( JOIN)

如果表中有至少一个匹配,则返回行

LEFT JOIN

不论右表是否有匹配,都会返回左表的所有行

RIGHT JOIN

不论左表是否有匹配,都会返回右表的所有行

自连接查询

自连接查询 自连接就是一个表和它自身进行连接,是多表连接的特殊情况。 在自连接查询中,要先在FROM字句中为表分别定义两个不同的别名, 然后使用这两个别名写出一个连接条件。

SELECT DISTINCT c1.CouNo 课程编号, c1.CouName 课程名称, 
                  c1.Kind 课程类别, c1.DepartNo 系部编号
FROM Course c1 JOIN Course c2 ON c1.Kind=c2.Kind AND c1.DepartNo!=c2.DepartNo
ORDER BY c1.CouNo;SELECT DISTINCT c1.CouNo 课程编号, c1.CouName 课程名称, 
                  c1.Kind 课程类别, c1.DepartNo 系部编号
FROM Course c1 JOIN Course c2 ON c1.Kind=c2.Kind AND c1.DepartNo!=c2.DepartNo
ORDER BY c1.CouNo;