8.MySQL数据操作语句

1.增加记录(INSERT)

INSERT语法
增加记录(按列顺序)INSERT [INTO] 表名 VALUES (值1, 值2,….);
增加记录(特定列)INSERT [INTO] 表名 (列名1, 列名2,…) VALUES (值1, 值2,….);
复制已存在表1数据到已存在表2(全部列)INSERT [INTO] 已存在表2 SELECT * FROM 已存在表1;
复制已存在表1数据到已存在表2(特定列)INSERT [INTO] 已存在表2 (列名1, 列名2,…) SELECT 列名1, 列名2,… FROM 已存在表1;

2.更改记录(UPDATE)

UPDATE语法
更改记录UPDATE 表名 SET 列名 = 新值 WHERE 条件;

3.删除记录(DELETE)

DELETE语法
删除记录(所有列)DELETE FROM 表名;
删除记录(特定列)DELETE FROM 表名 WHERE 条件;

4.查询记录(SELECT)

4.1常规查询

//查询所有列的记录
SELECT * FROM 表名;
//查询特定列的记录
SELECT 列名1,列名2 FROM 表名;

4.2条件查询

WHERE条件用于规定SELECT查询的标准。

查询语法
条件查询SELECT 列名 FROM 表名 WHERE 条件;
条件查询(AND|OR)SELECT 列名 FROM 表名 WHERE 条件1 AND|OR 条件2;
条件查询(IN)SELECT 列名 FROM 表名 WHERE 列名 IN (值1,值2,..);
条件查询(BETWEEN..AND)SELECT 列名 FROM 表名 WHERE 列名 BETWEEN 值1 AND 值2;
条件查询(NOT BETWEEN..AND)SELECT 列名 FROM 表名 WHERE 列名 NOT BETWEEN 值1 AND 值2;
条件查询(IS NULL)SELECT 列名 FROM 表名 WHERE 列名 IS NULL;
条件查询(IS NOT NULL)SELECT 列名 FROM 表名 WHERE 列名 IS NOT NULL;
带LIKE模式匹配的查询语法
条件查询(LIKE)SELECT 列名 FROM 表名 WHERE 列名 LIKE pattern;
条件查询(NOT LIKE)SELECT 列名 FROM 表名 WHERE 列名 NOT LIKE pattern;
Pattern解释
下画线(_只能一个字符
百分号(%任意数量的字符(包括0个)
//LIKE模式匹配示例

//查找以 b 开头的名字
mysql> SELECT * FROM pet WHERE name LIKE 'b%';

//查询以 fy 结尾的名字
mysql> SELECT * FROM pet WHERE name LIKE '%fy';

//查询包含 w 的名字
mysql> SELECT * FROM pet WHERE name LIKE '%w%';

//查询恰好包含五个字符的名字
mysql> SELECT * FROM pet WHERE name LIKE '_____';

4.4去重查询

SELECT DISTINCT 列名 FROM 表名;

4.5排序查询

//ASC升序,DESC降序
SELECT 列名 FROM 表名 ORDER BY 列名 [ASC|DESC];

4.6限制查询

LIMIT:返回的最大行数,OFFSET:排除的行数,总行数=LIMIT+OFFSET。

//位置偏移为0的限制查询
SELECT 列名 FROM 表名 LIMIT row_count;
//带位置偏移的限制查询
SELECT 列名 FROM 表名 LIMIT offset,row_count;
//带位置偏移的限制查询的另一种语法
SELECT 列名 FROM 表名 LIMIT row_count OFFSET offset;

4.7分组查询

//GROUP BY分组查询,WITH ROLLUP计算所有查询记录的总和
SELECT 列名1,函数(列名2) FROM 表名 GROUP BY 列名1[WITH ROLLUP];
//带HAVING条件的GROUP BY分组查询
SELECT 列名1,函数(列名2) FROM 表名 GROUP BY 列名1 HAVING 函数(列名2)<2000;

4.8连表查询

ON用于指定如何连接表的条件,而WHERE限制要包含在结果集中的行。

//指定两个表中必须存在的列列表
a LEFT JOIN b USING (c1, c2, c3)
查询语法
JOINSELECT 表名1.列名1, 表名1.列名2, 表名2.列名1 FROM 表名1 JOIN (表名2, 表名3) ON (表名1.列名1 = 表名2.列名1 AND 表名1.列2=表名3.列2) WHERE 条件;
INNER JOIN同JOIN
CROSS JOIN同JOIN
STRAIGHT_JOINSTRAIGHT_JOINJOIN类似,不同的是总是先读取左表,再读取右表。这可以用于连接优化器以次优顺序处理表的情况(少数情况)。
LEFT [OUTER] JOINSELECT 表名1.列名1, 表名1.列名2, 表名2.列名1 FROM 表名1 LEFT JOIN (表名2, 表名3) ON (表名1.列名1 = 表名2.列名1 AND 表名1.列2=表名3.列2) WHERE 条件;
RIGHT [OUTER] JOINSELECT 表名1.列名1, 表名1.列名2, 表名2.列名1 FROM 表名1 RIGHT JOIN (表名2, 表名3) ON (表名1.列名1 = 表名2.列名1 AND 表名1.列2=表名3.列2) WHERE 条件;
NATURAL [LEFT] JOINNATURAL JOIN等同于带USING子句的INNER JOIN,NATURAL LEFT JOIN等同于带USING子句的LEFT JOIN,即两个表中都存在的列列表。

4.9合并查询

查询语法
UNIONSELECT 列名 FROM 表名1 UNION SELECT 列名 FROM 表名2;
UNION ALLSELECT 列名 FROM 表名1 UNION ALL SELECT 列名 FROM 表名2;

4.10行级锁

SELECT * FROM t1, t2 FOR SHARE OF t1 FOR UPDATE OF t2;
[FOR {UPDATE | SHARE}
        [OF tbl_name [, tbl_name] ...]
        [NOWAIT | SKIP LOCKED]
      | LOCK IN SHARE MODE]

如果FOR UPDATE与使用页锁或行锁的存储引擎一起使用,查询检查的行将被写锁定,且不能读取或查询,直到当前事务结束。

FOR SHARELOCK IN SHARE MODE设置共享锁,允许其他事务读取检查的行但不能更新或删除它们。FOR SHARELOCK IN SHARE MODE是等价的。FOR SHARELOCK IN SHARE MODE的替代品 ,但LOCK IN SHARE MODE用于向后兼容。但是,FOR SHARE和 FOR UPDATE一样,支持 NOWAITSKIP LOCKED和 OF tbl_name

NOWAIT导致FOR UPDATEFOR SHARE查询立即执行,如果由于另一个事务持有的锁而无法获得行锁,则返回错误。

SKIP LOCKED导致FOR UPDATEFOR SHARE查询立即执行,不包括结果集中被另一个事务锁定的行。

4.11备份

//将查询结果存储到变量中
SELECT ... INTO @变量名;
//将查询结果写入文件中
SELECT ... INTO OUTFILE '文件路径';
//将单行写入文件而不进行任何格式化
SELECT ... INTO DUMPFILE '文件路径';

5.子查询

子查询是指嵌套在另一个语句(SELECT、UPDATE、DELETE语句)内的SELECT语句,且可以进行多层嵌套。子查询必须始终出现在括号内。

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

SELECT * FROM t1是外部查询(outer query)或外部语句(outer statement),SELECT column1 FROM t2是子查询。

查询语法
行子查询SELECT * FROM t1 WHERE (col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
SELECT * FROM t1 WHERE ROW(col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
ANY子查询SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);
SOME子查询SELECT s1 FROM t1 WHERE s1 > SOME (SELECT s1 FROM t2);
IN子查询(= ANY的别名)SELECT s1 FROM t1 WHERE s1 IN (SELECT s1 FROM t2);
NOT IN子查询(<> ALL的别名)SELECT s1 FROM t1 WHERE s1 NOT IN (SELECT s1 FROM t2);
ALL子查询SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2);
EXISTS子查询SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);
NOT EXISTS子查询SELECT column1 FROM t1 WHERE NOT EXISTS (SELECT * FROM t2);
相关子查询SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2 WHERE t2.column2 = t1.column2);

