Mysql学习总结
搜索数据
搜索表内的字段:
单个字段:
select 字段名 from 表名;
多个字段:
select 字段名,字段名 from 表名;
搜索多个字段时,字段名之间使用逗号隔开
所有字段:
select * from 表名;
搜索所有字段时使用 '*' 替代字段名
搜索不同的行:
select distinct 字段名 from 表名;
distinct关键字必须放在所有的字段名之前,不能放在部分的字段名之前;
限定返回结果的行数:
select 字段名 from 表名 limit 行数;
返回从开始行及以后的指定的行数:
select 字段名 from 表名 limit 开始的行数,行数;
注意:搜索出来的行数从0开始(搜索出来的第一行的序号为0)
排序搜索数据:
select 字段名 from 表名 order by 字段名; //升序
select 字段名 from 表名 order by 字段名 desc; //降序
select 字段名 from 表名 order by 字段名 asc; //升序
排序时,默认排序为升序,关键字可省略。
小技巧:如果只要最大或最小的前几个,可以同时使用limit关键字和order by关键字,使用时limit要放在order by之后;
获取指定数据:
使用where子句
select 字段名 from 表名 where 字段名和限制条件;
例:
select value from table where value=5;
select value from table where value between 0 and 5;
符号 | 说明 |
= | 等于 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
<> | 不等于 |
!= | 不等于 |
between | 在指定的两个值之间 |
运算等级 | 运算符 |
1 | ! |
2 | -(负号)、~(按位取反) |
3 | ^(按位异或) |
4 | *、/(DIV)、%(MOD) |
5 | +、- |
6 | >>、<< |
7 | & |
8 | | |
9 | =(比较运算)、<=>、<、<=、>、>=、!=、<>、IN、IS、NULL、LIKE、REGEXP |
10 | BETWEEN、AND、CASE、WHEN、THEN、ELSE |
11 | NOT |
12 | &&、AND |
13 | XOR |
14 | ||、OR |
15 | =(赋值运算)、:= |
介绍一些特有的运算符:
- NOT 逻辑非运算符,用于对条件进行取反。
- &&、AND 逻辑与运算符,用于判断多个条件是否同时成立。
- XOR 异或运算符,用于判断两个条件是否互斥,只能有一个成立。
- ||、OR 逻辑或运算符,用于判断多个条件中是否至少有一个成立。
- IN: 功能:用于判断某个值是否在一个给定的值列表中。
- IS NULL: 功能:用于判断某个字段是否为NULL。
- LIKE: 功能:用于在WHERE子句中搜索指定模式的数据。
- REGEXP: 功能:用于在WHERE子句中进行正则表达式匹配。后接正则表达式
- CASE、WHEN、THEN、ELSE是SQL中用于条件判断和返回不同值的关键字。它们通常一起使用来实现类似于编程语言中的switch或if-else的功能。
例:
9 例:
SELECT
customer_id,
CASE
WHEN age < 18 THEN 'Teenager'
WHEN age >= 18 AND age < 30 THEN 'Young Adult'
ELSE 'Adult'
END AS age_group
FROM customers;
5 例:
SELECT customer_id, customer_name
FROM customers
WHERE customer_id IN (1, 3, 5, 7);
like操作符:
使用like操作符进行匹配时不会进行直接匹配而是使用了通配符进行结合匹配。
通配符:
% | 表示任意字符,任意次数 |
_ | 表示任意字符,只能匹配一次 |
注意:通配符查询会增加数据库系统的负担,因为使用通配符会查找数据库中的每一个数据,所以应尽量少的使用通配符。在使用通配符时要注意空格。
例:
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '%anvil%';
regexp操作符:
使用regexp是根据正则表达式来匹配的。
LIKE和REGEXP的区别:
LIKE '1000’匹配整个列值,等于’1000’时才会返回相应行,而REGEXP '1000’在列值内进行匹配,如果包含’1000’则会返回相应行。
'.'表示匹配任意一个字符;
例:
select * from topic where id regexp '.999';
数据库默认是不区分大小写的如果有区分大小写的要求需要使用binary关键字。
SELECT * FROM TOPIC WHERE prod_name REGEXP BINARY 'JetPack .000';
'|'为正则表达式的OR运算符,只要匹配其中之一(可以有多个字符)就行;
例:(查找表中包含1或3的数据)
select * from topic where grade regexp '1|3';
'[]'表示匹配[]中任意一个字符,'[123]'是'[1|2|3]'的缩写。
例:(查找表中包含1,2或3的数据)
select * from topic where grade regexp '[123]';
如要反向匹配在集合前加'^',例:'[^123]' 表示只匹配不包含123中任意字符的任何数据;
'\\'表示转义字符,通常用来表示特殊字符(具有特殊意义)和引用元字符
如果要匹配‘.’需要在‘.’前增加 '\\';
例:(查找表中包含'.'的数据)
select * from topic where grade regexp '\\.';
元字符 | 说明 |
\\f | 换页 |
\\n | 换行 |
\\r | 回车 |
\\t | 制表 |
\\v | 纵向制表 |
类 | 说明 |
[:alnum:] | 任意字母和数字(同[a-zA-Z0-9]) |
[:alpha:] | 任意字符(同[a-zA-Z]) |
[:cntrl:] | 空格和制表(同[\\t]) |
[:digit:] | ASCII控制字符(ASCII)0到31和127 |
[:graph:] | 任意数字(同[0-9]) |
[:lower:] | 任意小写字母(同[a-z]) |
[:print:] | 任意可打印字符 |
[:punct:] | 既不在[:alnum:]又不在[:cntrl:]中的任意字符 |
[:space:] | 包括空格在内的任意空白字符(同[\\f \\n \\r \\t \\v]) |
[:upper:] | 任意大写字母(同[A-Z]) |
[:xdigit:] | 任意十六进制数字(同[a-fA-F0-9]) |
例:(查找表中包含数字的数据)
select * from topic where grade regexp '[[:alnum:]]';
元字符 | 说明 |
* | 0个或多个匹配 |
+ | 1个或多个匹配(等于{1,}) |
? | 0个或1个匹配(等于{0,1}) |
{n} | 指定数目的匹配 |
{n,} | 不少于指定数目的匹配 |
{n.m} | 匹配数目的范围(m不超过255) |
例:(匹配连在一起的4位数字)
select * from topic where grade regexp '[[:graph:]]{4}';
'[[:graph:]]{4}'等于'[0-9][0-9][0-9][0-9]';
元字符 | 说明 |
^ | 文本的开始 |
$ | 文本的结尾 |
[:<:] | 词的开始 |
[:>:] | 词的结尾 |
例:(查找表中以1或2开头的数据)
select * from topic where id regexp '^[12]';
计算字段
计算字段是指在查询中使用表中的现有字段进行计算得出的结果,得出的结果是根据搜索到的字段值进行计算得到的;
操作符 | 说明 |
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
例:
select id+content from topic;
得到的结果为每一个id字段和content字段相加的出来的;
拼接字段
拼接:将值联结到一起构成单个值。
可以使用concat()关键字来拼接字段(一个或多个),字段间使用逗号进行隔开。
例:
select concat(id,content) from topic;
使用别名
计算得到的值没有名字,我们可以使用as关键字给计算得到的值赋一个别名。
例:
select id+content as ad from topic;
数据处理函数
文本处理函数
函数 | 说明 |
Left() | 返回串左边的字符 |
Length() | 返回串的长度 |
Locate() | 找出串的一个子串 |
Lower() | 将串转换为小写 |
LTrim() | 去掉串左边的空格 |
Right() | 返回串右边的字符 |
RTrim() | 去掉串右边的空格 |
Soundex() | 返回串的SOUNDEX值 |
SubString() | 返回子串的字符 |
Upper() | 将串转换为大写 |
SOUNDEX是一个将任何文本转换为描述其语音表示的字母数字模式的算法,使得能对串进行发音比较而不是字母比较,MySQL提供对SOUNDEX的支持。soundex函数可以根据发音把文本转化成由数字和字母组成的代码,可以通过比较这一串代码来搜索到读音相似的文本。
例:(搜索出与John有着相似读音的文本)
select name from employees where soundex(name) = soundex('John');
例:
select trim(id) from topic;
日期和时间处理函数
函数 | 说明 |
AddDate() | 增加一个日期(天、周等) |
AddTime() | 增加一个时间(时、分等) |
CurDate() | 返回当前日期 |
CurTime() | 返回当前时间 |
Date() | 返回日期时间的日期部分 |
DateDiff() | 计算两个日期之差 |
Date_Add() | 高度灵活的日期计算函数 |
Date_Format() | 返回一个格式化的日期或时间串 |
Day() | 返回一个日期的天数部分 |
DayOfWeek() | 对于一个日期,返回对应的星期几 |
Hour() | 返回一个时间的小时部分 |
Minute() | 返回一个时间的分钟部分 |
Month() | 返回一个日期的月份部分 |
Now() | 返回当前日期和时间 |
Second() | 返回一个时间的秒部分 |
Time() | 返回一个日期时间的时间部分 |
Year() | 返回一个日期的年份部分 |
MySQL使用的日期格式
日期必须为格式yyyy-mm-dd。支持2位数字的年份,MySQL处理00-69为2000-2069,70-99为1970-1999,但使用4为数字年份更可靠,为了表达的意思清楚明白,应尽量的少用二位多用四位。
例:
select custid, ordernum from orders where orderdate='2005-09-01';
orderdate类型为datetime,样例表中的值全部具有时间值00:00:00,但是如果orderdate的值为2005-09-01 11:30:05则上面的WHERE orderdate = '2005-09-11’不会检索出这一行,因此必须使用Date()函数。
select custid, ordernum from orders where date(orderdate)='2005-09-01';
例:检索出2005年9月下的所有订单
select custid, ordernum from orders where date(orderdate) between '2005-09-01' and '2005-09-30';
数学处理函数
函数 | 说明 |
Abs() | 返回一个数的绝对值 |
Cos() | 返回一个角度的余弦 |
Exp() | 返回一个数的指数值 |
Mod() | 返回除操作的余数 |
Pi() | 返回圆周率 |
Rand() | 返回一个随机数 |
Sin() | 返回一个角度的正弦 |
Sqrt() | 返回一个数的平方根 |
Tan() | 返回一个角度的正切 |
例:
select rand() from topic;