MySQL必知必会1

2020-03-08  本文已影响0人  远方的橄榄树

1、MySQL使用

D:\MySQL\bin>mysql -u root -p
Enter password: ******
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
mysql> use test;
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user           |
+----------------+
mysql> SHOW COLUMNS FROM user;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | NO   |     | NULL    |                |
| age   | int(11)      | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

2、检索数据

mysql> SELECT name FROM user;
+--------+
| name   |
+--------+
| 小明   |
| 小红   |
| 小李   |
+--------+

注意
1、未排序数据 如果读者自己试验这个查询,可能会发现显示输
出的数据顺序与这里的不同。出现这种情况很正常。如果没有
明确排序查询结果(下一章介绍),则返回的数据的顺序没有特殊意义。
2、SQL语句和大小写 请注意,SQL语句不区分大小写,因此
SELECT 与 select 是相同的。习惯对所有SQL关键字使用大写,而对所有
列和表名使用小写。
3、结束SQL语句 多条SQL语句必须以分号(;)分隔。

mysql> SELECT name, age FROM user;
+--------+------+
| name   | age  |
+--------+------+
| 小明   |   12 |
| 小红   |   16 |
| 小李   |   18 |
+--------+------+
mysql> SELECT * FROM user;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 小明   |   12 |
|  2 | 小红   |   16 |
|  3 | 小李   |   18 |
+----+--------+------+
mysql> SELECT age FROM user;
+------+
| age  |
+------+
|   12 |
|   16 |
|   18 |
|   18 |
|   16 |
+------+

mysql> SELECT DISTINCT age FROM user;
+------+
| age  |
+------+
|   12 |
|   16 |
|   18 |
+------+

SELECT * FROM user LIMIT 3表示只获取前面3条。
SELECT * FROM user LIMIT 2, 2表示返回从第2行开始的2条数据。
LIMIT 2 OFFSET 2效果与LIMIT 2, 2一样。

mysql> SELECT * FROM user LIMIT 3;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 小明   |   12 |
|  2 | 小红   |   16 |
|  3 | 小李   |   18 |
+----+--------+------+

mysql> SELECT * FROM user LIMIT 2, 2;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
+----+--------+------+

mysql> SELECT * FROM user LIMIT 2 OFFSET 2;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
+----+--------+------+

注意
1、行 0 检索出来的第一行为行0而不是行1。因此, LIMIT 1, 1
将检索出第二行而不是第一行。
2、在行数不够时 LIMIT 中指定要检索的行数为检索的最大行
数。如果没有足够的行(例如,给出 LIMIT 10, 5 ,但只有13行),MySQL将只返回它能返回的那么多行。

这条语句在功能上等于SELECT name FROM user。(假定都在test数据库中调用)

mysql> SELECT user.name FROM test.user;
+--------+
| name   |
+--------+
| 小明   |
| 小红   |
| 小李   |
| 小南   |
| 小狼   |
+--------+

排序检索数据

根据年龄从小到大排序

mysql> SELECT * FROM user ORDER BY age;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 小明   |   12 |
|  2 | 小红   |   16 |
|  5 | 小狼   |   16 |
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
+----+--------+------+

先根据年龄排序,再根据名称排序

mysql> SELECT * FROM user ORDER BY age, name;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 小明   |   12 |
|  5 | 小狼   |   16 |
|  2 | 小红   |   16 |
|  4 | 小南   |   18 |
|  3 | 小李   |   18 |
+----+--------+------+
mysql> SELECT * FROM user ORDER BY age DESC;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
|  2 | 小红   |   16 |
|  5 | 小狼   |   16 |
|  1 | 小明   |   12 |
+----+--------+------+

过 滤 数 据

检索所需数据需要指定搜索条件,根据 WHERE 子句中指定的搜索条件能够对数据进行过滤。

mysql> SELECT * FROM user WHERE age = 18;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
+----+--------+------+
操 作 符 说 明
= 等于
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
BETWEEN 在指定的两个值之间
mysql> SELECT * FROM user WHERE name = '小李';
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  3 | 小李   |   18 |
+----+--------+------+