6.CALL语句

CALL 存储过程名(参数);

7.REPLACE语句

MySQL通过检测PRIMARY KEYUNIQUE索引来判断是否是重复项。

如果新主键的值在表中不存在相等的老主键的值,则 REPLACE 等同于 INSERT。

如果新主键的值与表中的老主键的值相等,此时引发重复项,则 REPLACE 等同于 DELETE + INSERT,首先会先删除老记录,然后插入新记录(插入前后主键值不变)。

REPLACE INTO 表名 VALUES (值1, 值2, 值3);
REPLACE INTO 表名(列1, 列2, 列3) VALUES (值1, 值2, 值3);

8.TABLE语句

TABLE [临时]表名 [ORDER BY 列名] [LIMIT 数字 [OFFSET 数字]];

TABLE语句在某些方面的行为类似于SELECT语句。 

TABLE 表名;

//等同于
SELECT * FROM 表名;

TABLE语句区别于SELECT语句的两个关键方面:

  • TABLE始终显示表的所有列。
  • TABLE不允许对行进行任何任意过滤,即TABLE 不支持任何WHERE子句。

9.VALUES语句

VALUES返回一组一个或多个行作为表。换句话说,它是一个表值构造函数,也可以作为一个独立的 SQL 语句。

ROW()内的值列表的值数量必须相同。

