学习MySQL

  • 显示数据表的属性,属性类型,主键信息,是否为NULL,默认值等其他信息
mysql> show columns from runoob_tbl;
+-----------------+------------------+------+-----+---------+----------------+
| Field           | Type             | Null | Key | Default | Extra          |
+-----------------+------------------+------+-----+---------+----------------+
| runoob_id       | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| runoob_title    | varchar(100)     | NO   |     | NULL    |                |
| runoob_author   | varchar(40)      | NO   |     | NULL    |                |
| submission_date | date             | YES  |     | NULL    |                |
+-----------------+------------------+------+-----+---------+----------------+
  • 显示数据表的详细索引信息,包括PRIMARY KEY(主键)
mysql> show index from runoob_tbl;
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table      | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| runoob_tbl |          0 | PRIMARY  |            1 | runoob_id   | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
  • 该命令将输出MySQL数据库管理系统的性能及统计信息
mysql> show table status from zyt_test;   #显示数据库zyt_test中所有表的信息
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Name       | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| runoob_tbl | InnoDB |      10 | Dynamic    |    0 |              0 |       16384 |               0 |            0 |         0 |              2 | 2022-04-07 10:04:09 | NULL        | NULL       | utf8_general_ci |     NULL |                |         |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
mysql> show table status from zyt_test like 'runoob%';   #表明以runoob开头的表的信息
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Name       | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| runoob_tbl | InnoDB |      10 | Dynamic    |    0 |              0 |       16384 |               0 |            0 |         0 |              2 | 2022-04-07 10:04:09 | NULL        | NULL       | utf8_general_ci |     NULL |                |         |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
mysql> show table status from zyt_test like 'runoob%'\G;   #加上\G查询结果按列打印
*************************** 1. row ***************************
           Name: runoob_tbl
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 0
 Avg_row_length: 0
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: 2
    Create_time: 2022-04-07 10:04:09
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 

 

创建数据表

mysql> create table if not exists `runoob_tbl`(
    -> `runoob_id` int unsigned auto_increment,
    -> `runoob_title` varchar(100) not null,
    -> `runoob_author` varchar(40) not null,
    -> `submission_date` DATE,
    -> PRIMARY KEY (`runoob_id`)
    -> ) ENGINE=InnoDB DEFAULT charset=utf8;


实例解析:

如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
ENGINE 设置存储引擎,CHARSET 设置编码。

 插入数据表

mysql> insert into runoob_tbl 
    -> (runoob_title,runoob_author,submission_date)
    -> values
    -> ("学习PHP","菜鸟教程",NOW());
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> insert into runoob_tbl
    -> (runoob_title,runoob_author,submission_date)
    -> values
    -> ("学习Mysql","菜鸟教程",NOW());
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> insert into runoob_tbl
    -> (runoob_title,runoob_author,submission_date)
    -> values
    -> ("JAVA教程","RUNOOB.COM",'2022-04-25');
Query OK, 1 row affected (0.01 sec)


注意: 使用箭头标记 -> 不是 SQL 语句的一部分,它仅仅表示一个新行,如果一条SQL语句太长,我们可以通过回车键来创建一个新行来编写 SQL 语句,SQL 语句的命令结束符为分号 ;。

在以上实例中,我们并没有提供 runoob_id 的数据,因为该字段我们在创建表的时候已经设置它为 AUTO_INCREMENT(自动增加) 属性。 所以,该字段会自动递增而不需要我们去设置。实例中 NOW() 是一个 MySQL 函数,该函数返回日期和时间。

查询数据

mysql> select * from runoob_tbl;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         1 | 学习PHP      | 菜鸟教程      | 2022-04-25      |
|         2 | 学习Mysql    | 菜鸟教程      | 2022-04-25      |
|         3 | JAVA教程     | RUNOOB.COM    | 2022-04-25      |
+-----------+--------------+---------------+-----------------+

where子句

语法

以下是 SQL SELECT 语句使用 WHERE 子句从数据表中读取数据的通用语法:

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
  • 查询语句中你可以使用一个或者多个表,表之间使用逗号, 分割,并使用WHERE语句来设定查询条件。
  • 你可以在 WHERE 子句中指定任何条件。
  • 你可以使用 AND 或者 OR 指定一个或多个条件。
  • WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。
  • WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。

以下为操作符列表,可用于 WHERE 子句中。

下表中实例假定 A 为 10, B 为 20

操作符描述实例
= 等号,检测两个值是否相等,如果相等返回true (A = B) 返回false。
<>, != 不等于,检测两个值是否相等,如果不相等返回true (A != B) 返回 true。
> 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true (A > B) 返回false。
< 小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true (A < B) 返回 true。
>= 大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true (A >= B) 返回false。
<= 小于等于号,检测左边的值是否小于或等于右边的值, 如果左边的值小于或等于右边的值返回true (A <= B) 返回 true。

如果我们想在 MySQL 数据表中读取指定的数据,WHERE 子句是非常有用的。

使用主键来作为 WHERE 子句的条件查询是非常快速的。

如果给定的条件在表中没有任何匹配的记录,那么查询不会返回任何数据。

