MySQL7官方文档学习笔记(入门)



要求服务器告诉您它的版本号和当前日期。
mysql> SELECT VERSION(), CURRENT_DATE;
+-----------+--------------+
| VERSION() | CURRENT_DATE |
+-----------+--------------+
| 5.7.21    | 2018-07-07   |
+-----------+--------------+
1 row in set (0.00 sec)
使用该 SHOW 语句查找服务器上当前存在的数据库: 如果您没有该SHOW DATABASES 权限,则不会显示您没有权限的数据库
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',这意味着您的用户帐户没有必要的权限。

使用 CREATE TABLE 语句指定表pet的布局:
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.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;
使用 UPDATE 语句 修复错误记录   : UPDATE变化只在讨论记录,并不需要您重新加载表。
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 意味着     缺失的未知值   ”, 并且与其他值的处理方式略有不同。
要测试 NULL ,请使用   IS NULL IS NOT 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)
你不能使用算术比较操作符,如   =   <   <> 以测试 NULL
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]* 匹配任意数量的数字,并 .* 匹配任意数量的任何数字。
  • 如果模式匹配正在测试的值中的任何位置,则正则表达式模式匹配成功。 (这与 LIKE 模式匹配 不同, 模式匹配仅在模式匹配整个值时才会成功。)
  • 锚定的图案,使得它必须在值的开头或结尾匹配正在测试中,使用 ^ 在一开始或 $ 在图案的端部。
为了演示扩展正则表达式的工作原理,LIKE先前显示 查询将在此处重写以供使用REGEXP
要查找 以...开头的名称 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)

















你可能感兴趣的:(MySQL)