VALUES ROW(值1, 值2), ROW(值3, 值4) [ORDER BY column_designator] [LIMIT 数字];
mysql> VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8);
+----------+----------+----------+
| column_0 | column_1 | column_2 |
+----------+----------+----------+
|        1 |       -2 |        3 |
|        5 |        7 |        9 |
|        4 |        6 |        8 |
+----------+----------+----------+
3 rows in set (0.00 sec)

10.别名

别名语法
表别名表名  AS 表别名;
列别名列名 AS 列别名;(注意:当AS左侧的列名不存在的时候,AS会使用右侧的列别名新增列名,使用左侧的列名赋予默认值)
记录别名VALUES (列名1新值, 列名2新值) AS 记录别名;
函数别名COUNT(*) AS 别名;

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/basic/mysql/17172.html

(0)
上一篇 2022年9月7日 19:49
下一篇 2022年9月9日 21:54

相关推荐

  • 11.MySQL正则表达式

    MySQL 使用 Unicode 国际组件 (ICU) 实现正则表达式支持,它提供完整的 Unicode 支持并且是多字节安全的。 下面的列表涵盖了一些可以在正则表达式中使用的基本特殊字符和结构,有关用于实现正则表达式支持的 ICU 库支持的完整正则表达式语法的信息,请访问 International Com…

    MySQL教程 2022年9月13日
    0790
  • 1.安装MySQL和phpMyAdmin的步骤(Ubuntu)

    1.配置MySQL源 首先到https://dev.mysql.com/downloads/repo/apt/,下载对应的 MySQL APT 存储库并安装。 2.安装MySQL 在安装过程中,要求您为数据库根用户root用户提供密码以进行MySQL安装。 在Ubuntu下安装MySQL后,会自动注册为服务,并随操作系…

    MySQL教程 2022年9月1日
    09480
  • 5.MySQL、JDBC、Java数据类型对应关系

    MySQL Type Name Return value of GetColumnTypeName Return value of GetColumnClassName BIT(1) BIT java.lang.Boolean BIT( > 1) BIT byte[] TINYINT(1) S…

    MySQL教程 2022年9月5日
    0610

发表回复

登录后才能评论