mysql> SELECT * FROM user WHERE age > 16;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
+----+--------+------+
SELECT * FROM user WHERE age != 16;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 小明   |   12 |
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
+----+--------+------+
mysql> 
SELECT * FROM user WHERE age BETWEEN 14 AND 18;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  2 | 小红   |   16 |
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
|  5 | 小狼   |   16 |
+----+--------+------+
mysql> SELECT * FROM user WHERE age IS NULL;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  6 | 空我   | NULL |
+----+--------+------+

注意:
1、在创建表时,表设计人员可以指定其中的列是否可以不包含值。在
一个列不包含值时,称其为包含空值 NULL 。
2、NULL 无值(no value),它与字段包含 0 、空字符串或仅仅包含
空格不同。
3、NULL 与不匹配 在通过过滤选择出不具有特定值的行时,你
可能希望返回具有 NULL 值的行。但是,不行。因为未知具有
特殊的含义,数据库不知道它们是否匹配,所以在匹配过滤或不匹配过滤时不返回它们。

逻辑操作符(logical operator),用来联结或改变 WHERE 子句中的子句的关键
字。
1、AND操作符
筛选出年龄大于16并且姓名不等于"小南"的数据

mysql> SELECT * FROM user WHERE age > 16 AND name != '小南';
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  3 | 小李   |   18 |
|  7 | 大飞   |   23 |
+----+--------+------+

2、OR操作符
筛选出年龄等于16或18的数据

mysql> SELECT * FROM user WHERE age = 16 or age = 18;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  2 | 小红   |   16 |
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
|  5 | 小狼   |   16 |
|  9 | 杰瑞   |   16 |
+----+--------+------+

计算次序
AND操作符的优先级高于OR,使用圆括号明确地分组相应的操作符。

mysql> SELECT * FROM user WHERE age = 16 or age = 18 AND age > 16;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  2 | 小红   |   16 |
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
|  5 | 小狼   |   16 |
|  9 | 杰瑞   |   16 |
+----+--------+------+

mysql> SELECT * FROM user WHERE (age = 16 or age = 18) AND age > 16;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
+----+--------+------+

3、IN 操作符
下面语句等同于SELECT * FROM user WHERE age = 18 OR age = 30

mysql> SELECT * FROM user WHERE age in (18, 30) ;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  3 | 小李   |   18 |
|  4 | 小南   |   18 |
+----+--------+------+

4、NOT 操作符

mysql> SELECT * FROM user WHERE age NOT IN (18, 16);
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 小明   |   12 |
|  7 | 大飞   |   23 |
|  8 | 杰克   |   15 |
+----+--------+------+

用通配符进行过滤

LIKE 操作符

通配符(wildcard) 用来匹配值的一部分的特殊字符。

1、百分号( % )通配符

mysql> SELECT * FROM user WHERE name LIKE 'to%';
+----+------+------+
| id | name | age  |
+----+------+------+
| 10 | tom  |   22 |
| 12 | tony |   31 |
+----+------+------+

mysql> SELECT * FROM user WHERE name LIKE '%uc%';
+----+------+------+
| id | name | age  |
+----+------+------+
| 11 | duck |   13 |
| 13 | puck |   11 |
+----+------+------+

** 注意NULL** 虽然似乎 % 通配符可以匹配任何东西,但有一个例外,即 NULL 。

下划线_通配符

另一个有用的通配符是下划线_。下划线的用途与 % 一样,但下划
线只匹配单个字符而不是多个字符。

mysql> SELECT * FROM user WHERE name LIKE 'to__';
+----+------+------+
| id | name | age  |
+----+------+------+
| 12 | tony |   31 |
+----+------+------+

mysql> SELECT * FROM user WHERE name LIKE 'to_';
+----+------+------+
| id | name | age  |
+----+------+------+
| 10 | tom  |   22 |
+----+------+------+

用正则表达式进行搜索

.) 是正则表达式语言中一个特殊的字符。它表示匹配任意一个字符。

