MySQL数据库 (下)

MySQL数据库 (下)

MySQL高级应用

一、MySQL联结表

预备知识:

1、关系表:把信息分解成多个表,一类数据一个表,各表通过某些共同的值相互关联(所以才称为关系数据库)。

2、联结:联结是一种机制,用来在一条SELECT语句中关联表,因此称为联结。通过联结,一条SELECT语句可以联结多个表返回一组输出。

3、完全限定列名:表名+.+列名

4、笛卡儿积(叉联积):由没有联结条件表关系返回的结果为笛卡儿积,结果的行数是第一个表的行数乘以第二个表的行数。

5、表别名和列别名(SQL 一个别名只存在于查询期间。表别名只会在查询执行中使用。与列别名不同,表别名不返回MySQL客户端):SELECT 列名 AS 列别名 FROM 表名 AS 表别名 (Oracle中没有AS,别名设置不用AS,直接指定别名即可)

  一、INNER JOIN(内连接/等值连接)--获取两个表中字段匹配关系的记录;

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;
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;

  二、自联结(self-join):自联结通常用作外部语句,用来代替从相同表中检索数据使用的子查询语句。一个SELECT语句查询两次查询是同一个表,但是使用相同的表名,DBMS会有歧义。通过设置表别名,DBMS处理联结远比处理子查询快得多!

mysql> SELECT a.runoob_id, a.runoob_author FROM runoob_tbl_a AS a, runoob_tbl_a AS b where a.runoob_author = b.runoob_author and b.runoob_name=‘c++‘;

  三、自然联结(natural join):被联结的表至少有一列不止出现在一个表(被联结的列存在于多个表),标准的联结返回所有的数据,相同的列甚至多次出现!自然联结排除多次出现,使每一列只返回一次。通过对一个表使用通配符(SELECT*),而对其他表的列使用明确的子集来完成。

mysql> SELECT C。*,O.order_num,O.order_date,OI.prod_id,OI.quantity,OI.item_price
       ->FROM Cuntomers AS C,Orders AS O,OrderItems AS OI
       ->WHERE C.cust_id=O.cust_id AND OI.order_num = O.order_num AND prod_id =‘AS‘

  四、外联结(outer join):LEFT (OUTER)JOIN(左连接)--获取左表所有记录。如果右表没有对应匹配的记录,右表数据字段值用NULL表示;

                                                  RIGHT(OUTER) JOIN(右连接)--获取右表所有记录,如果左表没有对应匹配的记录,左表数据字段值用NULL表示

                                                  FULL OUTER JOIN

mysql> 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;

mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a RIGHT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;

mysql> select column_name(s) from table 1 FULL OUTER JOIN table 2 ON table 1.column_name=table 2.column_name;

二、数据表column中有null字段

1、IS NULL

2、IS NOT NULL

3、<=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true

注:

  where语句判断列的值是否为null,where column_name IS NULL;where column_name IS NOT NULL

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

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

表-1 正则表达式模式说明

模式 描述
^ 匹配输入字符串的开始位置。如果设置了 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 次。

四、MySQL 事务:
1、在 MySQL 中,只有使用了 Innodb 数据库引擎的数据库或表才支持事务

2、事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)

3、事务的ACID:

一、原子性:事务中的命令要么全部执行完成,要么全部不执行。如果在队列命令中间发生错误,MySQL支持rollback(回滚)到事务开始前的状态,就像整个事务从来没有被执行一样。

二、一致性:分布式系统的数据一致性与集中式系统的数据一致性。

  分布式系统:某个数据存在了三个服务器上。如果数据要更新,就必须保证三个服务器上数据全都更新好,如果有一个没有成功,那么其他两个也应该维持不变,

  集中式系统:数据只存储在服务器,没有数据副本的概念。数据一致性就需要用户来定义,也就是ACID链接里的valid状态,其实由用户来定义。一致性模型则可以认为是存储系统数据使用者之间的一种约定。一般情况下,数据一致性通常指关联数据之间的逻辑关系(用户定义的一致性状态)是否正确和完整。

三、隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力。InnoDB 存储引擎提供事务的隔离级别:读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)

四、持久性:当一个事务执行完成后,执行事务所得的结果已经被保存到永久性存储介质中,对数据的修改是永久的,即使系统故障也不会丢失。

4、MYSQL 事务处理:BEGIN(开始一个事务), ROLLBACK(事务回滚), COMMIT(事务确认);MySQL还支持保存点操作:创建保存点:SAVEPOINT identifier、删除保存点:RELEASE SAVEPOINT identifier、把事务回滚到保存点:ROLLBACK TO identifier

五、ALTER命令修改数据表名和数据表字段

# 在 ALTER TABLE 语句中使用 RENAME 子句修改数据表名
mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;

