MySQL Cookbook 学习笔记-04

1、处理重复

<a>、创建表包含 primary key 或 unique index,阻止重复数据写入

<b>、联合 <a>,使用 INSERT IGNORE 或 REPLACE

<c>、检查表是否有重复行的方法,通过 group by 和 count( x ) 来统计

<d>、通过 SELECT DISTINCT 来过滤重复

a——示例

CREATE TABLE person
(last_name   CHAR(20) NOT NULL,first_name  CHAR(20) NOT NULL,address     CHAR(40),PRIMARY KEY (last_name, first_name)
);
CREATE TABLE person
(last_name   CHAR(20) NOT NULL,first_name  CHAR(20) NOT NULL,address     CHAR(40),UNIQUE (last_name, first_name)
);

b——示例

一般情况下,插入重复 primary key 或 union index 会报错

mysql> INSERT INTO person (last_name, first_name)-> VALUES('X1','Y1');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO person (last_name, first_name)-> VALUES('X1','Y1');
ERROR 1062 (23000): Duplicate entry 'X1-Y1' for key 1
使用 INSERT IGNORE

mysql> INSERT IGNORE INTO person (last_name, first_name)-> VALUES('X2','Y2');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT IGNORE INTO person (last_name, first_name)-> VALUES('X2','Y2');
Query OK, 0 rows affected (0.00 sec)
使用 REPLACE

mysql> REPLACE INTO person (last_name, first_name)-> VALUES('X3','Y3');
Query OK, 1 row affected (0.00 sec)
mysql> REPLACE INTO person (last_name, first_name)-> VALUES('X3','Y3');
Query OK, 2 rows affected (0.00 sec)
使用 INSERT ... ON DUPLICATE KEY UPDATE 

 CREATE TABLE poll_vote
(poll_id      INT UNSIGNED NOT NULL AUTO_INCREMENT,candidate_id INT UNSIGNED,vote_count   INT UNSIGNED,PRIMARY KEY (poll_id, candidate_id)
);mysql> SELECT * FROM poll_vote;
Empty set (0.01 sec)
mysql> INSERT INTO poll_vote (poll_id,candidate_id,vote_count) VALUES(14,2,1)-> ON DUPLICATE KEY UPDATE vote_count = vote_count + 1;
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM poll_vote;
+---------+--------------+------------+
| poll_id | candidate_id | vote_count |
+---------+--------------+------------+
| 14      | 2            | 1          |
+---------+--------------+------------+
1 row in set (0.01 sec)
mysql> INSERT INTO poll_vote (poll_id,candidate_id,vote_count) VALUES(14,2,1)-> ON DUPLICATE KEY UPDATE vote_count = vote_count + 1;
Query OK, 2 rows affected (0.00 sec)
mysql> SELECT * FROM poll_vote;
+---------+--------------+------------+
| poll_id | candidate_id | vote_count |
+---------+--------------+------------+
| 14      | 2            | 2          |
+---------+--------------+------------+
1 row in set (0.00 sec)
c——示例

mysql> SELECT * FROM catalog_list;
+-----------+-------------+--------------------------+
| last_name | first_name  | street                   |
+-----------+-------------+--------------------------+
| Isaacson  | Jim         | 515 Fordam St., Apt. 917 |
| Baxter    | Wallace     | 57 3rd Ave.              |
| McTavish  | Taylor      | 432 River Run            |
| Pinter    | Marlene     | 9 Sunset Trail           |
| BAXTER    | WALLACE     | 57 3rd Ave.              |
| Brown     | Bartholomew | 432 River Run            |
| Pinter    | Marlene     | 9 Sunset Trail           |
| Baxter    | Wallace     | 57 3rd Ave., Apt 102     |
+-----------+-------------+--------------------------+mysql> select count(*) as total_rows,-> count(distinct last_name, first_name) as distince_names,-> count(*) - count(distinct last_name, first_name) as duplicate_names-> from catalog_list;
+------------+----------------+-----------------+
| total_rows | distince_names | duplicate_names |
+------------+----------------+-----------------+
|          8 |              5 |               3 |
+------------+----------------+-----------------+
查询出重复的行:

mysql> select count(*) as repetitions, last_name, first_name-> from catalog_list-> group by last_name, first_name-> having repetitions > 1;
+-------------+-----------+------------+
| repetitions | last_name | first_name |
+-------------+-----------+------------+
|           3 | Baxter    | Wallace    |
|           2 | Pinter    | Marlene    |
+-------------+-----------+------------+
2、从表中删除重复

