mysql语句随笔

一.常用数据库命令

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. 子查询:

http://www.cnblogs.com/loveyouyou616/archive/2012/12/21/2827655.html

https://www.cnblogs.com/zhuiluoyu/p/5822481.html

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.事务

 ```

猜你喜欢

转载自www.cnblogs.com/aaah/p/10167413.html
今日推荐