MySQL心得4--1--数据库查询1
1. 选择(Selection)作用于行!
选择是单目运算,其运算对象是一个表。该运算按给定的条件,从表中选出满足条件的行形成一个新表作为运算结果。
选择运算的记号为sF(R)。其中s是选择运算符,下标F是一个条件表达式,R是被操作的表。
若要在学生情况表中找出学生表中性别为女的行形成一个新表,则运算式为:sF(学生)F:性别=“女”,该选择运算的结果如下:
学 号 |
姓 名 |
专 业 名 |
性 别 |
出 生 日 期 |
总 学 分 |
备 注 |
081103 |
王燕 |
计算机 |
女 |
1989-10-06 |
50 |
|
2.投影(projection)作用于列!
投影也是单目运算,该运算从表中选出指定的属性值组成一个新表,记为:ÕA(R)。其中A是属性名(即列名)表,R是表名。
若在学生情况表中对学号、姓名和总学分投影,运算式为:Õ学号,姓名,总学分(学生)该运算得到如下图:
学 号 |
姓 名 |
总 学 分 |
081101 |
王林 |
50 |
081102 |
程明 |
50 |
081103 |
王燕 |
50 |
3.连接(join)
连接是把两个表中的行按照给定的条件进行拼接而形成新表,记为:RS。其中,R、S是被操作的表,F是条件。
两个表连接最常用的条件是两个表的某些列值相等,这样的连接称为等值连接。
数据库应用中最常用的是“自然连接”。进行自然连接运算要求两个表有共同属性(列),自然连接运算的结果表是在参与操作两个表的共同属性上进行等值连接后再去除重复的属性后所得的新表。自然连接运算记为:RS,其中R和S是参与运算的两个表。
4.选择列
基本查询(单表查询):select 列1,列2,。。。from 表名
1)看所有字段 :select * fromproduct;
2)部分字段(选择指定的列):
select 字段名1,字段名2 from product;
使用SELECT语句选择一个表中的某些列,各列名之间要以逗号分隔
3)给列加列标题
当希望查询结果中的某些列或所有列显示时且使用自己选择的列标题时,可以在列名之后使用AS子句来更改查询结果的列别名。
字段名 [as] 列标题 如果列标题中有空格,要使用单引号,中括号内的内容都可以省略。
select pnumber as 产品编号,pname as 产品名称 from product;
说明:不允许在where子句中使用列别名。这是因为,执行where代码时,可能尚未确定列值。例如,下述查询是非法的:
SELECT 性别 ASSEX FROM XS WHERE SEX=0;
4)替换查询结果中的数据
在对表进行查询时,有时对所查询的某些列希望得到的是一种概念而不是具体的数据。例如查询XS表的总学分,所希望知道的是学习的总体情况,这时,就可以用等级来替换总学分的具体数字。
格式为:
case
when 条件1 then 表达式1
when 条件2 then 表达式2
……
else 表达式
end
case: 替换查询中的结果(case是一行,所以中间打回车不用分号或逗号) 例1:
select 学号,姓名,case
when 性别=1then '男'
when 性别=0then '女'
end as 性别
from xs;
例2:
select学号, 姓名,
case
when 总学分 isnull then '尚未选课'
when 总学分 < 50 then '不及格'
when总学分 >=50 and总学分<=52 then '合格'
else '优秀'
(或者可以简单的这么写:when总学分>52 then '优秀'
when总学分 >=50 then '合格'
else '不及格'
即:先写大的后写小的)
end as等级
from XS
5)计算列
使用select对列进行查询时,在结果中可以输出对列值计算后的值,即select字句可使用表达式作为结果。
计算列值使用算术运算符:+、-、*、/和%(取余)后面细讲。
例1:select 学号,姓名,总学分+5 from xs;(字段总学分+5会显示在列标题处)
例2:select 学号,课程号,
成绩*1.20 as 成绩 120
from XS_KC
5. 使用数据库和表的主要目的是存储数据以便在需要时进行检索、统计或组织输出,通过SQL语句的查询可以从表或视图中迅速方便地检索数据。SQL的SELECT语句可以实现对表的选择、投影及连接操作。
select语句(是SQL的核心)可以从一个或多个表中选取特定的行和列,结果通常是生成一个临时表(即不会改变原来的表结构)。在执行过程中系统根据用户的标准从数据库中选出匹配的行和列,并将结果放到临时的表中,这就是实现选择和投影运算的一个形式。
6. 选择行 where 条件
where子句会根据条件对from子句的中间结果中的行一行一行地进行判断,当条件为true的时候,一行就被包含到where子句的中间结果中。
判定运算包括比较运算、模式匹配、范围比较、空值比较和子查询。
1). 比较运算
比较运算符用于比较两个表达式值,MySQL支持的比较运算符有:=(等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于)、<=>(相等或都等于空)、<>(不等于)、!=(不等于)。
比较运算的语法格式为:
expression { = | < | <= | > | >= | <=> |<> | != } expression
其中expression是除TEXT和BLOB外类型的表达式。
当两个表达式值均不为空值(NULL)时,除了“<=>”运算符,其他比较运算返回逻辑值TRUE(真)或FALSE(假);而当两个表达式值中有一个为空值或都为空值时,将返回unknown。
MySQL有一个特殊的等于运算符“<=>”,当两个表达式彼此相等或都等于空值时,它的值为TRUE,其中有一个空值或都是非空值但不相等,这个条件就是FALSE。没有UNKNOWN的情况。
例:查询XS表中备注为空的同学的情况。
SELECT 姓名,学号,出生日期,总学分
FROM XS
WHERE 备注<=>NULL;
2).逻辑运算符: and or not
例1: 计算机系女生记录 表中女用0表示
select 姓名,专业名,性别
from xs
where 专业名='计算机' and 性别=0
例2: 查看不是1990年出生的学生的姓名;
select 姓名 fromxs
where 出生日期<'1990-01-01'or 出生日期>'1990-12-31';
或:
select 姓名 fromxs
where not(出生日期>='1990-01-01'and 出生日期<='1990-12-31');
7. 模式匹配:模糊查询 匹配符:% _
%:任意多个任意字符 ; _:任意单个字符
like运算符:
like运算符用于指出一个字符串是否与指定的字符串相匹配,其运算对象可以是char、varchar、text、datetime等类型的数据,返回逻辑值TRUE或FALSE。
使用LIKE进行模式匹配时,常使用特殊符号_和%,可进行模糊查询。“%”代表0个或多个字符,“_”代表单个字符。
escape_character:转义字符,escape_character没有默认值,且必须为单个字符。当要匹配的字符串中含有与特殊符号(_和%)相同的字符时,此时应通过该字符前的转义字符指明其为模式串中的一个匹配字符。使用关键字escape可指定转义符。
由于MySQL默认不区分大小写,要区分大小写时需要更换字符集的校对规则。
例1:查询XSCJ数据库XS表中姓“王”的学生学号、姓名及性别。
SELECT 学号,姓名,性别
FROM XS
WHERE 姓名 LIKE '王%';
例2:name中倒数第二个字母是b的姓名
name like '%b_'
8. 如果我们想要查找特殊符号中的一个或全部(_和%),我们必须使用一个转义字符。
例:查询XS表中名字包含下画线的学生学号和姓名。
SELECT 学号,姓名
FROM XS
WHERE 学号 LIKE '%#_%' ESCAPE'#';
说明:定义了“#”为转义字符以后,语句中在“#”后面的“_”就失去了它原来特殊的意义。也可以不用“#”用其他任何符号。
9. regexp运算符(改运算符不是SQL标准的一部分。即也许在MySQL中能用,在sever SQl中却用不了,跨平台性不高,所以慎用)
regexp运算符用来执行更复杂的字符串比较运算。regexp是正则表达式(regular expression)的缩写。和LIKE运算符一样,regexp运算符有多种功能,但它不是SQL标准的一部分,regexp运算符的一个同义词是rlike。
语法格式:
match_expression [ not ][ regexp | rlike] match_expression
like运算符有两个符号具有特殊的含义:“_”和“%”。而regexp运算符则有更多的符号有特殊的含义,参见下表:
特殊字符 |
含 义 |
特殊字符 |
含 义 |
^ |
匹配字符串的开始部分 |
[abc] |
匹配方括号里出现的字符串abc |
$ |
匹配字符串的结束部分 |
[a-z] |
匹配方括号里出现的a~z之间的1个字符 |
. |
匹配任何一个字符(包括回车和新行) |
[^a-z] |
匹配方括号里出现的不在a~z之间的1个字符 |
* |
匹配星号之前的0个或多个字符任何序列 |
| |
匹配符号左边或右边出现的字符串 |
+ |
匹配加号之前的1个或多个字符的任何序列 |
[[. .]] |
匹配方括号里出现的符号(如空格、换行、括号、句号、冒号、加号、连字符等) |
? |
匹配问号之前0个或多个字符 |
[[:<:]和[[:>:]] |
匹配一个单词的开始和结束 |
{n} |
匹配括号前的内容出现n次的序列 |
[[: :] |
匹配方括号里出现的字符中的任意一个字符 |
() |
匹配括号里的内容 |
|
|
10. where子句必须紧跟from子句之后,在where子句中,使用一个条件从from子句的中间结果中选取行。其基本格式为:
where where_definition
其中,where_definition为查询条件。语法格式为:
where_definition:
<precdicate>
| <precdicate>{ and | or } <precdicate>
| (where_definition)
| not where_definition
其中,predicate为判定运算,结果为true、false或unknown。
<predicate>:
expression { = | < | <= | > | >= | <=> | <> | !=} expression /*比较运算*/
| match_expression [ NOT ] like match_expression [ ESCAPE'escape_character ' ]
/*like运算符*/
| match_expression [ NOT ][ regexp |rlike] match_expression
/*regexp运算符*/
| expression [ not ] between expression and expression /*指定范围*/
| expression is [ not ] null /*是否空值判断*/
| expression [ not] in ( subquery | expression [,…n] ) /*in子句*/
| expression { = | <| <= | > | >= | <=> | <> | !=} {all | some | any} (subquery )
/*比较子查询*/
| exist ( subquery ) /*exist子查询*/
说明:
In关键字既可以指定范围,也可以表示子查询。
在SQL中,返回逻辑值(TRUE或FALSE)的运算符或关键字都可称为谓词。