(Recipe 14.4. Eliminating Duplicates from a Table)

<a>、Removing duplicates using table replacement

<b>、Removing duplicates by adding an index

<c>、Removing duplicates of a particular row

a——示例

mysql> CREATE TABLE tmp LIKE catalog_list;
mysql> ALTER TABLE tmp ADD PRIMARY KEY (last_name, first_name);
mysql> INSERT IGNORE INTO tmp SELECT * FROM catalog_list;
mysql> SELECT * FROM tmp ORDER BY last_name, first_name;
+-----------+-------------+--------------------------+
| last_name | first_name  | street                   |
+-----------+-------------+--------------------------+
| Baxter    | Wallace     | 57 3rd Ave.              |
| Brown     | Bartholomew | 432 River Run            |
| Isaacson  | Jim         | 515 Fordam St., Apt. 917 |
| McTavish  | Taylor      | 432 River Run            |
| Pinter    | Marlene     | 9 Sunset Trail           |
+-----------+-------------+--------------------------+
mysql> DROP TABLE catalog_list;
mysql> RENAME TABLE tmp TO catalog_list;
b——示例

mysql> ALTER IGNORE TABLE catalog_list-> ADD PRIMARY KEY (last_name, first_name);
mysql> SELECT * FROM catalog_list ORDER BY last_name, first_name;
+-----------+-------------+--------------------------+
| last_name | first_name  | street                   |
+-----------+-------------+--------------------------+
| Baxter    | Wallace     | 57 3rd Ave.              |
| Brown     | Bartholomew | 432 River Run            |
| Isaacson  | Jim         | 515 Fordam St., Apt. 917 |
| McTavish  | Taylor      | 432 River Run            |
| Pinter    | Marlene     | 9 Sunset Trail           |
+-----------+-------------+--------------------------+
c——示例

+-------+
| color |
+-------+
| blue  |
| green |
| blue  |
| blue  |
| red   |
| green |
| red   |
+-------+mysql> DELETE FROM t WHERE color = 'blue' LIMIT 2;
mysql> DELETE FROM t WHERE color = 'green' LIMIT 1;
mysql> DELETE FROM t WHERE color = 'red' LIMIT 1;
mysql> SELECT * FROM t;
+-------+
| color |
+-------+
| blue  |
| green |
| red   |
+-------+

3、删除“语义重复”但行数据不重复的行

(Recipe 14.5. Eliminating Duplicates from a Self-Join Result)

mysql> SELECT YEAR(s1.statehood) AS year,-> s1.name AS name1, s1.statehood AS statehood1,-> s2.name AS name2, s2.statehood AS statehood2-> FROM states AS s1 INNER JOIN states AS s2-> ON YEAR(s1.statehood) = YEAR(s2.statehood) AND s1.name != s2.name-> ORDER BY year, s1.name, s2.name;
+------+----------------+------------+----------------+------------+
| year | name1          | statehood1 | name2          | statehood2 |
+------+----------------+------------+----------------+------------+
| 1787 | Delaware       | 1787-12-07 | New Jersey     | 1787-12-18 |
| 1787 | Delaware       | 1787-12-07 | Pennsylvania   | 1787-12-12 |
| 1787 | New Jersey     | 1787-12-18 | Delaware       | 1787-12-07 |
| 1787 | New Jersey     | 1787-12-18 | Pennsylvania   | 1787-12-12 |
| 1787 | Pennsylvania   | 1787-12-12 | Delaware       | 1787-12-07 |
| 1787 | Pennsylvania   | 1787-12-12 | New Jersey     | 1787-12-18 |
...
| 1912 | Arizona        | 1912-02-14 | New Mexico     | 1912-01-06 |
| 1912 | New Mexico     | 1912-01-06 | Arizona        | 1912-02-14 |
| 1959 | Alaska         | 1959-01-03 | Hawaii         | 1959-08-21 |
| 1959 | Hawaii         | 1959-08-21 | Alaska         | 1959-01-03 |
+------+----------------+------------+----------------+------------+
由上数据分析:

1787年有3个州(Delaware,New Jersey,Pennsylvania),两两配对应该是3个才对。

但是这里却又6条数据,一半重复(语义上)!

将“语义重复”调整为“行数据重复