mysql> select * from runoob_tbl where runoob_author='菜鸟教程';
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         1 | 学习PHP      | 菜鸟教程      | 2022-04-25      |
|         2 | 学习Mysql    | 菜鸟教程      | 2022-04-25      |
+-----------+--------------+---------------+-----------------+
BINARY关键字
实例中使用了 BINARY 关键字,是区分大小写的,所以 runoob_author='runoob.com' 的查询条件是没有数据的。

mysql> select * from runoob_tbl where binary runoob_author='runoob.com';
Empty set (0.01 sec)

mysql> select * from runoob_tbl where binary runoob_author='RUNOOB.COM';
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         3 | JAVA教程     | RUNOOB.COM    | 2022-04-25      |
|         4 | 学习Python   | RUNOOB.COM    | 2022-04-25      |
+-----------+--------------+---------------+-----------------+

更新数据

UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
mysql> update runoob_tbl set runoob_title='学习JAVA',submission_date='2022-04-25' where runoob_id=3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from runoob_tbl where runoob_id=3;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         3 | 学习JAVA     | RUNOOB.COM    | 2022-04-25      |
+-----------+--------------+---------------+-----------------+

删除数据

DELETE FROM table_name [WHERE Clause]
mysql> delete from runoob_tbl where runoob_id=3;

模糊查询

语法

以下是 SQL SELECT 语句使用 LIKE 子句从数据表中读取数据的通用语法:

SELECT field1, field2,...fieldN 
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
  • 你可以在 WHERE 子句中指定任何条件。
  • 你可以在 WHERE 子句中使用LIKE子句。
  • 你可以使用LIKE子句代替等号 =。
  • LIKE 通常与 % 一同使用,类似于一个元字符的搜索。
  • 你可以使用 AND 或者 OR 指定一个或多个条件。
  • 你可以在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句来指定条件。
mysql> select * from runoob_tbl where runoob_author like '%COM';
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         3 | 学习JAVA     | RUNOOB.COM    | 2022-04-25      |
|         4 | 学习Python   | RUNOOB.COM    | 2022-04-25      |
+-----------+--------------+---------------+-----------------+

UNION

MySQL UNION 操作符

描述

MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。

语法

MySQL UNION 操作符语法格式:

SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];

参数

  • expression1, expression2, ... expression_n: 要检索的列。

  • tables: 要检索的数据表。

  • WHERE conditions: 可选, 检索条件。

  • DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。

  • ALL: 可选,返回所有结果集,包含重复数据。

演示数据库内容
Websites
+----+---------------+---------------------------+-------+---------+
| id | name          | url                       | alexa | country |
+----+---------------+---------------------------+-------+---------+
|  1 | 淘宝          | https://www.taobao.cm/    |    13 | CN      |
|  2 | Google        | https://www.google.cm/    |     1 | USA     |
|  3 | 菜鸟教程      | https://www.runoob.cm/    |  4689 | CN      |
|  4 | 微博          | https://www.weibo.cm/     |    20 | CN      |
|  5 | Facebook      | https://www.facebook.com/ |     3 | USA     |
|  7 | stackoverflow | http://stackoverflow.com/ |     0 | IND     |
+----+---------------+---------------------------+-------+---------+

apps
+----+------------+-------------------------+---------+
| id | app_name   | url                     | country |
+----+------------+-------------------------+---------+
|  1 | QQ APP     | https://im.qq.cm/       | CN      |
|  2 | 微博 APP   | https://www.weibo.com/  | CN      |
|  3 | 淘宝 APP   | https://www.taobao.com/ | CN      |
+----+------------+-------------------------+---------+
  • sql union

下面的 SQL 语句从 "Websites" 和 "apps" 表中选取所有不同的country(只有不同的值):
mysql> select country from Websites union select country from apps order by country; +---------+ | country | +---------+ | CN | | IND | | USA | +---------+
注释:UNION 不能用于列出两个表中所有的country。如果一些网站和APP来自同一个国家,每个国家只会列出一次。UNION 只会选取不同的值。请使用 UNION ALL 来选取重复的值!
  • sql union all

下面的 SQL 语句使用 UNION ALL 从 "Websites" 和 "apps" 表中选取所有的country(也有重复的值):
mysql> select country from Websites -> union all -> select country from apps -> order by country; +---------+ | country | +---------+ | CN | | CN | | CN | | CN | | CN | | CN | | IND | | USA | | USA | +---------+
  • 带有wehere的sql union all

下面的 SQL 语句使用 UNION ALL 从 "Websites" 和 "apps" 表中选取所有的中国(CN)的数据(也有重复的值):
mysql> select country,name from Websites where country='CN' union all select country,app_name from apps order by name;
+---------+--------------+
| country | name         |
+---------+--------------+
| CN      | QQ APP       |
| CN      | 微博         |
| CN      | 微博 APP     |
| CN      | 淘宝         |
| CN      | 淘宝 APP     |
| CN      | 菜鸟教程     |
+---------+--------------+

 

posted @ 2022-04-25 10:31  平安里  阅读(25)  评论(0)    收藏  举报