1.限制字句----where
如果想限制查询返回的行,需要使用WHERE子句
语法:
SELECT *|{[DISTINCT] column|select_expr [alias], …]}
[FROM [database.]table]
[WHERE conditions];
WHERE条件又叫做过滤条件,它从FROM子句的中间结果中去掉所有条件conditions不为TRUE(而为FALSE或者NULL)的行
WHERE子句跟在FROM子句后面
1.where字句可以接其他查询字句
**2.**Where字句不能使用列别名
**3.**过滤出满足条件的数据行供下一步执行
4.在mysql中对查询的结果值大小写不敏感
**5.**对于在where条件出现的日期,时间,字符串等数据类型时,需要使用引号将列值引起来,否则报错。
6.需要字符集及校对规则的支持
在mysql中,字符串的比较是由字符集及一组校对规则所决定的
字符集:就是一组字符的集合
校对规则:字符串的比较规则
在MySQL中,字符串比较是由字符集和校对规则共同决定的
字符集(CHARSET):是一套符号和编码
校对规则(COLLATION):它是一组规则,负责决定某一字符集内的字符进行比较 和排序的结果
每个字符集有一个或多个校对规则,并且每个校对规则只能属于一个字符集
每个字符集有一个默认校对规则。例如,utf8默认校对规则是utf8_general_ci
校对规则的命名约定:以字符集名开始,中间包括一个语言名,最后以后缀_ci、_cs 或bin结束
*_bin: binary case sensitive collation,区分大小写 ,直接比较字符的编码
*_cs: case sensitive collation,区分大小写
*_ci: case insensitive collation,不区分大小写
7.当进行数据比较的时候,要确定字符集及校对规则,一定要是相容的否则报错
8.字符集的级别:
服务器级别,数据库级别,表级别,列级别
例如:当创建一个表的时候,如果列的字符集没有指定则按照表的字符集,如果 列的字符集没有指定则按照表的字符集、如果表没有指定则默认为数据库,。。。
**9.**查看数据库支持的所有字符集
Show character set;
10.查看数据库支持的所有校对规则:
Show collation;
11.比较操作符
mysql> help contents
You asked for help about help category: “Contents”
For more information, type 'help ', where is one of the following
categories:
Account Management
Administration
Compound Statements
Data Definition
Data Manipulation
Data Types
Functions
Functions and Modifiers for Use with GROUP BY
Geographic Features
Help Metadata
Language Structure
Plugins
Procedures
Storage Engines
Table Maintenance
Transactions
User-Defined Functions
Utility
mysql> help Functions
You asked for help about help category: “Functions”
For more information, type 'help ', where is one of the following
categories:
Bit Functions
Comparison operators
Control flow functions
Date and Time Functions
Encryption Functions
Information Functions
Logical operators
Miscellaneous Functions
Numeric Functions
String Functions
mysql> help Comparison operators
You asked for help about help category: “Comparison operators”
For more information, type 'help ', where is one of the following
topics:
!=
<
<=
<=>可以和null比较
=不可以和null比较
>
>=
BETWEEN AND
COALESCE
GREATEST
IN
INTERVAL
IS
IS NOT
IS NOT NULL
IS NULL
ISNULL
LEAST
NOT BETWEEN
NOT IN
操作符 含义
= 等于
大于
= 大于等于
< 小于
<= 小于等于
<> 和 != 不等于
<=> mysql特有的等于运算符:当两个值彼此相等或者都等于空值的时候,它返回true,否则返回false
between…and… 在一个取值范围之内
in(set) 匹配值列表中的任何一个值
like 匹配一个字符串模式
Is null 测试列值是否为空
regexp 测试列值是否满足正则表达式
= != < > <= >= <=>
范围比较:Between…and
枚举比较:in ()
模糊匹配:like
在模糊匹配中%表示通配符,不限制匹配的字符数量
_表示只匹配一个字符
where name like ‘%C%’
where name like ‘c%’
where name like ‘%c’
where name like ‘c%’
对特殊字符的转义
如果想查找实际的%和_字符,必须使用escape选项进行转义
例12:找出名字中包含一个下划线的球员
SELECT playerno, name
FROM players
WHERE name LIKE '%/%’ ESCAPE ‘/’;
**注意:**如果转义字符指定反斜杠\,必须写两个:ESCAPE ‘\ ‘.因为反斜杠\在进行模式匹配时,会被剥离一次(oracle中 写一个反斜杠即可)
如果要查询的列值中包含反斜杠,必须写3个。例如:
select * from table_name where col_name like ‘%\%‘
写成三个‘\’的原因是反斜杠会被语法分析程序剥离一次,在 进行模式匹配时,又会被剥离一次,最后会剩下一个反斜杠接受匹配
例3: 得到没有联盟会员号码的球员的编号
SELECT playerno,leagueno
FROM players
WHERE leagueno <=> NULL;
或者:
SELECT playerno,leagueno
FROM players
WHERE leagueno IS NULL;
例5: 找出1962—1964年之间出生的球员的编号、出生日期
SELECT playerno,birth_date
FROM players
WHERE birth_date BETWEEN ‘1962-01-01’ AND ‘1964-01-01‘;
测试一个列值是否在一个值列表中。值列表中可以是字面量、列或 标量子查询
例6: 得到那些出生在1962、1963或1970的球员的编号、出生年份
SELECT playerno,year(birth_date)
FROM players
WHERE year(birth_date) IN (1962,1963,1970);
例7: 对于那些有两局获胜或者两局输掉的所有比赛,得到比赛编号、获胜的局数和输掉的局数
SELECT matchno,won,lost
FROM matches
WHERE 2 IN (won, lost);
在mysql内部,in转换成or操作,not in转换成and操作
IN也可以进行成对比较
例8:对于那些比分为3比1和3比2的所有比赛,得到比赛编号、获胜局数、输掉局数
SELECT matchno, won, lost
FROM matches
WHERE (won, lost) IN ((3,1),(3,2));
MySQL特有的操作符。regexp是正则表达式(regular expression)的缩写。它比like功能更加强大
例13: 得到名字以ba开头的球员的编号和名字
SELECT playerno, name
FROM players
WHERE name REGEXP ‘^ba’;
例14: 得到名字包含了字母a、b或c的球员的编号和名字
SELECT playerno, name
FROM players
WHERE name REGEXP ‘[abc]’;
例15: 对于名字中有字母m、e、n中的一个,并且连续出现2次的球员的编号和名字
SELECT playerno,name
FROM players
WHERE name REGEXP ‘[men][men]’;