+------+----------------+------------+----------------+------------+
| year | name1          | statehood1 | name2          | statehood2 |
+------+----------------+------------+----------------+------------+
| 1787 | Delaware       | 1787-12-07 | New Jersey     | 1787-12-18 |
| 1787 | New Jersey     | 1787-12-18 | Delaware       | 1787-12-07 |
也就是:

如果,name1 < name2,成立保持不变

如果,name1 < name2,不成立。name1 与 name2 互换;statehood1 与 statehood2 互换。

mysql> SELECT YEAR(s1.statehood) AS year,-> IF(s1.name<s2.name,s1.name,s2.name) AS name1,-> IF(s1.name<s2.name,s1.statehood,s2.statehood) AS statehood1,-> IF(s1.name<s2.name,s2.name,s1.name) AS name2,-> IF(s1.name<s2.name,s2.statehood,s1.statehood) AS statehood2-> FROM states AS s1 INNER JOIN states AS s2-> ON YEAR(s1.statehood) = YEAR(s2.statehood) AND s1.name != s2.name-> ORDER BY year, name1, name2;
+------+----------------+------------+----------------+------------+
| year | name1          | statehood1 | name2          | statehood2 |
+------+----------------+------------+----------------+------------+
| 1787 | Delaware       | 1787-12-07 | New Jersey     | 1787-12-18 |
| 1787 | Delaware       | 1787-12-07 | New Jersey     | 1787-12-18 |
| 1787 | Delaware       | 1787-12-07 | Pennsylvania   | 1787-12-12 |
| 1787 | Delaware       | 1787-12-07 | Pennsylvania   | 1787-12-12 |
| 1787 | New Jersey     | 1787-12-18 | Pennsylvania   | 1787-12-12 |
| 1787 | New Jersey     | 1787-12-18 | Pennsylvania   | 1787-12-12 |
...
| 1912 | Arizona        | 1912-02-14 | New Mexico     | 1912-01-06 |
| 1912 | Arizona        | 1912-02-14 | New Mexico     | 1912-01-06 |
| 1959 | Alaska         | 1959-01-03 | Hawaii         | 1959-08-21 |
| 1959 | Alaska         | 1959-01-03 | Hawaii         | 1959-08-21 |
+------+----------------+------------+----------------+------------+
再用 DISTINCT 语句删除重复:

mysql> SELECT DISTINCT YEAR(s1.statehood) AS year,-> IF(s1.name<s2.name,s1.name,s2.name) AS name1,-> IF(s1.name<s2.name,s1.statehood,s2.statehood) AS statehood1,-> IF(s1.name<s2.name,s2.name,s1.name) AS name2,-> IF(s1.name<s2.name,s2.statehood,s1.statehood) AS statehood2-> FROM states AS s1 INNER JOIN states AS s2-> ON YEAR(s1.statehood) = YEAR(s2.statehood) AND s1.name != s2.name-> ORDER BY year, name1, name2;
+------+----------------+------------+----------------+------------+
| year | name1          | statehood1 | name2          | statehood2 |
+------+----------------+------------+----------------+------------+
| 1787 | Delaware       | 1787-12-07 | New Jersey     | 1787-12-18 |
| 1787 | Delaware       | 1787-12-07 | Pennsylvania   | 1787-12-12 |
| 1787 | New Jersey     | 1787-12-18 | Pennsylvania   | 1787-12-12 |
...
| 1912 | Arizona        | 1912-02-14 | New Mexico     | 1912-01-06 |
| 1959 | Alaska         | 1959-01-03 | Hawaii         | 1959-08-21 |
+------+----------------+------------+----------------+------------+

4、选择支持事务的存储引擎

(Recipe 15.1. Choosing a Transactional Storage Engine)

mysql> SHOW ENGINES\G
*************************** 1. row ***************************Engine: MyISAM
Support: DEFAULT
Comment: Default engine as of MySQL 3.23 with great performance
*************************** 2. row ***************************Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
*************************** 3. row ***************************Engine: InnoDB
Support: YES
Comment: Supports transactions, row-level locking, and foreign keys
*************************** 4. row ***************************Engine: BerkeleyDB
Support: YES
Comment: Supports transactions and page-level locking
...
创建表:

CREATE TABLE t1 (i INT) ENGINE = InnoDB;
CREATE TABLE t2 (i INT) ENGINE = BDB;
修改表:

ALTER TABLE t ENGINE = InnoDB;
5、使用 SQL 执行事务

(Recipe 15.2. Performing Transactions Using SQL)

