MySQL

Posted 小企鹅推雪球!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL相关的知识,希望对你有一定的参考价值。

LIKE子句

  1. 使用 SQL SELECT 命令来读取数据, 同时\\可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录。
  2. WHERE 子句中可以使用等号 (=) 来设定获取数据的条件,如 “author = ‘ryx’”。
  3. 有时候我们需要获取 author 字段含有 “ry” 字符的所有记录,这时我们就需要在 WHERE 子句中使用 SQL LIKE 子句。
  4. SQL LIKE 子句中使用百分号(%)字符来表示任意字符,类似于UNIX或正则表达式中的星号 (*)。
  5. 如果没有使用百分号(%), LIKE 子句与等号(=)的效果是一样的。
  6. LIKE的语法:
SELECT field1, field2,...fieldN 
FROM table_name1, table_name2...
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
  1. 可以在WHERE子句中指定任何条件
  2. 可以在WHERE子句中使用LIKE子句。
  3. 可以使用LIKE子句代替等号(=)。
  4. LIKE 通常与 % 一同使用,类似于一个元字符的搜索。
  5. 可以使用AND或者OR指定一个或多个条件。
  6. 可以在 DELETE 或 UPDATE 命令中使用
  7. WHERE…LIKE 子句来指定条件。

在命令行中使用LIKE子句

  1. 使用 WHERE…LIKE 子句来从mysql数据表 mytest 中读取数据。
  2. 将mytest表中获取author字段中以"r"为开头的所有记录:
mysql> select * from mytest;
+----+--------+--------+------------+
| id | title  | author | date       |
+----+--------+--------+------------+
|  1 | mytest | ryx    | 2021-09-19 |
+----+--------+--------+------------+
1 row in set (0.00 sec)

mysql> select * from mytest
    -> where author like 'r%';
+----+--------+--------+------------+
| id | title  | author | date       |
+----+--------+--------+------------+
|  1 | mytest | ryx    | 2021-09-19 |
+----+--------+--------+------------+
1 row in set (0.00 sec)

mysql>

mysql排序

  1. 使用SQL SELECT 语句来读取数据并对读取的数据进行排序,可以使用MySQL的 ORDER BY 子句来设定你想按哪个字段哪中方式来进行排序,再返回搜索结果。
  2. 使用 ORDER BY 子句将查询数据排序后再返回数据:
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
  1. 可以使用任何字段作为排序的条件,从而返回排序后的查询结果。
  2. 可以设定多个字段进行排序
  3. 可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,ASC 是按升排列。
  4. 可以添加 WHERE…LIKE 子句来设置条件。
mysql> select stu_id from stu_02 where stu_id<184804010;
+-----------+
| stu_id    |
+-----------+
| 184804001 |
| 184804002 |
| 184804003 |
| 184804004 |
| 184804005 |
| 184804006 |
| 184804007 |
| 184804008 |
| 184804009 |
+-----------+
9 rows in set (0.00 sec)


mysql> select stu_id from stu_02 where stu_id<184804010 ORDER BY stu_id DESC;
+-----------+
| stu_id    |
+-----------+
| 184804009 |
| 184804008 |
| 184804007 |
| 184804006 |
| 184804005 |
| 184804004 |
| 184804003 |
| 184804002 |
| 184804001 |
+-----------+
9 rows in set (0.00 sec)

mysql分组

  1. GROUP BY 语句根据一个或多个列对结果集进行分组。
  2. 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。
  3. GROUP BY 语法
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
  1. 使用 GROUP BY 语句 将数据表按性别进行分组,并统计女生有多少
mysql> select sex,name from stu_01
    -> where sex = '女'
    -> group by name;
+------+--------+
| sex  | name   |
+------+--------+
| 女   | 李青 |
| 女   | 刘芳 |
| 女   | 刘佳 |
| 女   | 刘琦 |
| 女   | 刘涵 |
| 女   | 罗曦 |
| 女   | 秦然 |
| 女   | 邵珂 |
| 女   | 王雪 |
| 女   | 雨晴 |
| 女   | 张洁 |
| 女   | 张婷 |
+------+--------+