# 通过使用DROP、ADD删除和增加字段
mysql> ALTER TABLE testalter_tbl  DROP i;

mysql> ALTER TABLE testalter_tbl ADD i INT;

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

# 通过使用 MODIFY 或 CHANGE 子句修改字段类型及名称
mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10); 

mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT NOT NULL DEFAULT 100;

# 通过SET和DROP子句修改DEFAULT
mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;

mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;

注:当数据表只有一个字段时,不能通过DROP删除字段。

六、设置索引

1、设置索引的三种方法:创建索引(create);修改表结构,添加索引(alter);创建表时直接指定字段作为索引。

七、MySQL临时表

1、MySQL临时表用于存储临时数据,临时表只在当前连接可见,当关闭连接,MySQL自动删除临时表并释放空间。

# 创建临时表(TEMPORARY TABLE)
mysql> CREATE TEMPORARY TABLE SalesSummary (
    -> product_name VARCHAR(50) NOT NULL
    -> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
    -> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
    -> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);

# 删除临时表
mysql> DROP TABLE SalesSummary;

八、MySQL复制表

1、MySQL复制表,第一步、需要获取创建数据表的SQL语句,从而创建一样数据表名,数据表字段,默认值一致,索引一致的数据表结构;第二步、将源数据表的各个数据表字段的值全部复制到目标数据表字段中。

第一步:SHOW CREATE TABLE 语句

mysql> SHOW CREATE TABLE runoob_tbl \G;

第二步:INSERT INTO ... SELECT 语句  

mysql> INSERT INTO clone_tbl (runoob_id,
    ->                        runoob_title,
    ->                        runoob_author,
    ->                        submission_date)
    -> SELECT runoob_id,runoob_title,
    ->        runoob_author,submission_date
    -> FROM runoob_tbl;

九、MySQL处理重复数据

1、防止出现重复数据:primary key和unique进行数据表字段属性约束“唯一性”

2、统计重复数据:确定哪个数据表字段的值可能会重复>>SELECET COUNT(*) as repetiions列出这些数据表字段>>在GROUP BY子句中列出的列>>HAVING子句设置重复数大于  1(HAVING repetitions > 1)

3、过滤重复数据:SELECT 语句中使用 DISTINCT 关键字来过滤重复数据或者使用GROUP BY 来读取数据表中不重复的数据

SELECT 语句中使用 DISTINCT 关键字:

mysql> SELECT DISTINCT last_name, first_name
    -> FROM person_tbl;

使用GROUP BY 来读取数据表中不重复的数据:

mysql> SELECT last_name, first_name
    -> FROM person_tbl
    -> GROUP BY (last_name, first_name);

4、删除重复数据:

使用SQL语句:

mysql> CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl  GROUP BY (last_name, first_name, sex);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;

在数据表中添加 INDEX(索引) 和 PRIMAY KEY(主键)删除表中的重复记录:

mysql> ALTER IGNORE TABLE person_tbl
    -> ADD PRIMARY KEY (last_name, first_name);

十、MySQL导出数据表数据、导入数据到MySQL服务器和传输数据库数据到远程主机

1、使用SELECT...INTO OUTFILE语句来简单的导出数据到文本文件,并设置数据输出的指定格式,类似redis的RDB持久化。

mysql> SELECT * FROM passwd INTO OUTFILE ‘/tmp/runoob.txt‘
    -> FIELDS TERMINATED BY ‘,‘ ENCLOSED BY ‘"‘
    -> LINES TERMINATED BY ‘\r\n‘;

 2、mysqldump 是 mysql 用于转存储数据库的实用程序。可以读取数据库的数据也可以将创建数据库所需的命令保存。

  mysqldump 产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令 CREATE TABLE INSERT 等。类似AOF持久化。使用 mysqldump 导出数据库的必须命令需要使用 --tab 选项来指定导出文件指定的目录,该目标必须是可写的:

$ mysqldump -u root -p --no-create-info             --tab=/tmp RUNOOB runoob_tbl
password ******

  mysqldump导出包含命令的文件中的数据

$ mysqldump -u root -p RUNOOB runoob_tbl > dump.txt
password ******

  mysqldump导出数据库数据

$ mysqldump -u root -p RUNOOB > database_dump.txt
password ******

  mysqldump备份数据库数据

$ mysqldump -u root -p --all-databases > database_dump.txt
password ******

   mysqldump将数据库数据导入MySQL服务器

$ mysql -u root -p database_name < database_dump.txt
password *****

  mysqldump指定数据库及数据表,通过管道将导出的数据导入到指定的远程主机上

$ mysqldump -u root -p database_name        | mysql -h other-host.com database_name

  