mysql> CREATE TABLE t (i INT) ENGINE = InnoDB;
mysql> START TRANSACTION;
mysql> INSERT INTO t (i) VALUES(1);
mysql> INSERT INTO t (i) VALUES(2);
mysql> COMMIT;
mysql> SELECT * FROM t;
+------+
| i    |
+------+
|    1 |
|    2 |
+------+
关闭自动提交:

mysql> CREATE TABLE t (i INT) ENGINE = InnoDB;
mysql> SET autocommit = 0;
mysql> INSERT INTO t (i) VALUES(1);
mysql> INSERT INTO t (i) VALUES(2);
mysql> COMMIT;
mysql> SELECT * FROM t;
+------+
| i    |
+------+
|    1 |
|    2 |
+------+
开启自动提交:

mysql> SET autocommit = 1;
6、在程序中使用事务(Java 示例)

try
{conn.setAutoCommit (false);Statement s = conn.createStatement ();// move some money from one person to the others.executeUpdate ("UPDATE money SET amt = amt - 6 WHERE name = 'Eve'");s.executeUpdate ("UPDATE money SET amt = amt + 6 WHERE name = 'Ida'");s.close ();conn.commit ();conn.setAutoCommit (true);
}
catch (SQLException e)
{System.err.println ("Transaction failed, rolling back.");Cookbook.printErrorMessage (e);// empty exception handler in case rollback failstry{conn.rollback ();conn.setAutoCommit (true);}catch (Exception e2) { }
}

7、存储过程

Navicat 中创建存储过程注意事项:

<a>、在Navicat里面不需要写头,直接从BEGIN开始即可。

<b>、过程名将在保存的时候填写,参数则可以填在代码定义框下面的参数输入框中,如果要使用返回值,则可以设定类型为FUNCTION,回传框即可填写。












































本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用frame框架,将左边视为导航栏,右边作为链接界面

在浏览网页时&#xff0c;我们经常会看到一个导航条&#xff0c;当点击导航条上的项目时&#xff0c;相应网页会在显示区域变换显示。那么如何将一个界面中&#xff0c;左边设置为导航栏&#xff0c;点击项目链接&#xff0c;则右边显示相应的内容呢&#xff1f;使用frameset框…

面对大规模AI集成,企业为何迟迟犹豫?

来源&#xff1a;亿欧 概要&#xff1a;首先&#xff0c;需要全面了解您的业务目标、技术需求以及AI对客户和员工的影响。需要解决的问题是&#xff0c;大多数员工面临着接受人工智能程度方面的挑战与担忧。 人工智能是实现流程自动化、降低运营成本和进创新的重要手段。尽管AI…

类的初始化

加载 ----> 连接&#xff08;验证&#xff0c;准备&#xff0c;解析*&#xff09; ---->初始化 Java 虚拟机在首次主动使用类型时初始化它们。 主动使用&#xff08;6种&#xff09; 1、创建类的实例 2、调用类中声明的静态方法 3、操作类或者接口中声明的非常量静态…

用定时器控制灯的闪烁梯形图_用西门子PLC设计灯的闪烁的梯形图,就只要梯形图。...

展开全部使用特32313133353236313431303231363533e58685e5aeb931333431373235殊标志寄存器即可实现你想要的功能&#xff0c;如果想要设计出亮的时间固定、灭的时间也固定的闪烁效果比较复杂。SM0.5 该位提供了一个时钟脉冲&#xff0c;0.5 秒为1&#xff0c;0.5 秒为0&#xf…

如何进行模糊分页

使用模糊分页需要3个参数:关键字&#xff1a;key,当前页&#xff1a;page,查询内容个数&#xff1a;count 核心代码&#xff1a; //所有菜单列表分页private void foodList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException …

PostgreSQL+安装及常见问题

postgresql-8.1-int.msi postgresql-8.1.msi &#xff08;点这个安装&#xff09; 前面一直用默认 1、到如下画面时注意&#xff1a; 重复账户时&#xff0c;报如下错误&#xff1a; 2、勾选所有连接都能使用该PostgreSQL 数据库&#xff0c;而不是仅仅支持 Localhost 3、…

post和get请求的区别

1.传送方式&#xff1a;get通过地址栏传输&#xff0c;post通过报文传输。 2.post请求无长度限制&#xff08;至少是理论上的&#xff09; &#xff1b;get有长度限制&#xff0c;最长不超过2048字节&#xff08;1024个汉字&#xff09; 3.Get/post 请求报文上的区别 get 和…