mysql>  SELECT * FROM user WHERE name REGEXP 'duc';
+----+------+------+
| id | name | age  |
+----+------+------+
| 11 | duck |   13 |
+----+------+------+

mysql> SELECT * FROM user WHERE name REGEXP '.uc';
+----+------+------+
| id | name | age  |
+----+------+------+
| 11 | duck |   13 |
| 13 | puck |   11 |
+----+------+------+
mysql> SELECT * FROM user WHERE name REGEXP 'duc|puc';
+----+------+------+
| id | name | age  |
+----+------+------+
| 11 | duck |   13 |
| 13 | puck |   11 |
+----+------+------+
mysql> SELECT * FROM user WHERE name REGEXP '[p|o]ple';
+----+--------+------+
| id | name   | age  |
+----+--------+------+
| 14 | apple  |   31 |
| 15 | people |   12 |
+----+--------+------+

mysql> SELECT * FROM user WHERE name REGEXP '[po]ple';
+----+--------+------+
| id | name   | age  |
+----+--------+------+
| 14 | apple  |   31 |
| 15 | people |   12 |
+----+--------+------+

[] 是另一种形式的 OR 语句。事实上,正则表达式 [po]ple[p|o]ple的缩写,也可以使用后者。

集合可用来定义要匹配的一个或多个字符。例如,下面的集合将匹配数字0到9:[0123456789]。为简化这种类型的集合,可使用 - 来定义一个范围。[0-9]上等同于上述数字列表。
此外,范围不一定只是数值的, [a-z] 匹配任意字母字符。

mysql> SELECT * FROM user WHERE name REGEXP '路人[A-Z]';
+----+---------+------+
| id | name    | age  |
+----+---------+------+
| 16 | 路人A   |   42 |
| 17 | 路人B   |   42 |
| 18 | 路人C   |   42 |
+----+---------+------+

匹配特殊字符

\\为转义字符。如.表示匹配任意一个字符。若想匹配.本身,则需要转移字符,即\\.表示匹配.。正则表达式内具有特殊意义的所有字符都必须以这种方式转义。

匹配\ 为了匹配反斜杠(\)字符本身,需要使用 \\\

说明
[:alnum:] 任意字母和数字(同[a-zA-Z0-9])
[:alpha:] 任意字符(同[a-zA-Z])
[:blank:] 空格和制表(同[\t])
[:digit:] 任意数字(同[0-9])
[:lower:] 任意小写字母(同[a-z])
[:upper:] 任意大写字母(同[A-Z])
[:space:] 包括空格在内的任意空白字符(同[\f\n\r\t\v])
元字符 说明
* 0个或多个匹配
+ 1个或多个匹配(等于{1,})
? 0个或1个匹配(等于{0,1}
{n} 指定数目的匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围(m不超过255)
mysql> SELECT * FROM user WHERE name REGEXP '数字[0-9]{5}';
+----+-------------+------+
| id | name        | age  |
+----+-------------+------+
| 19 | 数字12133   |   12 |
+----+-------------+------+

mysql> SELECT * FROM user WHERE name REGEXP '数字[:digit:]*';
+----+-------------+------+
| id | name        | age  |
+----+-------------+------+
| 19 | 数字12133   |   12 |
| 20 | 数字422     |   12 |
+----+-------------+------+
元字符 说明
^ 文本的开始
$ 文本的结尾
mysql> SELECT * FROM user WHERE name REGEXP '[0-9]+';
+----+-------------+------+
| id | name        | age  |
+----+-------------+------+
| 19 | 数字12133   |   12 |
| 20 | 数字422     |   12 |
| 21 | 13131       |   31 |
| 22 | 3636ABC     |   32 |
+----+-------------+------+

mysql> SELECT * FROM user WHERE name REGEXP '^[0-9]+$';
+----+-------+------+
| id | name  | age  |
+----+-------+------+
| 21 | 13131 |   31 |
+----+-------+------+

^ 的双重用途 ^ 有两种用法。在集合中(用 [ 和 ] 定义),用它来否定该集合,否则,用来指串的开始处。

上一篇 下一篇

猜你喜欢

热点阅读