1、MySQL使用
-
启动:
net start mysql
(windows版) -
登录:
mysql -u root -p
D:\MySQL\bin>mysql -u root -p
Enter password: ******
-
查看数据库列表:
SHOW DATABASES
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
-
使用数据库:
USE test
mysql> use test;
Database changed
-
获取一个数据库内的表的列表:
SHOW TABLES
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user |
+----------------+
-
获取一个表内每个字段的信息:
SHOW COLUMNS FROM 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、检索数据
-
检索单个列
SELECT name FROM user
mysql> SELECT name FROM user;
+--------+
| name |
+--------+
| 小明 |
| 小红 |
| 小李 |
+--------+
注意
1、未排序数据 如果读者自己试验这个查询,可能会发现显示输
出的数据顺序与这里的不同。出现这种情况很正常。如果没有
明确排序查询结果(下一章介绍),则返回的数据的顺序没有特殊意义。
2、SQL语句和大小写 请注意,SQL语句不区分大小写,因此
SELECT 与 select 是相同的。习惯对所有SQL关键字使用大写,而对所有
列和表名使用小写。
3、结束SQL语句 多条SQL语句必须以分号(;)分隔。
-
检索多个列:
SELECT name, age FROM user
mysql> SELECT name, age FROM user;
+--------+------+
| name | age |
+--------+------+
| 小明 | 12 |
| 小红 | 16 |
| 小李 | 18 |
+--------+------+
-
检索所有列:
SELECT * FROM user
mysql> SELECT * FROM user;
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | 小明 | 12 |
| 2 | 小红 | 16 |
| 3 | 小李 | 18 |
+----+--------+------+
-
检索不同的行:使用
DISTINCT
关键字,此关键字指示MySQL只返回不同的值。
mysql> SELECT age FROM user;
+------+
| age |
+------+
| 12 |
| 16 |
| 18 |
| 18 |
| 16 |
+------+
mysql> SELECT DISTINCT age FROM user;
+------+
| age |
+------+
| 12 |
| 16 |
| 18 |
+------+
-
限制结果:使用
LIMIT
关键字
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 |
+--------+
| 小明 |
| 小红 |
| 小李 |
| 小南 |
| 小狼 |
+--------+
排序检索数据
-
排序数据:
SELECT * FROM user ORDER BY age
根据年龄从小到大排序
mysql> SELECT * FROM user ORDER BY age;
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | 小明 | 12 |
| 2 | 小红 | 16 |
| 5 | 小狼 | 16 |
| 3 | 小李 | 18 |
| 4 | 小南 | 18 |
+----+--------+------+
-
按多个列排序:
SELECT * FROM user ORDER BY age, name
先根据年龄排序,再根据名称排序
mysql> SELECT * FROM user ORDER BY age, name;
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | 小明 | 12 |
| 5 | 小狼 | 16 |
| 2 | 小红 | 16 |
| 4 | 小南 | 18 |
| 3 | 小李 | 18 |
+----+--------+------+
-
倒序:
DESC
关键字
mysql> SELECT * FROM user ORDER BY age DESC;
+----+--------+------+
| id | name | age |
+----+--------+------+
| 3 | 小李 | 18 |
| 4 | 小南 | 18 |
| 2 | 小红 | 16 |
| 5 | 小狼 | 16 |
| 1 | 小明 | 12 |
+----+--------+------+
过 滤 数 据
-
使用where子句
检索所需数据需要指定搜索条件,根据 WHERE 子句中指定的搜索条件能够对数据进行过滤。
mysql> SELECT * FROM user WHERE age = 18;
+----+--------+------+
| id | name | age |
+----+--------+------+
| 3 | 小李 | 18 |
| 4 | 小南 | 18 |
+----+--------+------+
-
WHERE子句操作符
操 作 符 | 说 明 |
---|---|
= | 等于 |
!= | 不等于 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
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 值的行。但是,不行。因为未知具有
特殊的含义,数据库不知道它们是否匹配,所以在匹配过滤或不匹配过滤时不返回它们。
-
组合 WHERE 子句
逻辑操作符(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、百分号( % )通配符
- 最常使用的通配符是百分号( % )。% 表示任何字符出现任意次数(包括0次)。
-
SELECT * FROM user WHERE name LIKE 'to%'
。此例子使用了搜索模式'to%'
。在执行这条子句时,将检索任意以to
起头的词。 % 告诉MySQL接受to
之后的任意字符,不管它有多少字符。 - 搜索模式
'%uc%'
表示匹配任何位置包含文本uc
的值,而不论它之前或之后出现什么字符。
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 |
+----+------+------+
-
进行OR匹配
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 |
+----+-------+------+
^ 的双重用途 ^ 有两种用法。在集合中(用 [ 和 ] 定义),用它来否定该集合,否则,用来指串的开始处。
网友评论