使用 WITH ROLLUP

  1. WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。

  2. 使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:select coalesce(a,b,c);

  3. 参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。

实例中如果名字为空我们使用总数代替:

mysql> SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;
+--------------------------+--------------+
| coalesce(name, '总数') | singin_count |
+--------------------------+--------------+
| 小丽                   |            2 |
| 小明                   |            7 |
| 小王                   |            7 |
| 总数                   |           16 |
+--------------------------+--------------+
4 rows in set (0.01 sec)

mysql连接

  1. mysql连接从多个数据表中读取数据。
  2. 使用 MySQL 的 JOIN 在两个或多个表中查询数据
  3. 在SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。

JOIN 按照功能大致分为如下三类:

  1. INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
  2. LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
  3. RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

在mytest数据库中有两张表 stu_1和 stu_2。两张数据表数据如下:

mysql> SELECT * FROM stu_1;
+-----------------+----------------+
| stu_1_author | stu_1_count |
+-----------------+----------------+
| mahran          |             20 |
| mahnaz          |           NULL |
| Jen             |           NULL |
| Gill            |             20 |
| John Poul       |              1 |
| Sanjay          |              1 |
+-----------------+----------------+
6 rows in set (0.01 sec)
mysql> SELECT * from stu_2;
+-------------+----------------+-----------------+-----------------+
|  stu_2_id | w3cschool_title | stu_2_author | submission_date |
+-------------+----------------+-----------------+-----------------+
|           1 | Learn php      | John Poul       | 2007-05-24      |
|           2 | Learn MySQL    | Abdul S         | 2007-05-24      |
|           3 | JAVA Tutorial  | Sanjay          | 2007-05-06      |
+-------------+----------------+-----------------+-----------------+
3 rows in set (0.00 sec)
mysql>
  1. 使用MySQL的INNER JOIN(也可以省略 INNER 使用 JOIN,效果一样)来连接以上两张表来读取stu_1表中所有stu_1author字段在tstu_2表对应的stu_2_count字段值
mysql> SELECT stu_1_id, stu_1_author, stu_2_count FROM stu_1 INNER JOIN stu_2 ON  stu_1_author = stu_2_author;
+-----------+---------------+--------------+
| stu_1_id| stu_1_author| stu_2_count |
+-----------+---------------+--------------+
|         1 | John Poul     |            1 |
|         3 | Sanjay        |            1 |
+-----------+---------------+--------------+
2 rows in set (0.00 sec)

mysql LEFT JOIN

  1. MySQL left join 与 join 有所不同。 MySQL LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
  2. 以 stu_1为左表,tcount_tbl 为右表,理解MySQL LEFT JOIN的应用:
mysql> SELECT  stu_1_id,  stu_1_author,  stu_2_count FROM  stu_1 LEFT JOIN tcount_tbl  ON  stu_1_author =  stu_2_author;
+-------------+-----------------+----------------+
| stu_1_id| stu_1_author| stu_2_count |
+-------------+-----------------+----------------+
|           1 | John Poul       |              1 |
|           2 | Abdul S         |           NULL |
|           3 | Sanjay          |              1 |
+-------------+-----------------+----------------+
3 rows in set (0.02 sec)
  1. 使用了LEFT JOIN,该语句会读取左边的数据表stu_1的所有选取的字段数据,即便在右侧表tcount_tbl中没有对应的stu_1_author字段值。

MySQL RIGHT JOIN

  1. MySQL RIGHT JOIN 会读取右边数据表的全部数据,即便左边边表无对应数据。
  2. 以 tcount_tbl 为左表,stu_1为右表,理解MySQL RIGHT JOIN的应用:
mysql> SELECT  stu_1_id,  stu_1_author,  stu_2_count FROM  tcount_tbl RIGHT JOIN stu_1 ON  stu_1_author =  stu_2_author;
+-------------+-----------------+----------------+
| stu_1_id| stu_1_author| stu_2_count |
+-------------+-----------------+----------------+
|           1 | John Poul       |              1 |
|           2 | Abdul S         |           NULL |
|           3 | Sanjay          |              1 |
+-------------+-----------------+----------------+
3 rows in set (0.02 sec)
  1. 使用了 RIGHT JOIN,该语句会读取右边的数据表 stu_1的所有选取的字段数据,即便在左侧表tcount_tbl中没有对应的stu_1_author字段值。

mysql NULL值处理

  1. MySQL使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。

为了处理这种情况,MySQL提供了三大运算符:

  1. IS NULL: 当列的值是NULL,此运算符返回true。
  2. IS NOT NULL: 当列的值不为NULL, 运算符返回true。
  3. <=>: 比较操作符(不同于=运算符),当比较的的两个值为NULL时返回true。

注意:

  1. NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值
  2. 在MySQL中,NULL值与任何其它值的比较(即使是NULL)永远返回false,即 NULL = NULL 返回false
  3. MySQL中处理NULL使用IS NULL和IS NOT NULL运算符。

mysql正则表达式

  1. 在mysql中可以通过LIKE …% 来进行模糊匹配。
  2. MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正则表达式匹配。
  3. 正则模式可应用于 REGEXP 操作符中。

  1. 查找name字段中以’st’为开头的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';

  1. 查找name字段中以’ok’为结尾的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
  1. 查找name字段中包含’mar’字符串的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';
  1. 查找name字段中以元音字符开头或以’ok’字符串结尾的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

mysql事务

  1. MySQL 事务主要用于处理操作量大,复杂度高的数据
  2. 比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
  3. 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
  4. 事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。
  5. 事务用来管理 insert , update , delete 语句。

事务的特性

  1. 一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性或不可分割性)、Consistency(一致性)、Isolation(隔离性或独立性)、Durability(持久性)
  2. 原子性:一组事务,要么成功;要么撤回,即事务在执行过程中出错会回滚到事务开始前的状态。
  3. 一致性 : 一个事务不论是开始前还是结束后,数据库的完整性都没有被破坏。因此写入的数据必须完全符合所有预设规则(资料精确度、串联性以及后续数据库能够自发完成预定工作)。
  4. 隔离性:数据库允许多个事务并发的同时对其数据进行读写修改等操作,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离可分为:Read uncommitted(读未提交)、Read committed(读提交)、Repeatable read(可重复读)、Serializable(串行化)。
  5. 持久性:事务在处理结束后对数据做出的修改是永久的,无法丢失。

事务控制语句:

  1. 显式的开始一个事务 start transaction 或者begin
  2. 做保存点,一个事务中可以有多个保存点:savepoint 保存点名称
  3. 提交事务,并使数据库中进行的所有修改成为永久性的:commitcommit work
  4. 回滚结束用户的事务,并撤销正在进行的所有未提交的修改:rollbackrollback work
  5. 删除一个事务的保存点,若没有指定保存点,执行该语句操作会抛错。release savepoint 保存点名称
  6. 将事务滚回标记点 rollback to 标记点
  7. 设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE
set transaction

事务处理方法

  1. 用begin,rollback,commit来实现事务处理
  2. 用set改变mysql的自动提交模式
set autocommit = 0 (禁止自动提交)。
set autocommit = 1 (开启自动提交)。

以上是关于MySQL的主要内容,如果未能解决你的问题,请参考以下文章

从mysql的片段中加载ListView

连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段

使用 json rereiver php mysql 在片段中填充列表视图

关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段

修改MySQL密码报错“ERROR 1819 (HY000): Your password does not satisfy the current policy requirements“(代码片段

mysql查看版本的四种方法