安装数据库
本人操作系统Ubuntu 16.04,可以使用apt工具直接安装,安装命令为:
sudo apt-get install mariadb-server
此命令会安装各种依赖库和mariadb的客户端和服务端。mariadb是mysql的分支,使用和mysql一致,但各方面都比mysql强大。安装完成后,发现执行mysql访问被拒绝,原因是当前用户权限不足,在mysql命令前加sudo就行了:
sudo mysql
执行后进入mysql终端,可以先参照这篇博文创建一个普通用户,执行以下语句创建用户:
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
创建失败的话会提示错误,创建成功的话会显示下面的提示:
Query OK, 0 rows affected (0.00 sec)
创建成功之后就可以使用新的用户密码登录了:
mysql -u username -p password
用户权限不足的话可以参考上面的文章给用户授权,命令格式为:
GRANT ALL ON *.* TO 'pig'@'%';
关于MySQL重复数据
如何查找重复数据
查找重复数据即查找存在2次或2次以上的数据,可以先使用GROUP BY进行分组,再根据数量进行过滤即可。下面的命令可以看到每条数据出现的次数:
SELECT Email,COUNT(*)
FROM email
GROUP BY Email;
执行结果为:
+---------+----------+
| Email | COUNT(*) |
+---------+----------+
| a@b.com | 2 |
| c@d.com | 1 |
+---------+----------+
下面的命令可以仅显示数量大于1,即重复的数据:
SELECT Email
FROM email
GROUP BY Email
HAVING COUNT(*)>1;
执行结果为:
+---------+
| Email |
+---------+
| a@b.com |
+---------+
如何删除重复数据
如果需要删除所有重复数据,可以使用下面的语句:
DELETE FROM email
WHERE Email IN
(
SELECT * FROM
(
SELECT Email
FROM email
GROUP BY Email
HAVING COUNT(*)>1
)
AS TEMP
);
请注意上面的语句是删除所有重复数据的,如果想保留唯一记录,即删除多余的重复数据,可以执行下面的语句。先按Email字段进行分组,再取重复值的最小ID的列表,将不在这个列表内的记录全部删除:
DELETE FROM email
WHERE ID NOT IN
(
SELECT * FROM
(
SELECT ID
FROM email
GROUP BY Email
)
AS TEMP
);
如果想保留最大ID的列表,即保留比较新的值,可以使用下面的语句:
DELETE FROM email
WHERE ID NOT IN
(
SELECT * FROM
(
SELECT MAX(ID)
FROM email
GROUP BY Email
)
AS TEMP
);
保证数据唯一性
为了保证数据的唯一性,可以在建表时给列加上唯一约束,如:
CREATE TABLE email (
ID INT NOT NULL PRIMARY KEY,
Email VARCHAR(100) NOT NULL UNIQUE
);
这样子设置之后,当尝试插入重复的数据时,就会报以下错误:
ERROR 1062 (23000): Duplicate entry 'a@b.com' for key 'Email'
条件查找
假设要从下面的表中查找面积超过 300 万平方公里,或者(人口超过 2500 万并且 gdp 超过 2000 万)的国家:
+-------------+-----------+---------+------------+-----------+
| name | continent | area | population | gdp |
+-------------+-----------+---------+------------+-----------+
| Afghanistan | Asia | 652230 | 25500100 | 20343000 |
| Albania | Europe | 28748 | 2831741 | 12960000 |
| Algeria | Africa | 2381741 | 37100000 | 188681000 |
| Andorra | Europe | 468 | 78115 | 3712000 |
| Angola | Africa | 1246700 | 20609294 | 100990000 |
+-------------+-----------+---------+------------+-----------+
则可以按照条件进行逻辑组合查找,按照上面的条件,翻译成sql语句应该为:
SELECT * FROM World
WHERE
area > 3000000
OR
(
population > 25000000
AND
gdp > 20000000
);
其中逻辑运算符有AND、OR,还有前面用到NOT。比较运算符有=、>、<、!=或<>以及模糊查询的LIKE。具体可以点击这个链接学习。