一.常用数据库命令

1.数据库(仓库)

show databases;

#查看当前使用数据库
select database();

#查看数据库使用端口
show variables  like 'port';

#查看数据库编码
show variables like 'character%';
#character_set_client      为客户端编码方式;
#character_set_connection  为建立连接使用的编码;
#character_set_database    为数据库的编码;
#character_set_results     为结果集的编码;
#character_set_server      为数据库服务器的编码;

2.选中并进入仓库

use 数据库名;

3.表

show tables;

#查看表结构
 desc 表名;

4.创建数据库

create database 数据库名;

5.drop 命令删除数据库

drop database 数据库名;

6.创建表

create table 表名 (字段名 字段类型 约束);

#1、not null:非空约束
#2、unique:唯一约束
#3、primary key:主键约束
#4、foreign key:外键
#5、check:检查---enum、set
#7、auto_increment:自增约束

7.删除表

drop table 表名 ;

 

二.常用增删改查(CURD)

1.插入数据

insert into 表名 ( 字段1, 字段2,...fieldN )
        values( 值1, 值2,...valueN ),
              ( 值1, 值2,...valueN ),
              ....

2.更新数据

update 表名
set 字段1=值1,字段2=值2,...
where 条件

3.删除数据

delete from 表名 [where 条件]
#如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。

4.查询数据

select 字段1,字段2... from 表名 where 条件

5.高级查询

1.where子句(and/or)(条件)

查询语句
where 条件1 [AND [OR]] 条件2.....

2.like子句(模糊查询)

查询语句
[where field1] like condition1 [AND [OR]] filed2 = 'somevalue'
# select * from pojo where 字段 like "%34%"
#SQL LIKE 子句中使用百分号 %字符来表示任意字符,类似于UNIX或正则表达式中的星号 *。
#如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。

3.union操作符[all| distinct]

 

# UNION 操作符用于连接两个以上的SELECT语句的结果组合到一个结果集合中。多个SELECT语句会删除重复的数据。 
#DISTINCT删除结果集中重复的数据.默认情况下UNION操作符已经删除重复数据,所以DISTINCT修饰符对结果没影响。
#ALL: 可选,返回所有结果集,包含重复数据。

SELECT 要检索的列1, 要检索的列2, ... 要检索的列-n
FROM 表名
[WHERE 条件]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];

4.排序(ORDER BY)

#(ASC 升序(从小到大,默认值),DESC 降序(从打到小))
SELECT 字段, 字段,...字段n from 表名
ORDER BY 字段1, [字段2...] [ASC [DESC]]

5.分组(GROUP BY)

1.分组

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
mysql> set names utf8;
mysql> SELECT * FROM employee_tbl;
+----+--------+---------------------+--------+
| id | name   | date                | singin |
+----+--------+---------------------+--------+
|  1 | 小明 | 2016-04-22 15:25:33 |      1 |
|  2 | 小王 | 2016-04-20 15:25:47 |      3 |
|  3 | 小丽 | 2016-04-19 15:26:02 |      2 |
|  4 | 小王 | 2016-04-07 15:26:14 |      4 |
|  5 | 小明 | 2016-04-11 15:26:40 |      4 |
|  6 | 小明 | 2016-04-04 15:26:54 |      2 |
+----+--------+---------------------+--------+
6 rows in set (0.00 sec)

接下来我们使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:

mysql> SELECT name, COUNT(*) FROM   employee_tbl GROUP BY name;
+--------+----------+
| name   | COUNT(*) |
+--------+----------+
| 小丽 |        1 |
| 小明 |        3 |
| 小王 |        2 |
+--------+----------+
3 rows in set (0.01 sec)

2 WITH ROLLUP(统计)

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

例如我们将以上的数据表按名字进行分组,再统计每个人登录的次数:

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

 

#参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回#为null(没意义)。
#以下实例中如果名字为空我们使用总数代替:
select coalesce(a,b,c);

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)

6. 子查询:



1.标量子查询

使用 = > < >= <= <> 这些操作符对子查询的标量结果进行比较,通常子查询的位置在比较式的右侧

SELECT * FROM article WHERE uid = (SELECT uid FROM user WHERE status=1 ORDER BY uid DESC LIMIT 1)

