MySql学习笔记
发布日期:2021-06-30 19:38:33 浏览次数:2 分类:技术文章

本文共 17268 字,大约阅读时间需要 57 分钟。

 

MySQL 创建数据库


使用 mysqladmin 创建数据库

使用普通用户,你可能需要特定的权限来创建或者删除 MySQL 数据库。

所以我们这边使用root用户登录,root用户拥有最高权限,可以使用 mysql mysqladmin 命令来创建数据库。

实例

以下命令简单的演示了创建数据库的过程,数据名为 RUNOOB:

[root@host]# mysqladmin -u root -p create RUNOOBEnter password:******

以上命令执行成功后会创建 MySQL 数据库 RUNOOB。

MySQL 删除数据库

使用 mysqladmin 删除数据库

[root@host]# mysqladmin -u root -p drop RUNOOBEnter password:******

执行以上删除数据库命令后,会出现一个提示框,来确认是否真的删除数据库:

Dropping the database is potentially a very bad thing to do.Any data stored in the database will be destroyed.Do you really want to drop the 'RUNOOB' database [y/N] yDatabase "RUNOOB" dropped

MySQL 选择数据库

以下实例选取了数据库 RUNOOB:

[root@host]# mysql -u root -pEnter password:******mysql> use RUNOOB;Database changedmysql>

执行以上命令后,你就已经成功选择了 RUNOOB 数据库,在后续的操作中都会在 RUNOOB 数据库中执行。

注意:所有的数据库名,表名,表字段都是区分大小写的。所以你在使用SQL命令时需要输入正确的名称。

MySQL 创建数据表

root@host# mysql -u root -pEnter password:*******mysql> use RUNOOB;Database changedmysql> CREATE TABLE runoob_tbl(   -> runoob_id INT NOT NULL AUTO_INCREMENT,   -> runoob_title VARCHAR(100) NOT NULL,   -> runoob_author VARCHAR(40) NOT NULL,   -> submission_date DATE,   -> PRIMARY KEY ( runoob_id )   -> );Query OK, 0 rows affected (0.16 sec)mysql>

注意:MySQL命令终止符为分号 (;) 。

解析:

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

MySQL 删除数据表

root@host# mysql -u root -pEnter password:*******mysql> use RUNOOB;Database changedmysql> DROP TABLE runoob_tblQuery OK, 0 rows affected (0.8 sec)mysql>

MySQL 插入数据

root@host# mysql -u root -p password;Enter password:*******mysql> use RUNOOB;Database changedmysql> INSERT INTO runoob_tbl      ->(runoob_title, runoob_author, submission_date)     ->VALUES     ->("Learn PHP", "John Poul", NOW());Query OK, 1 row affected (0.01 sec)mysql> INSERT INTO runoob_tbl     ->(runoob_title, runoob_author, submission_date)     ->VALUES     ->("Learn MySQL", "Abdul S", NOW());Query OK, 1 row affected (0.01 sec)mysql> INSERT INTO runoob_tbl     ->(runoob_title, runoob_author, submission_date)     ->VALUES     ->("JAVA Tutorial", "Sanjay", '2007-05-06');Query OK, 1 row affected (0.01 sec)mysql>

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

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

MySQL 查询数据

root@host# mysql -u root -p password;Enter password:*******mysql> use RUNOOB;Database changedmysql> SELECT * from runoob_tbl +-------------+----------------+-----------------+-----------------+| runoob_id | runoob_title | runoob_author | submission_date |+-------------+----------------+-----------------+-----------------+|           1 | Learn PHP      | John Poul       | 2007-05-21      ||           2 | Learn MySQL    | Abdul S         | 2007-05-21      ||           3 | JAVA Tutorial  | Sanjay          | 2007-05-21      |+-------------+----------------+-----------------+-----------------+3 rows in set (0.01 sec)mysql>

MySQL where 子句

root@host# mysql -u root -p password;Enter password:*******mysql> use RUNOOB;Database changedmysql> SELECT * from runoob_tbl WHERE runoob_author='Sanjay';+-------------+----------------+-----------------+-----------------+| runoob_id | runoob_title | runoob_author | submission_date |+-------------+----------------+-----------------+-----------------+|           3 | JAVA Tutorial  | Sanjay          | 2007-05-21      |+-------------+----------------+-----------------+-----------------+1 rows in set (0.01 sec)mysql>

除非你使用 LIKE 来比较字符串,否则MySQL的WHERE子句的字符串比较是不区分大小写的。 你可以使用 BINARY 关键字来设定WHERE子句的字符串比较是区分大小写的。

如下实例

