要求服务器告诉您它的版本号和当前日期。
mysql> SELECT VERSION(), CURRENT_DATE;
+-----------+--------------+
| VERSION() | CURRENT_DATE |
+-----------+--------------+
| 5.7.21 | 2018-07-07 |
+-----------+--------------+
1 row in set (0.00 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| boot_crm |
| crm |
| music |
| mybatis |
| mysql |
| performance_schema |
| springmvc |
| sys |
| taotao |
| toutiao |
+--------------------+
11 rows in set (0.00 sec)
创建和选择数据库:
创建动物园数据库:
mysql> CREATE DATABASE menagerie;
选择数据库
:
mysql> USE menagerie
如果您收到错误,例如ERROR 1044(42000):在尝试创建数据库时,用户'micah'@'localhost'拒绝访问数据库'menagerie',这意味着您的用户帐户没有必要的权限。
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
查看有多少个表:
mysql> SHOW TABLES;
+---------------------+
| Tables_in_menagerie |
+---------------------+
| pet |
+---------------------+
1 row in set (0.00 sec)
名称,所有者,物种,性别,出生和死亡。
要验证您的表是否按预期方式创建,请使用以下
DESCRIBE
语句:(
您可以随时使用
DESCRIBE
(
叙述
)
,例如,如果您忘记了表中列的名称或它们具有的类型。
)
mysql> DESCRIBE pet;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| owner | varchar(20) | YES | | NULL | |
| species | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| birth | date | YES | | NULL | |
| death | date | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.01 sec)
您可以创建一个文本文件
pet.txt
,每行包含一个记录,其值由制表符分隔,并按照
CREATE TABLE
语句
中列出的顺序给出
。
对于缺失值(例如未知性别或仍然生活的动物的死亡日期),您可以使用
NULL
值。
要在文本文件中表示这些,请使用
\N
(反斜杠,大写-N)。
例如,惠斯勒鸟的记录看起来像这样(值之间的空格是单个制表符):
Whistler Gwen bird \N 1997-12-09 \N
要将文本文件加载pet.txt到 pet表中(
path必须用/
)
mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet;
例如
mysql> LOAD DATA LOCAL INFILE 'E:/MySQL/database/pet.txt'INTO TABLE pet;
添加一条新记录
mysql> INSERT INTO pet
-> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
从表中检索信息:
该SELECT语句用于从表中提取信息。声明的一般形式是:
SELECT what_to_select 表示你想看到什么。
FROM which_table 表示要从中检索数据的表。
WHERE conditions_to_satisfy; 指定行必须满足的一个或多个条件才有资格进行检索。
最简单的形式SELECT 从表中检索所有内容:
mysql> SELECT * FROM pet;
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+-------+---------+------+------------+-------+
1 row in set (0.00 sec)
清空表
mysql> DELETE FROM pet;
mysql> UPDATE pet SET birth = '1989-08-31' WHERE name = 'Bowser';
简单的SELECT操作:(
字符串比较通常不区分大小写
)
mysql> SELECT * FROM pet WHERE name = 'Bowser';
+--------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+
1 row in set (0.00 sec)
mysql>SELECT * FROM pet WHERE birth >= '1998-1-1';
mysql> SELECT * FROM pet WHERE species = 'snake' OR species = 'bird';
mysql> SELECT * FROM pet WHERE species = 'dog' AND sex = 'f'; //AND 逻辑运算符
mysql> SELECT * FROM pet WHERE (species = 'cat' AND sex = 'm')
-> OR (species = 'dog' AND sex = 'f'); //AND, OR可以混合,但 AND优先级高于 OR。
mysql> SELECT name, birth FROM pet;
+----------+------------+
| name | birth |
+----------+------------+
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Buffy | 1989-05-13 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
+----------+------------+
8 rows in set (0.00 sec)
其他测试:
mysql> SELECT owner FROM pet;
DISTINCT:输出不同
mysql> SELECT DISTINCT owner FROM pet;
+--------+
| owner |
+--------+
| Harold |
| Gwen |
| Benny |
| Diane |
+--------+
4 rows in set (0.00 sec)
mysql> SELECT owner FROM pet;
+--------+
| owner |
+--------+
| Harold |
| Gwen |
| Harold |
| Benny |
| Diane |
| Gwen |
| Gwen |
| Benny |
+--------+
8 rows in set (0.00 sec)
仅获取狗和猫的出生日期
mysql> SELECT name, species, birth FROM pet
-> WHERE species = 'dog' OR species = 'cat';
+--------+---------+------------+
| name | species | birth |
+--------+---------+------------+
| Fluffy | cat | 1993-02-04 |
| Claws | cat | 1994-03-17 |
| Buffy | dog | 1989-05-13 |
| Fang | dog | 1990-08-27 |
| Bowser | dog | 1989-08-31 |
+--------+---------+------------+
5 rows in set (0.00 sec)
排序行
对结果进行排序,请使用
ORDER BY
子句。
动物的生日,按日期排序(
默认排序顺序为升序
)
mysql> SELECT name, birth FROM pet ORDER BY birth;
+----------+------------+
| name | birth |
+----------+------------+
| Buffy | 1989-05-13 |
| Bowser | 1989-08-31 |
| Fang | 1990-08-27 |
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Slim | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy | 1998-09-11 |
+----------+------------+
8 rows in set (0.00 sec)
按反向(降序)顺序排序, 将DESC关键字添加到要排序 的列的名称
mysql> SELECT name, birth FROM pet ORDER BY birth DESC;
+----------+------------+
| name | birth |
+----------+------------+
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Claws | 1994-03-17 |
| Fluffy | 1993-02-04 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Buffy | 1989-05-13 |
+----------+------------+
//降序
mysql> SELECT name, birth, CURDATE(), TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
-> FROM pet ORDER BY name DESC;
日期计算:
MySQL提供了几个可用于执行日期计算的函数。
要确定每只宠物的年龄,请使用此
TIMESTAMPDIFF()
功能。
它的参数是你想要表达结果的单位,以及取得差异的两个日期。
以下查询显示每只宠物的出生日期,当前日期和年龄。
一个
别名
(
age
)是用来制造最终输出列标签更有意义。
mysql> SELECT name, birth, CURDATE(), TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age FROM pet;
+----------+------------+------------+------+
| name | birth | CURDATE() | age |
+----------+------------+------------+------+
| Fluffy | 1993-02-04 | 2018-07-08 | 25 |
| Claws | 1994-03-17 | 2018-07-08 | 24 |
| Buffy | 1989-05-13 | 2018-07-08 | 29 |
| Fang | 1990-08-27 | 2018-07-08 | 27 |
| Bowser | 1989-08-31 | 2018-07-08 | 28 |
| Chirpy | 1998-09-11 | 2018-07-08 | 19 |
| Whistler | 1997-12-09 | 2018-07-08 | 20 |
| Slim | 1996-04-29 | 2018-07-08 | 22 |
+----------+------------+------------+------+
8 rows in set (0.01 sec)
通过添加一个
ORDER BY name
子句来按名称对输出进行排序
来完成
:
mysql> SELECT name, birth, CURDATE(), TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
-> FROM pet ORDER BY name;
+----------+------------+------------+------+
| name | birth | CURDATE() | age |
+----------+------------+------------+------+
| Bowser | 1989-08-31 | 2018-07-08 | 28 |
| Buffy | 1989-05-13 | 2018-07-08 | 29 |
| Chirpy | 1998-09-11 | 2018-07-08 | 19 |
| Claws | 1994-03-17 | 2018-07-08 | 24 |
| Fang | 1990-08-27 | 2018-07-08 | 27 |
| Fluffy | 1993-02-04 | 2018-07-08 | 25 |
| Slim | 1996-04-29 | 2018-07-08 | 22 |
| Whistler | 1997-12-09 | 2018-07-08 | 20 |
+----------+------------+------------+------+
8 rows in set (0.00 sec)
要通过age而不是 对输出进行排序name,只需使用不同的ORDER BY子句:
mysql> SELECT name, birth, CURDATE(), TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
-> FROM pet ORDER BY age;
+----------+------------+------------+------+
| name | birth | CURDATE() | age |
+----------+------------+------------+------+
| Chirpy | 1998-09-11 | 2018-07-08 | 19 |
| Whistler | 1997-12-09 | 2018-07-08 | 20 |
| Slim | 1996-04-29 | 2018-07-08 | 22 |
| Claws | 1994-03-17 | 2018-07-08 | 24 |
| Fluffy | 1993-02-04 | 2018-07-08 | 25 |
| Fang | 1990-08-27 | 2018-07-08 | 27 |
| Bowser | 1989-08-31 | 2018-07-08 | 28 |
| Buffy | 1989-05-13 | 2018-07-08 | 29 |
+----------+------------+------------+------+
8 rows in set (0.00 sec)
类似的查询可用于确定死亡动物的死亡年龄。
您可以通过检查
death
值
是否确定这些动物
NULL(IS NOT NULL)
。
然后,对于那些具有非
NULL
值的人,计算
death
和
birth
值
之间的差异
:
mysql> SELECT name, birth, death,TIMESTAMPDIFF(YEAR,birth,death) AS age
-> FROM pet WHERE death IS NOT NULL ORDER BY age;
+--------+------------+------------+------+
| name | birth | death | age |
+--------+------------+------------+------+
| Bowser | 1989-08-31 | 1995-07-29 | 5 |
+--------+------------+------------+------+
1 row in set (0.00 sec)
如果你想知道哪些动物下个月有生日怎么办?
对于这种类型的计算,年和日是无关紧要的;
您只想提取
birth
列
的月份部分
。
MySQL提供了用于提取日期的部分,如一些功能
YEAR()
,
MONTH()
和
DAYOFMONTH()
。
MONTH()
这是适当的功能。
看看它是如何工作的,运行,显示两者的价值一个简单的查询
birth
和
MONTH(birth)
:
mysql> SELECT name, birth, MONTH(birth) FROM pet;
+----------+------------+--------------+
| name | birth | MONTH(birth) |
+----------+------------+--------------+
| Fluffy | 1993-02-04 | 2 |
| Claws | 1994-03-17 | 3 |
| Buffy | 1989-05-13 | 5 |
| Fang | 1990-08-27 | 8 |
| Bowser | 1989-08-31 | 8 |
| Chirpy | 1998-09-11 | 9 |
| Whistler | 1997-12-09 | 12 |
| Slim | 1996-04-29 | 4 |
+----------+------------+--------------+
8 rows in set (0.00 sec)
找到5月(月
5
)
出生的动物
mysql> SELECT name, birth FROM pet WHERE MONTH(birth)=5;
+-------+------------+
| name | birth |
+-------+------------+
| Buffy | 1989-05-13 |
+-------+------------+
1 row in set (0.00 sec)
如果当前月份是12月,则会出现一个小的复杂情况。
你不能只在月份数字(
12
)中
添加一个
并查找月份出生的动物
13
,因为没有这样的月份。
相反,你寻找1月(月
1
)
出生的动物
。
您可以编写查询,以便无论当前月份是什么,它都可以工作,因此您不必使用特定月份的数字。
DATE_ADD()
使您可以将时间间隔添加到给定日期。
如果您将值添加一个月
CURDATE()
,然后
使用
,则提取月份部分
MONTH()
,结果将生成查找生日的月份:
mysql> SELECT name, birth FROM pet
-> WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));
+--------+------------+
| name | birth |
+--------+------------+
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
+--------+------------+
2 rows in set (0.00 sec
完成相同任务的另一种方法是
1
在使用modulo函数(
MOD
)将月值包装
0
为当前
值
之后
,添加
以获取当前后一个月之后
的下个月
12
:
mysql> SELECT name, birth FROM pet
-> WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;
+--------+------------+
| name | birth |
+--------+------------+
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
+--------+------------+
2 rows in set (0.00 sec)
MONTH()
返回
1
和
之间的数字
12
。
并
MOD(something,12)
在
0
和
之间返回一个数字
11
。
所以添加必须在之后
MOD()
,否则我们将从11月(
11
)到1月(
1
)。
使用NULL值
在
NULL
您习惯它之前,
这个
值可能会令人惊讶。
从概念上讲,
NULL
意味着
“
缺失的未知值
”,
并且与其他值的处理方式略有不同。
mysql> SELECT 1 IS NULL,1 IS NOT NULL ;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
| 0 | 1 |
+-----------+---------------+
1 row in set (0.00 sec)
mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
| NULL | NULL | NULL | NULL |
+----------+-----------+----------+----------+
1 row in set (0.00 sec)
在MySQL中,
0
或
NULL
意味着假,其他任何意味着真。
布尔运算的默认真值是
1
。
模式匹配:
SQL模式匹配使您可以使用
_
匹配任何单个字符并
%
匹配任意数量的字符(包括零个字符)。
在MySQL中,SQL模式默认情况下不区分大小写。
这里显示了一些例子。
不要使用
=
或
<>
使用SQL模式时。
请改用
LIKE
或
NOT LIKE
比较运算符。
要查找以下开头的名称
b
:
mysql> SELECT * FROM pet WHERE name LIKE 'b%';
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
2 rows in set (0.00 sec)
要查找以以下结尾的名称
fy
:
mysql> SELECT * FROM pet WHERE name LIKE '%fy';
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+
2 rows in set (0.00 sec)
要查找包含名称
w
:
mysql> SELECT * FROM pet WHERE name LIKE '%w%';
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+
3 rows in set (0.00 sec)
要查找包含五个字符的名称,请使用
_
模式字符的
五个实例
:
mysql> SELECT * FROM pet WHERE name LIKE '_____';
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
2 rows in set (0.00 sec)
请注意,对于LIKE,可以使用反斜杠来转义&和_
MySQL提供的另一种模式匹配使用扩展的正则表达式。
当您为这种类型的模式测试匹配时,请使用
REGEXP
和
NOT REGEXP
运算符(或
RLIKE
和
NOT RLIKE
,它们是同义词)。
以下列表描述了扩展正则表达式的一些特征:
-
. 匹配任何单个字符。
-
字符类 [...] 匹配括号内的任何字符。 例如, [abc] 匹配 a , b 或 c 。 要命名一系列字符,请使用短划线。 [a-z] 匹配任何字母,而 [0-9] 匹配任何数字。
-
* 匹配前面的事物的零个或多个实例。 例如, x* 匹配任意数量的 x 字符, [0-9]* 匹配任意数量的数字,并 .* 匹配任意数量的任何数字。
-
锚定的图案,使得它必须在值的开头或结尾匹配正在测试中,使用 ^ 在一开始或 $ 在图案的端部。
要查找
以...开头的名称
b
,请使用
^
以匹配名称的开头:
mysql> SELECT * FROM pet WHERE name REGEXP '^b';
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
2 rows in set (0.00 sec)
要强制
REGEXP
比较区分大小写,请使用
BINARY 关键字
使其中一个字符串成为二进制字符串。
此查询仅匹配b名称开头的小写:
SELECT * FROM pet WHERE name REGEXP BINARY '^b';
要查找以?结尾的名称fy,请使用 $以匹配名称的结尾:
mysql> SELECT * FROM pet WHERE name REGEXP 'fy$';
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+
2 rows in set (0.00 sec)
要查找包含a的名称
w
,请使用以下查询:
mysql> SELECT * FROM pet WHERE name REGEXP 'w';
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+
3 rows in set (0.00 sec)
要查找包含五个字符的名称,请使用
^
和
$
匹配名称的开头和结尾,以及
.
中间的
五个实例
:
mysql> SELECT * FROM pet WHERE name REGEXP '^.....$';
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
2 rows in set (0.00 sec)
您还可以使用
(
“
repeat-
-times
”
)运算符
编写上一个查询
:
{
n
}
n
mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$';
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
2 rows in set (0.00 sec)