基本查询(单表查询):
select 列1,列2,。。。from 表名
1.选择列
1)看所有字段 :*
select * from product;
2)部分字段:
select pid,pname from product;
3)给列加列标题
字段名 [as] 列标题 如果列标题中有空格,要使用单引号
select pid as 产品编号,pname as产品名称 from product;
4)case: 替换查询中的结果
select 学号,姓名,性别 from xs;
select 学号,姓名,case
when 性别=1 then '男'
when 性别=0 then '女'
end as 性别
from xs;
5)计算列
select 学号,姓名,总学分+5 fromxs;
2.选择行
1).where 条件
比较运算符: = > >= < <= <> != <=>
逻辑运算符: and or not
计算机系女生记录 表中女用0表示
select 姓名,专业名,性别
from xs
where 专业名='计算机' and 性别=0
选择(Selection)
选择是单目运算,其运算对象是一个表。该运算按给定的条件,从表中选出满足条件的行形成一个新表作为运算结果。
使用数据库和表的主要目的是存储数据以便在需要时进行检索、统计或组织输出,通过SQL语句的查询可以从表或视图中迅速方便地检索数据。SQL的SELECT语句可以实现对表的选择、投影及连接操作。
SELECT语句可以从一个或多个表中选取特定的行和列,结果通常是生成一个临时表。在执行过程中系统根据用户的标准从数据库中选出匹配的行和列,并将结果放到临时的表中,这就是实现选择和投影运算的一个形式。
下面介绍SELECT语句,它是SQL的核心。
语法格式:
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr, ...
[INTO OUTFILE 'file_name' export_options | INTO DUMPFILE 'file_name']
[FROM table_reference [ ,table_reference] …] /*FROM子句*/
[WHERE where_definition] /*WHERE子句*/
[GROUP BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]] /* GROUP BY子句*/
[HAVING where_definition] /*HAVING 子句*/
[ORDER BY {col_name | expr | position} [ASC| DESC] , ...] /*ORDERBY子句*/
[LIMIT {[offset,] row_count | row_count OFFSET offset}] /*LIMIT子句*/
说明:
从这个基本语法可以看出,最简单的SELECT语句是SELECT select_expr,利用这个最简单的SELECT语句,可以进行MySQL所支持的任何运算,例如,SELECT 1+1,它将返回2。
SELECT关键词的后面可以使用很多的选项:
ALL| DISTINCT | DISTINCTROW:这几个选项指定是否重复行应被返回。如果这些选项没有被给定,则默认值为ALL(所有的匹配行被返回)。DISTINCT 和DISTINCTROW是同义词,用于消除结果集合中的重复行。
HIGH_PRIORITY,STRAIGHT_JOIN和以SQL_为开头的选项都是MySQL相对于标准SQL的扩展,这些选项在多数情况下可以选择不使用。
HIGH_PRIORITY:给予SELECT更高的优先权,使查询立刻执行,加快查询速度。
STRAIGHT_JOIN:用于促使MySQL优化器把表联合在一起,加快查询速度。
SQL_SMALL_RESULT:可以与GROUP BY或DISTINCT同时使用,来告知MySQL优化器结果集合是较小的。在此情况下,MySQL使用快速临时表来储存生成的表,不使用分类。
SQL_BUFFER_RESULT:促使结果被放入一个临时表中。这可以帮助MySQL提前解开表锁定,在需要花费较长时间的情况下,也可以帮助把结果集合发送到客户端中。
当自定义的列标题中含有空格时,必须使用引号将标题括起来。例如:
SELECT 学号AS 'Studentnumber', 姓名AS 'Student name', 总学分 AS mark
FROM XS
WHERE 专业名= '计算机';
说明:不允许在WHERE子句中使用列别名。这是因为,执行WHERE代码时,可能尚未确定列值。例如,下述查询是非法的:
SELECT 性别 AS SEX FROM XSWHERE SEX=0;
MySQL有一个特殊的等于运算符“<=>”,当两个表达式彼此相等或都等于空值时,它的值为TRUE,其中有一个空值或都是非空值但不相等,这个条件就是FALSE。没有UNKNOWN的情况。
【例4.34】查询XS表中备注为空的同学的情况。
SELECT 姓名,学号,出生日期,总学分
FROM XS
WHERE 备注<=>NULL;
从查询条件的构成看出,可以将多个判定运算的结果通过逻辑运算符(AND、OR、XOR和NOT)组成更为复杂的查询条件。有关逻辑运算符,第6章会具体介绍。
【例4.35】查询XS表中专业为计算机,性别为女(0)的同学的情况。
SELECT 姓名,学号,性别,总学分
FROM XS
WHERE 专业名='计算机' AND 性别=0;
查询结果为:
如果我们想要查找特殊符号中的一个或全部(_和%),我们必须使用一个转义字符。
【例4.38】查询XS表中名字包含下画线的学生学号和姓名。
SELECT 学号,姓名
FROM XS
WHERE 学号LIKE '%#_%' ESCAPE '#';
说明:由于没有学生满足这个条件,所以这里没有结果返回。定义了“#”为转义字符以后,语句中在“#”后面的“_”就失去了它原来特殊的意义。
(2)REGEXP运算符
REGEXP运算符用来执行更复杂的字符串比较运算。REGEXP是正则表达式(regularexpression)的缩写。和LIKE运算符一样,REGEXP运算符有多种功能,但它不是SQL标准的一部分,REGEXP运算符的一个同义词是RLIKE。
语法格式:
match_expression [ NOT ][ REGEXP | RLIKE ]match_expression
LIKE运算符有两个符号具有特殊的含义:“_”和“%”。而REGEXP运算符则有更多的符号有特殊的含义,参见表4.11。
查看学号是081101,和081106的姓名,性别,专业名
查看1990年以后出生的学生姓名
select 姓名 from xs
where 出生日期>'1990-01-01';
查看不是1990年出生的学生的姓名;
select 姓名 from xs
where 出生日期<'1990-01-01'or 出生日期>'1990-12-31';
select 姓名 from xs
where not(出生日期>='1990-01-01'and 出生日期<='1990-12-31');
查看总学分在50-52之间的学生姓名
select 姓名 from xs
where 总学分>=50 and 总学分<=52;
模式匹配:模糊查询 匹配符:% _
%:任意多个任意字符
_:任意单个字符
like运算符
查询姓李的学生
select 姓名 from xs
where 姓名 like '李%';
name中倒数第二个字母是b的姓名
name like '%b_'
书名 like '%java%'
关系数据库中的三种操作:选择 投影 连接
select 列1 [as] 列标题,列2
from 表名
where 条件
1.比较运算符
2.逻辑运算符 and or not
3.模式匹配 like %_