安装

通过官网选择版本下载安装。Mac 上可通过 Homebrew 方便地安装:

$ brew install mysql

检查安装是否成功:

$ mysql --version
mysql Ver 8.0.15 for osx10.14 on x86_64 (Homebrew)

注意到安装成功后的提示里有一些有用的信息:

==> Caveats
We've installed your MySQL database without a root password. To secure it run:
mysql_secure_installation MySQL is configured to only allow connections from localhost by default To connect run:
mysql -uroot To have launchd start mysql now and restart at login:
brew services start mysql
Or, if you don't want/need a background service you can just run:
mysql.server start
==> Analytics
install: 61,745 (30 days), 203,280 (90 days), 869,736 (365 days)
install_on_request: 58,156 (30 days), 187,881 (90 days), 795,173 (365 days)
build_error: 0 (30 days)
  • 默认的安装没有设置 root 密码,可运行 mysql_secure_installation 来设置
  • 默认安装下,只允许从本机连接 MySQL 服务,命令是 mysql -uroot
  • 启动并使其开机时自启动 brew services start mysql

第一件事我们需要启动 MySQL 服务,

$ brew services start mysql

另外,停止及重启的命令为:

  • brew services stop mysql
  • brew services restart mysql

卸载

$ brew uninstall mysql

该命令并没有彻底卸载 MySQL,比如设置过的 root 密码,MySQL 相关的配置都还保留。如需彻底卸载,可参考这里 以及这里

上手相关的资源

通过官方文档可查阅教程及其他相关知识点,比如安全优化

初始可从这个上手教程开始。

数据库的连接

默认安装下,MySQL 提供了 root 账户且不需要密码,所以可通过如下命令在本地快速连接,

$ mysql -uroot

不过还是让我们先为其设置一个密码,操作起来比较规范也更接近于真实生产环境。运行 mysql_secure_installation 后根据向导来为 root 设置密码,同时跟着向导走还能完善一些安全相关的设置。

$ mysql_secure_installation

设置好之后来看如何连接到 MySQL 服务。连接 MySQL 的命令为:

$ mysql -h host -u user -p

其中,

  • -h 指定 host
  • -u 指定用户名
  • -p 指定密码

设置密码后便不能再缺省密码登录了,

$ mysql -uroot
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

需要带上 -u-p 指定用户名及密码。

$ mysql -h localhost -u root -p
Enter password:

本机的数据库可省略掉 host 的指定,即 mysql -u root -p

成功登录后可看到欢迎信息:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 25
Server version: 8.0.15 Homebrew Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>

此时便进入了 MySQL 的命令行,可以和数据库进行交互了,比如重置刚才设置的 root 密码:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

输入 help? 查看帮助。

mysql> help;

执行 exitquit 可退出登录,即退出 MySQL 命令行。

MySQL 命令行及 SQL 语句

一些注意点:

  • 从上面欢迎信息可看到,SQL 语句以分号(;)或 \g\G 结束,如果没有显式输入结束符,回车后会进入多行输入的模式。而 MySQL 命令则不需要显式地结束,比如 help
  • 命令(e.g. help, quit, 或 clear)及 SQL 语句(e.g. SELECT, CREATE TABLE, 或 INSERT)等是大小写不敏感的,但一般我们都将 SQL 语句中关键字大写。
  • 表中列名是大小写敏感的,但表名因为本质是对应的是物理上的文件夹,其大小写是否敏感跟系统有关,在 Windows 上大小写不敏感,在类 Unix 系统比如 Linux,Mac OS 上则是大小写敏感的。在进行字符串比较时,是否大小写敏感与所使用的字符(character collation)集有关。推荐的做法是在代码中始终保持大小写敏感,不要混用,即虽然表名对大小写不敏感就一会大写一会小写。

以下是通过 MySQL 命令行对数据库的一些基本操作。

列出数据库

通过 SHOW DATABASES 语句可查看当前存在的数据库。

mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.04 sec)

虽然 MySQL 文档里有说其自带了一个名为 test 的库方便测试,但这里并没发现,可能跟安装的版本及来源有关

创建数据库

通过 CREATE DATABASE 语句来创建数据库。

CREATE DATABASE <database_name>

比如,创建名为 pets 的数据库,

mysql> CREATE DATABASE pets;
Query OK, 1 row affected (0.09 sec)

然后通过 SHOW DATABASES查看检查刚刚创建的 pets 数据库是否生效。

mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| pets |
| sys |
+--------------------+
5 rows in set (0.00 sec)

删除数据库

相应地,删除数据库的命令为 DROP DATABASE <database_name>