js 操作vuex数据_vue中使用vuex(超详细)

vuex是使用vue中必不可少的一部分,基于父子、兄弟组件,我们传值可能会很方便,但是如果是没有关联的组件之间要使用同一组数据,就显得很无能为力,那么vuex就很好的解决了我们这种问题,它相当于一个公共仓库,保存着所有组件都能共用的数据。 那么,我们一起来看看vue项目怎…

用脑科学支持人工智能

来源&#xff1a;中国科学报 概要&#xff1a;脑科学研究者正在揭示预测性运动控制神经机制&#xff0c;以脑科学基础研究支持人工智能发展并促进两大领域的深度融合。 最近&#xff0c;在国家自然科学基金&#xff08;项目号&#xff1a;31671075&#xff09;的支持下&#x…

mysql数据库进行更新、插入显示中文乱码问题

很多种情况下&#xff0c;从数据库中查询出来的内容中文显示正确&#xff0c;但是如果向数据库中插入或更新表时&#xff0c;会出现中文乱码问题&#xff0c;但英文显示正确&#xff0c;以下三种方式可以解决中文乱码问题。 1.数据库连接的配置文件中添加characterEncodingutf…

1进程 ppid_杀死僵尸进程,你需要这些神奇的Linux命令行

Linux高手&#xff0c;其实都是玩儿命令行很熟练的人。命令行的学习捷径Linux命令有许多强大的功能&#xff1a;从简单的磁盘操作、文件存取&#xff0c;到进行复杂的多媒体图像和流媒体文件的制作&#xff0c;都离不开命令行。在Linux的学习中&#xff0c;新手都会遇到这么一个…

PostgreSQL 常见操作

1、在命令行登录指定数据库 2、创建表 CREATE TABLE weather (city varchar(80),temp_lo int, -- low temperaturetemp_hi int, -- high temperatureprcp real, -- precipitationdate date ); …

大数据统计分析毕业设计_数据分析毕业设计 大数据可视化毕业设计

做大数据分析相关的毕业设计&#xff0c;有什么好的题目或方向推荐吗&#xff1f;毛台九大数据其它九大数据油业&#xff0c;三农&#xff0c;科研&#xff0c;人文&#xff0c;……打算用Python做毕业设计&#xff0c;可以做哪些方面的&#xff1f;Python做毕业设计&#xff0…

MultipartFile文件上传

一、配置文件&#xff1a; SpringMVC 用的是 的MultipartFile来进行文件上传 所以我们首先要配置MultipartResolver:用于处理表单中的file。在springmvc.xml中进行配置&#xff0c;目录结构如下&#xff1a; <!-- 配置MultipartResolver 用于文件上传 使用spring的CommosMul…

一个简单的 iBatis 实现——完整示例

表和数据&#xff1a; CREATE TABLE weather (city varchar(80),temp_lo int, -- low temperaturetemp_hi int, -- high temperatureprcp real, -- average temperaturedate date );insert int…

测绘技术设计规定最新版_公示 | 29家单位申报甲级测绘资质审查意见

关于北京同创天成工程勘测有限公司等29家单位申报甲级测绘资质审查意见的公示  根据《中华人民共和国测绘法》和《测绘资质管理规定》《测绘资质分级标准》(国测管发〔2014〕31号)&#xff0c;我部对北京同创天成工程勘测有限公司、北京麦格天宝科技股份有限公司、中友四达(北…

智能驾驶时代已经到来

来源&#xff1a;中国科学报 概要&#xff1a;智能化、电动化、轻量化&#xff0c;无疑是被业界公认的汽车的三大发展方向。其中&#xff0c;汽车的智能化&#xff0c;或者说智能驾驶最为引人关注。 智能化、电动化、轻量化&#xff0c;无疑是被业界公认的汽车的三大发展方向。…

@requestparam @param @pathvariable @requestbody的区别

requestParam注解 用来获取前台传递过来的参数&#xff0c;例如获取以下链接的参数&#xff1a; http://api.nc.com/api/item/category/list?pid0 public String Demo1(RequestParam String pid){ System.out.println(“链接中请求参数的id&#xff1a;”pid); return null; }…

PostgreSQL 的一个简单连接和查询操作——示例

表和数据&#xff1a; CREATE TABLE weather (city varchar(80),temp_lo int, -- low temperaturetemp_hi int, -- high temperatureprcp real, -- average temperaturedate date );insert int…