root@host# mysql -u root -p password;Enter password:*******mysql> use RUNOOB;Database changedmysql> SELECT * from runoob_tbl \          WHERE BINARY runoob_author='sanjay';Empty set (0.02 sec)mysql>

MySQL UPDATE 查询

root@host# mysql -u root -p password;Enter password:*******mysql> use RUNOOB;Database changedmysql> UPDATE runoob_tbl     -> SET runoob_title='Learning JAVA'     -> WHERE runoob_id=3;Query OK, 1 row affected (0.04 sec)Rows matched: 1  Changed: 1  Warnings: 0mysql>

MySQL DELETE 语句

root@host# mysql -u root -p password;Enter password:*******mysql> use RUNOOB;Database changedmysql> DELETE FROM runoob_tbl WHERE runoob_id=3;Query OK, 1 row affected (0.23 sec)mysql>

MySQL LIKE 子句

有时候我们需要获取 runoob_author 字段含有 "jay" 字符的所有记录,这时我们就需要在 WHERE 子句中使用 SQL LIKE 子句。

SQL LIKE 子句中使用百分号(%)字符来表示任意字符,类似于UNIX或正则表达式中的星号 (*)。

如果没有使用百分号(%), LIKE 子句与等号(=)的效果是一样的。

以下是我们将runoob_tbl表中获取runoob_author字段中以"jay"为结尾的的所有记录:

root@host# mysql -u root -p password;Enter password:*******mysql> use RUNOOB;Database changedmysql> SELECT * from runoob_tbl     -> WHERE runoob_author LIKE '%jay';+-------------+----------------+-----------------+-----------------+| runoob_id | runoob_title | runoob_author | submission_date |+-------------+----------------+-----------------+-----------------+|           3 | JAVA Tutorial  | Sanjay          | 2007-05-21      |+-------------+----------------+-----------------+-----------------+1 rows in set (0.01 sec)mysql>

MySQL 排序

root@host# mysql -u root -p password;Enter password:*******mysql> use RUNOOB;Database changedmysql> SELECT * from runoob_tbl ORDER BY runoob_author ASC;+-----------+---------------+---------------+-----------------+| runoob_id | runoob_title  | runoob_author | submission_date |+-----------+---------------+---------------+-----------------+|         2 | Learn MySQL   | Abdul S       | 2007-05-24      ||         1 | Learn PHP     | John Poul     | 2007-05-24      ||         3 | JAVA Tutorial | Sanjay        | 2007-05-06      |+-----------+---------------+---------------+-----------------+3 rows in set (0.00 sec)mysql> SELECT * from runoob_tbl ORDER BY runoob_author DESC;+-----------+---------------+---------------+-----------------+| runoob_id | runoob_title  | runoob_author | submission_date |+-----------+---------------+---------------+-----------------+|         3 | JAVA Tutorial | Sanjay        | 2007-05-06      ||         1 | Learn PHP     | John Poul     | 2007-05-24      ||         2 | Learn MySQL   | Abdul S       | 2007-05-24      |+-----------+---------------+---------------+-----------------+3 rows in set (0.00 sec)mysql>

MySQL GROUP BY 语句