原文地址:https://www.cnblogs.com/yinminbo/p/11792126.html

时间: 2024-10-08 06:05:08

MySQL数据库 (下)的相关文章

在MySql数据库下show命令的主要用法

本文主要介绍mysql数据库下show命令的主要用法,e良师益友网中有更加详细的介绍,还有基础相关的教学. 1.show tables或show tables from database_name; -- 显示当前数据库中所有表的名称. 2.show databases; -- 显示mysql中所有数据库的名称. 3.show columns from table_name from database_name; 或show columns from database_name.table_na

详解:如何恢复MySQL数据库下误删的数据

2017-03-27 09:25 阅读 178 评论 0 作者:马哥Linux运维-Robin 血的教训,事发经过就不详述了.直接上操作步骤及恢复思路(友情提示:数据库的任何操作都要提前做好备份),以下是Mysql数据后的恢复过程: 1. 找到binlog 恢复数据的前提是必须开启Mysql的binlog日志,如果binlog日志没开启,请忽略此篇文档.binlog日志是否开启可以查看Mysql配置文件.日志位置一般在/var/lib/mysql目录或者编译安装的date目录下.也可登录Mysq

解决在MySQL使用PetaPoco T4生成数据的实体时得到当前MySQL数据库下所有表的错误方法

>问题症状 本来打算使用PetaPoco尝尝鲜,并且大大节省编写访问数据库代码的时间,哪知半天时间就送给了T4模板生成实体的错误上. 在准备好PetaPoco的配置后,一保存Database.tt文件就出现报错,大意是提醒某某表名已被定义,我一看,一个小小的数据库实体居然有3000多行!开始我以为是重复生成了,各种百度谷歌,没有一点答案.后来我仔细翻看生成的实体,发现生成的实体是我当前用户下所有数据库的所有表,因为有两个一样结构的数据库,所有导致字段重复才报错.于是继续谷歌,终于被我查出来原来是

python--同一mysql数据库下批量迁移数据

最近接手些mysql数据库维护,发现mysql在批量操作方面就是个渣渣啊,比起MS SQL SERVER简直就是“不可同日而语”. 咨询了下MySQL的高手,对于数据迁移这种问题,一种处理方式就是直接“一步到位” ,一次性将所有数据查询插入到另外一个表,然后再删除原表数据:另外一种处理方式就是使用pt--archiver工具来归档. 然并卵,“一步到位”法太刺激,pt--archiver工具用不顺手,由于目前大部分的表都以自增id为主键,以此为此为前提自己写个小脚本,厚脸拿出来供各位参考: #

MySQL数据库下统计记录数小于指定数值的数据

楼主在做一个智慧工地的产品,需要对工人进行一些数据统计,比如要统计导入人员数量小于30的工地,SQL应该怎么写呢? 首先了解一下数据结构,工地分三张表,四级层级关系,Organization表存储区域.城市两级,Projects表存储项目,Stages表存储分期:还有一个worker表存储人员.这4张表外键分别保存的上级表的id. 要查出工人小于30的工地大体步骤如下: 1.找出小于30人的工地分期id: 2.根据分期id外连接查出对应的工地全称: 3.根据工地的4级进行分组排序. 具体SQL如

PHP删除MySQL数据库下的所有数据表

<?php //[数据无价,请谨慎操作!] $hostname ='localhost';  $userid = 'username';  $password = 'password';  $dbname = 'dbname';  $connect = mysql_connect($hostname,$userid,$password);  mysql_select_db($dbname); $result = mysql_query("show table status from $db

mysql数据库下hibernate无法自动建表

mysql5使用的方言应为 <property name="dialect"> org.hibernate.dialect.MySQL5InnoDBDialect </property>

wamp集成环境下mysql数据库的分开部署和远程访问

今天折腾了一天一个小问题,就是明明正确的php代码在访问数据库的时候总是提示DB ERROR.后来才发现是填写数据库名的时候,写成了该数据库的ip地址(其实也是本机ip但是本机还是不能访问),而不是localhost. 归根到底这个问题的根源是mysql未开启远程访问,开启的具体方法为: D:\wamp\Apache2\conf\alias\phpmyadmin.conf 找到 deny from all allow from all 这两行删除改为 allow from all 另外,mysq

Linux服务器上安装MySql数据库(默认安装,密码为空),首次使用需要修改密码

1,在/etc/my.cnf末尾  加入skip-grant-tables,保存,跳过身份验证. 2,重启MySql,使刚才修改的配置生效. 3,终端输入mysql,然后再输入use mysql; 4,终端输入update mysql.user set authentication_string=password('123456') where user='root'; 5,在/etc/my.cnf末尾  去掉skip-grant-tables,保存. 6,重启MySql,终端输入 mysql