重命名数据库

MySQL 中没有提供数据库重命名的功能,但可以间接地实现。

先使用想要的名字创建一个新的数据库,再将旧数据库中的表重命名到新数据库下。

mysql> CREATE database new_db_name;
mysql> RENAME TABLE old_db_name.table1 TO new_db_name.table1, old_db_name.table2 TO new_db_name.table2;
mysql> DROP database old_db_name;

关于表的重命名,参见下面表的部分。

数据库间的切换

首先通过 USE 命令切到目标数据库,该命令表示后续 SQL 语句都作用于所切换到的那个数据库。

mysql> USE pets;

通过 SELECT DATABASE() 可查看当前使用的是哪个数据库。

mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| pets |
+------------+
1 row in set (0.00 sec)

创建表

通过 CREATE TABLE 语句在数据库中创建表。

以下语句会在数据库中创建一张名为 cats 表。

CREATE TABLE cats
(
id INT unsigned NOT NULL AUTO_INCREMENT, # Unique ID for the record
name VARCHAR(150) NOT NULL, # Name of the cat
owner VARCHAR(150) NOT NULL, # Owner of the cat
birth DATE NOT NULL, # Birthday of the cat
PRIMARY KEY (id) # Make the id the primary key
);

其中第一列为列名,紧随其后的是该列的数据类型,然后是指定其是否可空。id 列通过指定 AUTO_INCREMENT 使其在新增条目时自动增加。通过 PRIMARY KEY 设置 id 列作为表的主键。其中 # 号后面为注释内容

上面代码可直接粘贴执行。平时自己手动输入的情况下,在进入多行模式行,如果发现前一行输入有误,那么很不幸,根据文档的描述,没有办法回到上一行进行修正。只能键入 \c 结束掉当前的编辑重新编写。

通过 SHOW TABLES 可查看到刚刚创建的 cats 表。

mysql> SHOW TABLES;
+----------------+
| Tables_in_pets |
+----------------+
| cats |
+----------------+
1 row in set (0.01 sec)

通过 DESCRIBE 可查看各列的详情。

mysql> DESCRIBE cats;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(150) | NO | | NULL | |
| owner | varchar(150) | NO | | NULL | |
| birth | date | NO | | NULL | |
+-------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

修改表名

如果想修改已经创建的表名,可通过 RENAME TABLE 语句来实现。

mysql> RENAME TABLE todo TO todos
Query OK, 0 rows affected (0.04 sec)

插入记录

通过 INSERT...VALUES 可向表中插入记录。

INSERT INTO cats ( name, owner, birth) VALUES
( 'Sandy', 'Lennon', '2015-01-03' ),
( 'Cookie', 'Casey', '2013-11-13' ),
( 'Charlie', 'River', '2016-05-21' );

关于各数据类型及相应值的设置可参见 Literal Values

查询记录

通过 SELECT 语句可查询表中的记录。这应该是使用最为频繁的语句了。

简单情况下的使用格式为 SELECT <column_name> from <table_name>,表示从 table_name 查询 column_name 这一列的数据,可通过将列名指定为通配符 * 以表示查询所有列。

mysql> SELECT * FROM cats;
+----+---------+--------+------------+
| id | name | owner | birth |
+----+---------+--------+------------+
| 1 | Sandy | Lennon | 2015-01-03 |
| 2 | Cookie | Casey | 2013-11-13 |
| 3 | Charlie | River | 2016-05-21 |
+----+---------+--------+------------+
3 rows in set (0.01 sec)

前面提到过语句的结束除了通过分号,还有 \g,以及 \G。前面两者等效,\G 会将结果竖向展示。

mysql> SELECT * FROM cats\G
*************************** 1. row ***************************
id: 1
name: Sandy
owner: Lennon
birth: 2015-01-03
*************************** 2. row ***************************
id: 2
name: Cookie
owner: Casey
birth: 2013-11-13
*************************** 3. row ***************************
id: 3
name: Charlie
owner: River
birth: 2016-05-21
3 rows in set (0.00 sec)

注意使用 \G 时语句后面无须再跟分号,否则会报错。

mysql> SELECT * FROM cats\G;
... ERROR:

No query specified

通过添加 WHERE 条件可对查询进行更加精确的限制,比如只返回满足某个条件下的记录。

mysql> SELECT name FROM cats WHERE owner = 'Casey';
+--------+
| name |
+--------+
| Cookie |
+--------+
1 row in set (0.00 sec)

更新记录

通过 UPDATE 对已经插入的记录进行更新。