SET NAMES utf8;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------  Table structure for `employee_tbl`-- ----------------------------DROP TABLE IF EXISTS `employee_tbl`;CREATE TABLE `employee_tbl` (  `id` int(11) NOT NULL,  `name` char(10) NOT NULL DEFAULT '',  `date` datetime NOT NULL,  `singin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登录次数',  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------  Records of `employee_tbl`-- ----------------------------BEGIN;INSERT INTO `employee_tbl` VALUES ('1', '小明', '2016-04-22 15:25:33', '1'), ('2', '小王', '2016-04-20 15:25:47', '3'), ('3', '小丽', '2016-04-19 15:26:02', '2'), ('4', '小王', '2016-04-07 15:26:14', '4'), ('5', '小明', '2016-04-11 15:26:40', '4'), ('6', '小明', '2016-04-04 15:26:54', '2');COMMIT;SET FOREIGN_KEY_CHECKS = 1;

导入成功后,执行以下 SQL 语句:

mysql> set names utf8;mysql> SELECT * FROM employee_tbl;+----+--------+---------------------+--------+| id | name   | date                | singin |+----+--------+---------------------+--------+|  1 | 小明 | 2016-04-22 15:25:33 |      1 ||  2 | 小王 | 2016-04-20 15:25:47 |      3 ||  3 | 小丽 | 2016-04-19 15:26:02 |      2 ||  4 | 小王 | 2016-04-07 15:26:14 |      4 ||  5 | 小明 | 2016-04-11 15:26:40 |      4 ||  6 | 小明 | 2016-04-04 15:26:54 |      2 |+----+--------+---------------------+--------+6 rows in set (0.00 sec)

接下来我们使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:

mysql> SELECT name, COUNT(*) FROM   employee_tbl GROUP BY name;+--------+----------+| name   | COUNT(*) |+--------+----------+| 小丽 |        1 || 小明 |        3 || 小王 |        2 |+--------+----------+3 rows in set (0.01 sec)

使用 WITH ROLLUP

WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。

例如我们将以上的数据表按名字进行分组,再统计每个人登录的次数:

mysql> SELECT name, SUM(singin) as singin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;+--------+--------------+| name   | singin_count |+--------+--------------+| 小丽 |            2 || 小明 |            7 || 小王 |            7 || NULL   |           16 |+--------+--------------+4 rows in set (0.00 sec)

其中记录 NULL 表示所有人的登录次数。

我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:

select coalesce(a,b,c);

参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。

以下实例中如果名字为空我们使用总数代替:

mysql> SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;+--------------------------+--------------+| coalesce(name, '总数') | singin_count |+--------------------------+--------------+| 小丽                   |            2 || 小明                   |            7 || 小王                   |            7 || 总数                   |           16 |+--------------------------+--------------+4 rows in set (0.01 sec)

Mysql 连接的使用

JOIN 按照功能大致分为如下三类:

  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
  • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
  • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
root@host# mysql -u root -p password;Enter password:*******mysql> use RUNOOB;Database changedmysql> SELECT * FROM tcount_tbl;+-----------------+----------------+| runoob_author | runoob_count |+-----------------+----------------+| mahran          |             20 || mahnaz          |           NULL || Jen             |           NULL || Gill            |             20 || John Poul       |              1 || Sanjay          |              1 |+-----------------+----------------+6 rows in set (0.01 sec)mysql> SELECT * from runoob_tbl;+-------------+----------------+-----------------+-----------------+| runoob_id | runoob_title | runoob_author | submission_date |+-------------+----------------+-----------------+-----------------+|           1 | Learn PHP      | John Poul       | 2007-05-24      ||           2 | Learn MySQL    | Abdul S         | 2007-05-24      ||           3 | JAVA Tutorial  | Sanjay          | 2007-05-06      |+-------------+----------------+-----------------+-----------------+3 rows in set (0.00 sec)mysql>

接下来我们就使用MySQL的INNER JOIN(也可以省略 INNER 使用 JOIN,效果一样)来连接以上两张表来读取runoob_tbl表中所有runoob_author字段在tcount_tbl表对应的runoob_count字段值:

mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;+-----------+---------------+--------------+| runoob_id | runoob_author | runoob_count |+-----------+---------------+--------------+|         1 | John Poul     |            1 ||         3 | Sanjay        |            1 |+-----------+---------------+--------------+2 rows in set (0.00 sec)

以上 SQL 语句等价于:

mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a, tcount_tbl b WHERE a.runoob_author = b.runoob_author;+-------------+-----------------+----------------+| runoob_id | runoob_author | runoob_count |+-------------+-----------------+----------------+|           1 | John Poul       |              1 ||           3 | Sanjay          |              1 |+-------------+-----------------+----------------+2 rows in set (0.01 sec)mysql>
MySQL left join 与 join 有所不同。 MySQL LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
root@host# mysql -u root -p password;Enter password:*******mysql> use RUNOOB;Database changedmysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;+-------------+-----------------+----------------+| runoob_id | runoob_author | runoob_count |+-------------+-----------------+----------------+|           1 | John Poul       |              1 ||           2 | Abdul S         |           NULL ||           3 | Sanjay          |              1 |+-------------+-----------------+----------------+3 rows in set (0.02 sec)
MySQL RIGHT JOIN 会读取右边数据表的全部数据,即便左边边表无对应数据。
root@host# mysql -u root -p password;Enter password:*******mysql> use RUNOOB;Database changedmysql> SELECT b.runoob_id, b.runoob_author, a.runoob_count FROM tcount_tbl a RIGHT JOIN runoob_tbl b ON a.runoob_author = b.runoob_author;+-------------+-----------------+----------------+| runoob_id | runoob_author | runoob_count |+-------------+-----------------+----------------+|           1 | John Poul       |              1 ||           2 | Abdul S         |           NULL ||           3 | Sanjay          |              1 |+-------------+-----------------+----------------+3 rows in set (0.02 sec)

MySQL NULL 值处理

关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。

在MySQL中,NULL值与任何其它值的比较(即使是NULL)永远返回false,即 NULL = NULL 返回false 。

MySQL中处理NULL使用IS NULL和IS NOT NULL运算符。

mysql> SELECT * from tcount_tbl;+-----------------+----------------+| runoob_author | runoob_count |+-----------------+----------------+| mahran          |             20 || mahnaz          |           NULL || Jen             |           NULL || Gill            |             20 |+-----------------+----------------+4 rows in set (0.00 sec)

以下实例中你可以看到 = 和 != 运算符是不起作用的

mysql> SELECT * FROM tcount_tbl WHERE runoob_count = NULL;Empty set (0.00 sec)mysql> SELECT * FROM tcount_tbl WHERE runoob_count != NULL;Empty set (0.01 sec)

查找数据表中 runoob_count 列是否为 NULL,必须使用IS NULL和IS NOT NULL,如下实例:

mysql> SELECT * FROM tcount_tbl     -> WHERE runoob_count IS NULL;+-----------------+----------------+| runoob_author | runoob_count |+-----------------+----------------+| mahnaz          |           NULL || Jen             |           NULL |+-----------------+----------------+2 rows in set (0.00 sec)mysql> SELECT * from tcount_tbl     -> WHERE runoob_count IS NOT NULL;+-----------------+----------------+| runoob_author | runoob_count |+-----------------+----------------+| mahran          |             20 || Gill            |             20 |+-----------------+----------------+2 rows in set (0.00 sec)

MySQL 正则表达式

MySQL中使用 REGEXP 操作符来进行正则表达式匹配。

下表中的正则模式可应用于 REGEXP 操作符中。

模式 描述
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
[...] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^...] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
p1|p2|p3 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

查找name字段中以'st'为开头的所有数据:

mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';

查找name字段中以'ok'为结尾的所有数据:

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

查找name字段中包含'mar'字符串的所有数据:

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';

查找name字段中以元音字符开头且以'ok'字符串结尾的所有数据:

mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

MySQL ALTER命令

当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令。

如下命令使用了 ALTER 命令及 DROP 子句来删除以上创建表的 i 字段:

mysql> ALTER TABLE testalter_tbl  DROP i;

如果数据表中只剩余一个字段则无法使用DROP来删除字段。

MySQL 中使用 ADD 子句来想数据表中添加列,如下实例在表 testalter_tbl 中添加 i 字段,并定义数据类型:

mysql> ALTER TABLE testalter_tbl ADD i INT;

如果你需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。

尝试以下 ALTER TABLE 语句, 在执行成功后,使用 SHOW COLUMNS 查看表结构的变化:

ALTER TABLE testalter_tbl DROP i;ALTER TABLE testalter_tbl ADD i INT FIRST;ALTER TABLE testalter_tbl DROP i;ALTER TABLE testalter_tbl ADD i INT AFTER c;

修改字段类型及名称

如果需要修改字段类型及名称, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。

例如,把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:

mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);

使用 CHANGE 子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型。尝试如下实例:

mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
<p如果你现在想把字段 j="" 从="" bigint="" 修改为="" int,sql语句如下:<="" p="" style="color: rgb(51, 51, 51); font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, STHeiti, 'Microsoft Yahei', sans-serif;">
mysql> ALTER TABLE testalter_tbl CHANGE j j INT;

ALTER TABLE 对 Null 值和默认值的影响

当你修改字段时,你可以指定是否包含只或者是否设置默认值。

以下实例,指定字段 j 为 NOT NULL 且默认值为100 。

mysql> ALTER TABLE testalter_tbl     -> MODIFY j BIGINT NOT NULL DEFAULT 100;

修改字段默认值

你可以使用 ALTER 来修改字段的默认值,尝试以下实例:

mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;mysql> SHOW COLUMNS FROM testalter_tbl;+-------+---------+------+-----+---------+-------+| Field | Type    | Null | Key | Default | Extra |+-------+---------+------+-----+---------+-------+| c     | char(1) | YES  |     | NULL    |       || i     | int(11) | YES  |     | 1000    |       |+-------+---------+------+-----+---------+-------+2 rows in set (0.00 sec)

你也可以使用 ALTER 命令及 DROP子句来删除字段的默认值,如下实例:

mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;mysql> SHOW COLUMNS FROM testalter_tbl;+-------+---------+------+-----+---------+-------+| Field | Type    | Null | Key | Default | Extra |+-------+---------+------+-----+---------+-------+| c     | char(1) | YES  |     | NULL    |       || i     | int(11) | YES  |     | NULL    |       |+-------+---------+------+-----+---------+-------+2 rows in set (0.00 sec)Changing a Table Type:

修改表名

如果需要修改数据表的名称,可以在 ALTER TABLE 语句中使用 RENAME 子句来实现。

尝试以下实例将数据表 testalter_tbl 重命名为 alter_tbl:

mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;

转载地址:https://linxinfa.blog.csdn.net/article/details/51778638 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:HTML学习笔记
下一篇:装饰器模式

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月14日 05时01分37秒