SELECT * FROM t1 WHERE column1 = (SELECT MAX(column2) FROM t2)

SELECT * FROM article AS t WHERE 2 = (SELECT COUNT(*) FROM article WHERE article.uid = t.uid)

2.MySQL 列子查询:

指子查询返回的结果集是 N 行一列,该结果通常来自对表的某个字段查询返回。 

可以使用 = > < >= <= <> 这些操作符对子查询的标量结果进行比较,通常子查询的位置在比较式的右侧      

可以使用 IN、ANY、SOME 和 ALL 操作符,不能直接使用 = > < >= <= <> 这些比较标量结果的操作符。      

SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=1)
SELECT s1 FROM table1 WHERE s1 > ANY (SELECT s2 FROM table2)
SELECT s1 FROM table1 WHERE s1 > ALL (SELECT s2 FROM table2)

NOT IN 是 <> ALL 的别名,二者相同。      

特殊情况        

如果 table2 为空表,则 ALL 后的结果为 TRUE;        

如果子查询返回如 (0,NULL,1) 这种尽管 s1 比返回结果都大,但有空行的结果,则 ALL 后的结果为 UNKNOWN 。      

注意:对于 table2 空表的情况,下面的语句均返回 NULL:

SELECT s1 FROM table1 WHERE s1 > (SELECT s2 FROM table2)
SELECT s1 FROM table1 WHERE s1 > ALL (SELECT MAX(s1) FROM table2)

 

3. MySQL 行子查询:

指子查询返回的结果集是一行 N 列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集。

SELECT * FROM table1 WHERE (1,2) = (SELECT column1, column2 FROM table2)
注:(1,2) 等同于 row(1,2)
SELECT * FROM article WHERE (title,content,uid) = (SELECT title,content,uid FROM blog WHERE bid=2)

4. MySQL 表子查询:

指子查询返回的结果集是 N 行 N 列的一个表数据。

SELECT * FROM article WHERE (title,content,uid) IN (SELECT title,content,uid FROM blog)

 

7. 连接

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

  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
  • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
  • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
左表
+---------------+--------------+
| runoob_author | runoob_count |
+---------------+--------------+
| 书本  | 10           |
| cnblogs.com    | 20           |
| Google        | 22           |
+---------------+--------------+
右表
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title  | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 1         | 学习 PHP        | 书本      | 2017-04-12      |
| 2         | 学习 MySQL      | 书本      | 2017-04-12      |
| 3         | 学习 Java       |cnblogs.com| 2015-05-01     |
| 4         | 学习 Python     |cnblogs.com| 2016-03-06     |
| 5         | 学习 C          | FK            | 2017-04-05      |
+-----------+---------------+---------------+-----------------+

 

INNER JOIN(内连接)

#(也可以省略 INNER 使用 JOIN,效果一样)
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;

LEFT JOIN(左连接)

MySQL LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。

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;

 

+-------------+-----------------+----------------+
| a.runoob_id | a.runoob_author | b.runoob_count |
+-------------+-----------------+----------------+
| 1           | 书本         | 10             |
| 2           | 书本        | 10             |
| 3           | RUNOOB.COM      | 20             |
| 4           | RUNOOB.COM      | 20             |
| 5           | FK              | NULL           |
+-------------+-----------------+----------------+

RIGHT JOIN(右连接)

 RIGHT JOIN 会读取右边数据表的全部数据,即便左边边表无对应数据。

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;

 

+-------------+-----------------+----------------+
| a.runoob_id | a.runoob_author | b.runoob_count |
+-------------+-----------------+----------------+
| 1           | 书本    	| 10             |
| 2           | 书本    	| 10             |
| 3           | RUNOOB.COM      | 20             |
| 4           | RUNOOB.COM      | 20             |
| NULL        | NULL            | 22             |
+-------------+-----------------+----------------+

6.正则表达式

模式

描述

^

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

查找name字段中以'st'为开头的所有数据:

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

查找name字段中以'ok'为结尾的所有数据:

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

查找name字段中包含'mar'字符串的所有数据:

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';

查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据:

mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

7.事务

 ```