mysql> SELECT * FROM cats;
+----+---------+--------+------------+
| id | name | owner | birth |
+----+---------+--------+------------+
| 1 | Sandy | Lennon | 2015-01-03 |
| 3 | Charlie | River | 2016-05-21 |
+----+---------+--------+------------+
2 rows in set (0.01 sec) mysql> UPDATE cats SET name='Tom',owner='Tom<span class="pl-pds">'s Daddy' WHERE cats.name='Charlie';

Query OK, 1 row affected (0.00 sec)

Rows matched: 1 Changed: 1 Warnings: 0



mysql> SELECT * FROM cats;

+----+-------+-------------+------------+

| id | name | owner | birth |

+----+-------+-------------+------------+

| 1 | Sandy | Lennon | 2015-01-03 |

| 3 | Tom | Tom's Daddy | 2016-05-21 |

+----+-------+-------------+------------+

2 rows in set (0.00 sec)

上面更新时,新的 owner 将 ``` 进行转义后插入,不然 SQL 语句在这里无法被正确解析。

删除记录

通过 DELETE 语句可删除表中的记录。

mysql> DELETE FROM cats WHERE name='Cookie';
Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM cats;

+----+---------+--------+------------+

| id | name | owner | birth |

+----+---------+--------+------------+

| 1 | Sandy | Lennon | 2015-01-03 |

| 3 | Charlie | River | 2016-05-21 |

+----+---------+--------+------------+

2 rows in set (0.00 sec)

清空表

线下测试时,会造成大量测试数据。可通过 TRUNCATE 语句来清空指定的表。

TRUNCATE [TABLE] tbl_name

清空前需谨慎,你应该不会想要在生产环境随便给到这个权限。

列的添加

通过 ALTER TABLE...ADD 语句可对表进行列的增加。

mysql> ALTER TABLE cats ADD gender CHAR(1) AFTER name;
Query OK, 0 rows affected (0.22 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> DESCRIBE cats;

+--------+------------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+--------+------------------+------+-----+---------+----------------+

| id | int(10) unsigned | NO | PRI | NULL | auto_increment |

| name | varchar(150) | NO | | NULL | |

| gender | char(1) | YES | | NULL | |

| owner | varchar(150) | NO | | NULL | |

| birth | date | NO | | NULL | |

+--------+------------------+------+-----+---------+----------------+

5 rows in set (0.01 sec)

创建表时,除了通过设置 AUTO_INCREMENT 让 id 列自增,还可通过 DEFAULT 指定列的默认值。所以这里如果想在数据插入时如果没指定性别就默认为 M,可以这样来写,

mysql> ALTER TABLE cats ADD gender CHAR(1) DEFAULT 'M' AFTER name;

前面通过 DESCRIBE 语句检查表的创建情况,还可通过 SHOW CREATE TABLE 以获得关于表更加具体的信息,该语句打印用于创建该表时的 CREATE TABLE 语句,包含了我们在手写时省略掉的一些默认设置。

mysql> SHOW CREATE TABLE cats\G
*************************** 1. row ***************************
Table: cats
Create Table: CREATE TABLE `cats` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(150) COLLATE utf8mb4_general_ci NOT NULL,
`gender` char(1) COLLATE utf8mb4_general_ci DEFAULT NULL,
`owner` varchar(150) COLLATE utf8mb4_general_ci NOT NULL,
`birth` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
1 row in set (0.00 sec)

关键是该语句的输出可直接用来在其他地方执行,然后创建出相同的表,比如上线的时候在线上环境执行。

列的删除

通过 ALTER TABLE...DROP 语句可删除表中指定的列。

mysql> DESCRIBE cats;
+--------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(150) | NO | | NULL | |
| gender | char(1) | YES | | NULL | |
| owner | varchar(150) | NO | | NULL | |
| birth | date | NO | | NULL | |
+--------+------------------+------+-----+---------+----------------+
5 rows in set (0.01 sec) mysql> ALTER TABLE cats DROP gender;

Query OK, 0 rows affected (0.21 sec)

Records: 0 Duplicates: 0 Warnings: 0 mysql> DESCRIBE cats;

+-------+------------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+------------------+------+-----+---------+----------------+

| id | int(10) unsigned | NO | PRI | NULL | auto_increment |

| name | varchar(150) | NO | | NULL | |

| owner | varchar(150) | NO | | NULL | |

| birth | date | NO | | NULL | |

+-------+------------------+------+-----+---------+----------------+

4 rows in set (0.00 sec)

账户及权限

默认的 root 账户权限很高,一般不用于日常的作业。 可根据需要创建不同权限的账户来进行管理和作业。

账户创建与分配的权限

以下脚本展示了账户的创建并为其分配相应权限。

CREATE USER 'finley'@'localhost'
IDENTIFIED BY 'password'; GRANT ALL

ON .

TO 'finley'@'localhost'

WITH GRANT OPTION; CREATE USER 'finley'@'%.example.com'

IDENTIFIED BY 'password'; GRANT ALL

ON .

TO 'finley'@'%.example.com'

WITH GRANT OPTION;

该脚本分别为 finley 在本地 localhostexample.com 域上的数据库创建了账户,并赋予了所有权限。其中 %.example.com 里面的 % 为通配符,表示该账户对 example.com 上的数据库拥有权限。

其中 WITH GRANT OPTION 表示还给该账户赋予了能够修改其他用户权限的能力

CREATE USER 'admin'@'localhost'
IDENTIFIED BY 'password'; GRANT RELOAD,PROCESS

ON .

TO 'admin'@'localhost';

上面的脚本创建了名为 'admin'@'localhost' 的账户并赋予了 RELOADPROCESS 权限。

CREATE USER 'dummy'@'localhost';

上面的脚本创建名为 'dummy'@'localhost' 的账户并且无须密码登录,但并没有赋予任何权限。后续可通过 GRANT 来设置权限。

上面创建的账户都是全局作用域,即没有限制数据库。通过为账户指定相应的数据库可限制账户只对某些库有相应操作权限,达到更加精细的设置。

CREATE USER 'custom'@'localhost'
IDENTIFIED BY 'password';
GRANT ALL
ON bankaccount.*
TO 'custom'@'localhost';

上面脚本创建的 'custom'@'localhost' 账户对 bankaccount 库拥有全部权限,但仅限于从 localhost 进行连接。

CREATE USER 'custom'@'host47.example.com'
IDENTIFIED BY 'password';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON expenses.*
TO 'custom'@'host47.example.com';

上面脚本对 'custom'@'host47.example.com' 开放 expenses 数据库的部分权限,其中包括 SELECTINSERTUPDATEDELETECREATEDROP 且只能是操作 host47.example.com 上的数据库。

CREATE USER 'custom'@'%.example.com'
IDENTIFIED BY 'password';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON customer.addresses
TO 'custom'@'%.example.com';

上面脚本创建 'custom'@'%.example.com' 账户并只对其开通 customer 库下面 addresses 的权限。

权限的查看

通过 SHOW GRANTS 来查看账户的权限。

mysql> SHOW GRANTS FOR 'wayou'@'localhost';
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for wayou@localhost |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `wayou`@`localhost` WITH GRANT OPTION |
| GRANT APPLICATION_PASSWORD_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SYSTEM_VARIABLES_ADMIN,XA_RECOVER_ADMIN ON *.* TO `wayou`@`localhost` WITH GRANT OPTION |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

通过 SHOW CREATE USER 可查看创建该用户的脚本。

mysql> SHOW CREATE USER 'wayou'@'localhost';
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE USER for wayou@localhost |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE USER 'wayou'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS 'xxx' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

权限的回收与账户的删除

通过 REVOKE 可对权限进行回收,即撤回。

回收所有全局权限的示例:

REVOKE ALL
ON *.*
FROM 'finley'@'%.example.com'; REVOKE RELOAD

ON .

FROM 'admin'@'localhost';

回收数据库作用域权限的示例:

REVOKE CREATE,DROP
ON expenses.*
FROM 'custom'@'host47.example.com';

回收表作用域权限的示例:

REVOKE INSERT,UPDATE,DELETE
ON customer.addresses
FROM 'custom'@'%.example.com';

同样,可通过 SHOW GRANTS 来检查权限更新的情况。

最后是账户的删除,通过 DROP USER 语句,以下是一个删除的示例:

DROP USER 'finley'@'localhost';

查看用户列表

通过查询内置的 mysql 数据库中 user 表,可看到添加后的所有用户。

mysql> SELECT User FROM mysql.user;
+------------------+
| user |
+------------------+
| mysql.infoschema |
| mysql.session |
| mysql.sys |
| root |
| wayou |
+------------------+
5 rows in set (0.00 sec)

相关资源

MySQL 上手教程的更多相关文章

  1. 【秒懂】号称最为简明实用的Django上手教程

    号称最为简明实用的Django上手教程 作者:白宁超 2017年8月24日09:37:35 摘要:Django的学习教程也是分门别类,形式不一.或是较为体系的官方文档,或者风格自由的博客文档,或者偏向 ...

  2. 【秒懂】号称最为简明实用的Django上手教程(下)

    号称最为简明实用的Django上手教程(下) 作者:白宁超 2017年8月25日08:51:58 摘要:上文号称[最为简明实用的Django上手教程]介绍了django基本概念.配置和相关操作.相信通 ...

  3. Navicat操作MySQL简易教程

    前言: 日常使用 MySQL 的过程中,我们可能会经常使用可视化工具来连接 MySQL ,其中比较常用的就是 Navicat 了.平时也会遇到某些同学问, Navicat 怎么安装,如何使用等问题.本 ...

  4. 数据库 之MySQL 简单教程

      So Easy系列之MySQL数据库教程 1.   数据库概述 1.1.  数据库概述 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和 ...

  5. 21分钟 MySQL 入门教程(转载!!!)

    21分钟 MySQL 入门教程 目录 一.MySQL的相关概念介绍 二.Windows下MySQL的配置 配置步骤 MySQL服务的启动.停止与卸载 三.MySQL脚本的基本组成 四.MySQL中的数 ...

  6. MySQL Python教程(1)

    首先对于数据库的基本操作要有一定基础,其次了解Python的基础语法. 建议先阅读MysqL中文教程http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chap ...

  7. [转]Caffe 深度学习框架上手教程

    Caffe 深度学习框架上手教程 机器学习Caffe caffe 原文地址:http://suanfazu.com/t/caffe/281   blink 15年1月 6   Caffe448是一个清 ...

  8. 迅美VPS安装和配置MySQL数据库教程

    MySQL相关教程与知识:    迅美VPS安装和配置MySQL数据库教程    navicat8管理MySQL教程-创建数据库和导入数据    navicat8管理MySQL教程-管理建立用户和分配 ...

  9. 原创教程:SpagoBI4.2汉化及配置Mysql数据库教程

    SpagoBI4.2汉化及配置Mysql数据库教程 商务智能套件SpagoBI提供一个基于J2EE的框架用于管理BI对象如报表.OLAP分析.仪表盘.记分卡以及数据挖掘模型等的开源BI产品.它提供的B ...

随机推荐

  1. Charles手机抓包实用教程

    一.Charles官网下载链接:https://www.charlesproxy.com/download/ 二.抓包步骤: 1.安装Charles,并打开 2.电脑设置代理端口:打开charles- ...

  2. threesum

    算法题 问题描述:在一些给定的数中,找到三个数,他们相加的和是0,并且这三个数的组合是不能重复的 例子: input [-1, 0, -1, 2, 1] Output [[-1, 1 ,0], [-1 ...

  3. 前端应该了解的PWA

    一.传统web 应用 当前web应用在移动时代并没有达到其在桌面设备上流行的程度,下面有张图来对比与原生应用之间的差别. 究其原因,无外乎下面不可避免的几点: 移动设备网络限制-不可忽略的加载时间 w ...

  4. php坏境安装Xdebug详情步骤

    原创,转载请注明出处! Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况,可以说是程序员必备的一个工具之一.好了,进入正题: 1.下 ...

  5. Android动态字符串拼接----%s

    在开发经常遇到字符串中的某一数据或多个数据是动态变化的. 如下图 不要创建3个TextView,暂时不考虑颜色变化的情况,可以用以下做法. <string name="maintain ...

  6. 3、js无缝滚动轮播

    另一个无缝滚动轮播,带暂停,由于js是异步,用C面向过程的思想开始会很怪异很怪异,因为当你定时器里面需要执行的函数时间比较长或是有一段延时时,异步的代码会完全不同,但习惯就好了. 这个代码有几个问题, ...

  7. jsp 增删改查

    使用Idea创建项目 1.新建web application项目 Idea 选择 Java Enterprise -> web application 2.新版本没有web-inf文件夹 解决方 ...

  8. 【转】拍拍网2015年mysql最新开发规范

    1.命名规范 (1)库名.表名.字段名必须使用小写字母,并采用下划线分割. (2)库名.表名.字段名禁止超过32个字符. (3)库名.表名.字段名必须见名知意.命名与业务.产品线等相关联. (4)库名 ...

  9. C#温故而知新系列 -- 闭包

    闭包的由来 要说闭包的由来就不得不先说下函数式编程了.近几年函数式编程也是比较火热,我们先来看看函数式编程的一些基本的特性这个有助于我们理解闭包的由来. 函数式编程 函数式编程是一种编程模型,他将计算 ...

  10. 使用Spring Session实现Spring Boot水平扩展

    小编说:本文使用Spring Session实现了Spring Boot水平扩展,每个Spring Boot应用与其他水平扩展的Spring Boot一样,都能处理用户请求.如果宕机,Nginx会将请 ...