MySQL 入门常用命令大全

Posted 恋喵大鲤鱼

tags:

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

文章目录

1.mysql 命令简介

mysql 命令是 MySQL 数据库的客户端应用程序,用于解释执行 SQL 语句。

2.mysql 命令选项

mysql 命令格式:

mysql [options] dbName

mysql 命令选项:

--help, -?
	显示 mysql 命令的帮助信息
-A, --no-auto-rehash
	不对数据表名与列名重新建立hash,因此禁用了数据表名和列名的自动补全功能,提高了use [dbname]命令的效率
-B, --batch
	不使用历史文件,禁用交互。mysql 命令交互过程会将用户的所有输入记录在一个隐藏文件 /root/.mysql_history。每次使用 quit 退出 mysql 交互模式时,会将交互过程中的所有命令操作一次性写入 /root/.mysql_history 这个隐藏文件中。下次一登录 mysql 时,可以使用键盘的向上键获取历史命令。类似于shell获取历史命令。-B 一般用于 Shell 脚本中执行 sql 语句,命令行模式下需要与 mysql 进行交互,故不使用
-N, --skip-column-names
	查询结果不输出列名

使用man mysqlmysql --help可查看更加详细的 mysql 命令选项说明。

常用命令选项:
(1)命令行交互模式下使用-A
(2)Shell 脚本用于执行 sql 语句时使用-NBA

3.SQL 的六种子语言

SQL(Structured Query Language)是结构化查询语言,也是一种高级的非过程化编程语言。SQL语句可用于增删查改数据以及管理关系型数据库,并不局限于数据查询。

关于SQL的组成部分,网上的资料也是众说纷纭,有些将SQL分为四个子语言,DQL纳入DML的一部分,也有些没有TCL,因为没有参考到较权威的资料,目前按照百度百科的说法,SQL主要由六个子语言组成,分别是 DDL、DQL、DML、DCL、TCL(TPL)和 CCL,下面将一一讲解。

(1)DCL(Data Control Language,数据控制语言)
用于对数据库,数据表的访问角色和权限的控制等。

GRANT - 授权 
REVOKE - 撤销授权 
DENY - 拒绝授权

(2)DDL(Data Definition Language,数据定义语言)
DDL用于定义数据库的三级结构,包括外模式、概念模式、内模式及其相互之间的映像,定义数据的完整性约束、安全控制等。使我们有能力创建、修改和删除表格。也可以定义索引和键,规定表之间的链接,以及施加表之间的约束。DDL不需要commit,主要操作有:

CREATE - 创建
ALTER - 修改
DROP - 删除
TRUNCATE - 截断
COMMENT - 注释
RENAME - 重命名

(3)DQL(Data Query Language,数据查询语言)
其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词。常用的关键字有:

SELECT-从数据库表中获取数据 
FROM - 指定从哪个数据表或者子查询中查询
WHERE - 指定查询条件
GROUP BY - 结合合计函数,根据一个或多个列对结果集进行分组
HAVING - 对分组后的结果集进行筛选
ORDER BY - 对结果集进行排序
LIMIT - 对结果集进行top限制输出
UNION - 结果集纵向联合
JOIN - 结果集横向拼接

(4)DML(Data Manipulation Language,数据操作语言)
供用户对数据库中数据的操作,包括数据的增加、删除、更新,载入等操作。

UPDATE - 更新数据库表中的数据 
DELETE - 从数据库表中删除数据 
INSERT INTO - 向数据库表中插入数据
REPLACE INTO- 向数据库表中插入数据,如果存在先删除
LOAD - 载入数据

(5)TCL(Transaction Control Language,事务控制语言)
又名TPL(Transaction Process Language)事务处理语言,它能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括:

START TRANSACTION 或 BEGIN - 开始事务
SAVEPOINT - 在事务中设置保存点,可以回滚到此处
ROLLBACK - 回滚 
COMMIT - 提交
SET TRANSACTION – 改变事务选项

(6)CCL(Cursor Control Language,游标控制语言)
游标(cursor)是DBMS为用户开设的一个数据缓冲区,存放SQL语句的执行结果。游标控制语言对游标的操作主要有:

DECLARE CURSOR - 申明游标
OPEN CURSOR - 打开游标
FETCH INTO - 取值
UPDATE WHERE CURRENT - 更新游标所在的值
CLOSE CURSOR - 关闭游标

下面将从上面的六个子语言来陈述MySQL的常用SQL语句和MySQL的相关命令。

4.MySQL常用命令

本人使用MySQL版本是5.1.61,下面所有命令均在本版本MySQL测试通过,如遇到问题,请留言探讨!

4.1 MySQL准备篇

4.1.1 连接到本地MySQL

首先打开shell命令终端或者命令行程序,键入命令mysql -u root -p,回车后提示输入密码。注意用户名和密码与命令选项之间的空格可有可无。

mysql -u[username] -p[password] -A # 中括号中的变量需要替换指定值

如果刚安装好MySQL,超级用户root没有密码,直接回车即可进入MySQL,MYSQL的提示符是: mysql>。mysql命令结束使用分号;或者\\g。

命令选项-A(–no-auto-rehash)的作用是禁止数据表自动补全。如果数据库数据表很多,当我们打开数据库时,即use dbname时,需要对数据表进行预处理以满足自动补全的功能,将会很耗时。使用-A可禁止该操作。

4.1.2 连接到远程主机上的 MySQL

假设远程主机的IP为:110.110.110.110,用户名为root,密码为abc123。则键入以下命令:

mysql -h110.110.110.110 -uroot -p123;

注:h与IP地址、u与root之间可以不用加空格,p也一样。

4.1.3 退出 MySQL

mysql> exit;
# 或
mysql> quit;

4.1.4 查看 MySQL 版本

mysql> select version();
# 或者
mysql> status;

4.2 DCL篇(数据控制篇)

4.2.1 新建用户

# 命令格式
mysql> create user [username]@[host] identified by [password];

# 示例
mysql> create user lvlv@localhost identified by 'lvlv';
mysql> create user lvlv@192.168.1.1 identified by 'lvlv';
mysql> create user lvlv@"%" identified by 'lvlv';
mysql> CREATE USER lvlv@"%";

说明:
username – 你将创建的用户名;
host – 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%。
password – 该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆MySQL服务器。

创建的用户用户信息存放于mysql.user数据表中。

4.2.2 删除用户

# 命令格式
mysql> DROP USER [username]@[host];

# 示例
mysql> DROP USER lvlv@localhost;

说明:删除用户时,主机名要与创建用户时使用的主机名称相同。

4.2.3 用户授权

# 命令格式
mysql> GRANT [privileges] ON [databasename].[tablename] TO [username]@[host];

# 示例
mysql> GRANT select ON *.* TO lvlv@'%';
mysql> GRANT ALL ON *.* TO lvlv@'%';

# 最后不要忘了刷新权限
mysql> flush privileges;

说明:
(1)privileges – 是一个用逗号分隔的赋予MySQL用户的权限列表,如SELECT , INSERT , UPDATE 等(详细列表见该文末附录1)。如果要授予所有的权限则使用ALL;databasename – 数据库名,tablename-表名,如果要授予该用户对所有数据库和表的相应操作权限则可用*表示,如*.*。

(2)使用GRANT为用户授权时,如果指定的用户不存在,则会新建该用户并授权。设置允许用户远程访问MySQL服务器时,一般使用该命令,并指定密码。

# 示例
mysql> GRANT select ON *.* TO lvlv@'%' identified by '123456';

4.2.4 撤销用户权限

# 命令格式
mysql> REVOKE [privileges] ON [databasename].[tablename] FROM [username]@[host];

# 示例
mysql> REVOKE SELECT ON *.* FROM lvlv@'%';
mysql> REVOKE ALL ON *.* FROM 'lvlv'@'%';

说明:
(1)privilege, databasename, tablename – 同授权部分。

(2)假如你在给用户'pig'@'%'授权的时候是这样的(或类似 的):GRANT SELECT ON test.user TO 'pig'@'%’, 则在使用 REVOKE SELECT ON *.* FROM ‘pig’@'%’;命令并不能撤销该用户对test数据库中user表的SELECT 操作。相反,如果授权使用的是GRANT SELECT ON *.* TO 'pig'@'%’;REVOKE SELECT ON test.user FROM 'pig'@'%';命令也不能撤销该用户对test数据库中user表的select权限。

具体信息可以用命令SHOW GRANTS FOR 'pig'@'%'; 查看。

4.2.5 查看用户权限

方法一:可以从mysql.user表中查看所有用户的信息,包括用户的权限。

mysql>select * from mysql.user where user='username' \\G

方法二:查看给用户的授权信息。

# 命令格式
mysql> show grants for [username]@[host];

# 示例
mysql> show grants for lvlv@localhost;
mysql> show grants for lvlv;

说明:不指定主机名称,默认为任意主机"%"。

4.2.6 修改用户密码

方法一:使用SQL语句。

# 命令格式:
mysql> SET PASSWORD FOR [username]@[host]= PASSWORD([newpassword]);

# 示例
mysql> set password for lvlv@localhost=password('123456');

如果是当前登录用户:

mysql> SET PASSWORD = PASSWORD("newpassword");

方法二:使用服务端工具mysqladmin来修改用户密码。

# 命令格式
mysqladmin -u[username] -p[oldpassword] password [newpassword]

# 示例
mysqladmin -ulvlv -p123456 password "123321"

4.3 DDL 篇(数据定义篇)

4.3.1 创建数据库

# 命令格式
mysql> create database [databasename];

# 示例
mysql> create database Student;

4.3.2 删除数据库

# 命令格式
mysql> drop database [databasename];

# 示例
mysql> drop database Student;

4.3.3 查看所有数据库

mysql> show databases;

4.3.4 查看当前数据库

mysql> select database();

# 或者
mysql> status;

4.3.5 连接数据库

# 命令格式
mysql> use [databasename]

# 示例
mysql> use Student;

4.3.6 创建数据表

命令格式:

mysql> create table [表名] ( [字段名1] [类型1] [is null] [key] [default value] [extra] [comment],
...
)[engine] [charset];

说明: 上面的建表语句命令格式,除了表名,字段名和字段类型,其它都是可选参数,可有可无,根据实际情况来定。is null表示该字段是否允许为空,不指明,默认允许为NULL;key表示该字段是否是主键,外键,唯一键还是索引;default value表示该字段在未显示赋值时的默认值;extra表示其它的一些修饰,比如自增auto_increment;comment表示对该字段的说明注释;engine表示数据库存储引擎,MySQL支持的常用引擎有ISAM、MyISAM、Memory、InnoDB和BDB(BerkeleyDB),不显示指明默认使用MyISAM;charset表示数据表数据存储编码格式,默认为latin1。

存储引擎是什么? 其实就是如何实现存储数据,如何为存储的数据建立索引以及如何更新,查询数据等技术实现的方法。

主键(Primary Key)与唯一键(Unique Key)的区别:
(1)主键的一个或多个列必须为NOT NULL,而唯一键可以为NULL;
(2)一个表只能有一个主键,但可以有多个唯一键。

以学生表为例,演示数据表的创建。

学生表设计:
|字段(Field)|类型(Type)|可空(Null)|键(Key)| 其他(Extra)|
|----|—|—|—|—|—|
|学号(studentNo)|INT UNSIGNED|NOT NULL|PRI|auto_increment|
|姓名(name)|VARCHAR(12)|NOT NULL|N ||
|学院(school)|VARCHAR(12)|NOT NULL|N||
|年级(grade)|VARCHAR(12)|NOT NULL|N||
|专业(major)|VARCHAR(12)|NOT NULL|N||
|性别(gender)| Boolean|NOT NULL|N||
|爱好(hobby)|VARCHAR(128)|NULL|N||

建表语句:

mysql> create table if not exists student(
    studentNo int unsigned not null comment '学号' auto_increment,
    name varchar(12) not null comment '姓名',
    school varchar(12) not null comment '学院',
    grade varchar(12) not null comment '年级',
    major varchar(12) not null comment '专业',
    gender boolean not null comment '性别',
    hobby varchar(128) null comment '爱好',
    primary key(studentNo)
)engine=MyISAM default charset=utf8 auto_increment=20160001;

观察上面的建表语句需要注意四点:
(1)可以使用if not exists来判断数据表是否存在,存在则创建,不存在则不创建,这样可以避免因重复创建表导致失败;
(2)设置主键时可以将primary key放在字段的后面来修饰,也可以另起一行单独来指定主键;
(3)not null表示字段不允许为空,不指明,默认允许为NULL,也可以显示指明NULL,表示允许为空;
(4)设置自增时,可以指定自增的起始值,MySQL默认是从1开始自增,比如QQ号是从10000开始的。

关于MySQL支持的数据类型,可参考MySQL 数据类型

4.3.7 查看 MySQL 支持的存储引擎和默认的存储引擎

# 查看所支持的存储引擎
mysql> show engines;

# 查看默认的存储引擎
mysql> show  variables  like '%storage_engine';

4.3.8 删除数据表

mysql> drop table [tablename];

# 存数据表时才删除,好处是不会产生warning
mysql> drop table if exists [tablename];

# 同时删除多个数据表
mysql> drop table if exists [tablename0,tablename1,...];

4.3.9 查看当前数据库有哪些数据表

show tables; 	# 不能使用limit子句

#模糊查找
show tables like "%<tb_name>%"

# 指定数据库查看数据表
mysql>show tables from [databaseName]

# 或者
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'DATABASE_TO SEARCH_HERE' AND TABLE_NAME LIKE "table_here%"  LIMIT 5;

4.3.10 查看数据表结构

mysql> desc [tablename];

# 或者
mysql> describe [tablename];

查看上面创建的student数据表的结构如下:

4.3.11 查看建表语句

mysql> show create table [tablename]

4.3.12 重命名数据表

mysql> rename table [tablename] to [newtablename];

4.3.13 增加、删除和修改字段自增长

(1)删除字段自增长

# 命令格式
mysql>alter table [tablename] change [columnname] [columnname] [type];

# 示例,取消studentNo的自增长
mysql>alter table student change studentNo studentNo int(10) unsigned;

说明:注意列名称要重复一次,即需要将列的名称写两次。

(2)增加字段自增长

# 命令格式
mysql>alter table [tablename] modify [columnname] [type] auto_increment;

# 或者与上面删除字段自增长相反
mysql>alter table [tablename] change [columnname] [columnname] [type] auto_increment;

# 示例,添加studentNo自增长
mysql>alter table student modify studentNo int(10) unsigned auto_increment;

说明:添加自增长的列必须为NOT NULL及PRIMARY KEY(UNIQUE)属性。如果不是,需添加相应定义。

(3)修改自增长起始值

# 命令格式
mysql> alter table [tablename] auto_increment=[value];

# 示例,设置studentNo从10000开始自增
mysql> alter table [tablename] auto_increment=10000;

**注意:**设定的起始值value只能大于已有的auto_increment的整数值,小于的值无效。
show table status like 'table_name' 或者show create table [tablename]可以看到auto_increment这一列现有的起始值。

4.3.14 增加、删除和修改数据表的列

(1)增加列

# 命令格式
mysql>alter table [tablename] add column [columnname] [columdefinition] [after columnname];

# 示例1,为数据表student增加家乡hometown
mysql>alter table student add column hometown varchar(32) comment '家乡';

# 示例2,在指定列后新增列,而非默认最后一列
mysql>alter table student add column hometown varchar(32) comment '家乡' after major;

# 示例3,同时增加多个列
mysql>alter table student add hometown varchar(32) comment '家乡' after major,add hobby varchar(128) after hometown;

(2)删除列

# 删除单个列
mysql>alter table [tablename] drop column [columnname];

# 删除多个列
mysql>alter table [tablename] drop [columnname1],drop [columnname2];

(3)重命名列

# 命令格式
mysql>alter table [tablename] change [columnname] [newcolumnname] [type];

(4)修改列属性

# 命令格式
mysql> alter table [tablename] modify [columnname] [newdefinition];

# 示例,修改home类型为varchar(64)且不允许NULL
mysql> alter table student modify home varchar(64) not null;

4.3.15 添加、删除和查看索引

(1)添加索引

# 命令格式
mysql> alter table [tablename] add index [indexname](字段名1,字段名2…);

# 示例,为数据表student数据列studentNo添加索引
mysql> alter table student add index index_studentNo(studentNo);
# 或者
mysql> alter table student add index(studentNo);

说明: 上面示例的第二种方法,如果不显示指明索引名称的话,默认以列名称作为索引的名称。添加索引是为了提高查询的速度。

(2)查看索引

mysql> show index from [tablename];

(3)删除索引

# 命令格式
mysql> alter table [tablename] drop index [indexname];

# 示例
mysql> alter table student drop index index_studentNo;

4.3.16 创建临时表

# 命令格式
mysql> create temporary table [表名] ( [字段名1] [类型1] [is null] [key] [default value] [extra] [comment],...);

# 示例
mysql> create temporary table pig(i int);

说明:
(1)创建临时表与创建普通表的语句基本是一致的,只是多了一个temporary关键;
(2)临时表的特点是:表结构和表数据都是存储到内存中的,生命周期是当前MySQL会话,会话结束后,临时表自动被drop;
(3)注意临时表与Memory表(内存表)的区别是:
(3.1)Memory表的表结构存储在磁盘,临时表的表结构存储在内存;
(3.2)show tables看不到临时表,看得到内存表;
(3.3)内存表的生命周期是服务端MySQL进程生命周期,MySQL重启或者关闭后内存表里的数据会丢失,但是表结构仍然存在,而临时表的生命周期是MySQL客户端会话。
(3.4)内存表支持唯一索引,临时表不支持唯一索引;
(3.5)在不同会话可以创建同名临时表,不能创建同名内存表。

4.3.17 创建内存表

与创建表的命令格式相同,只是显示的在后面指明存储引擎为MEMORY。

# 命令格式
mysql> create table [表名] ( [字段名1] [类型1] [is null] [key] [default value] [extra] [comment],...)engine=memory;

# 示例
mysql> create table pig(i int)engine=memory;

4.3.18 修改数据表的存储引擎

mysql> alter table [tablename] type|engine=[enginename];

# 示例,将数据表test存储引擎设置为InnoDB
mysql> alter table test type=InnoDB;
# 或者
mysql> alter table test engine=InnoDB;

4.3.19 查看数据库数据表存储位置

mysql> show global variables like "%datadir%";

4.3.20 创建 merge 表

MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行增删查改。构成一个MERGE数据表结构的各成员MyISAM数据表结构(索引、引擎、列、字符集等)必须相同。

假设你有几个日志数据表,他们内容分别是这几年来每一年的日志记录项,他们的定义都是下面这样,YY代表年份:

CREATE TABLE log_YY  
(  
	dt  DATETIME NOT NULL,  
	info VARCHAR(100) NOT NULL,  
	INDEX (dt) 
) ENGINE = MyISAM;  

假设日志数据表的当前集合包括log_2015log_2016log_2017,而你可以创建一个如下所示的MERGE数据表把他们归拢为一个逻辑单元:

CREATE TABLE log_merge 
(
	dt DATETIME NOT NULL,
	info VARCHAR(100) NOT NULL,
    INDEX(dt)
) ENGINE = MERGE UNION=(log_2015,log_2016,log_2017) INSERT_METHOD=LAST;

(1)ENGINE选项的值必须是MERGE或MRG_MyISAM;
(2)UNION选项列出了将被收录在这个MERGE数据表离得各有关数据表。把这个MERGE表创建出来后,就可以像对待任何其他数据表那样查询它,只是每一次查询都将同时作用与构成它的每一个成员数据表 。下面这个查询可以让我们知道上述几个日志数据表的数据行的总数:

SELECT COUNT(*) FROM log_merge;  

(3)除了便于同时引用多个数据表而无需多条查询,MERGE数据表还提供了以下一些便MERGE数据表也支持DELETE 和UPDATE操作。INSERT操作比较麻烦,因为MySQL需要知道应该把新数据行插入到哪一个成员表里去。在MERGE数据表的定义里可以包括一个INSERT_METHOD选项,这个选项的可取值是NO、FIRST、LAST,他们的含义依次是INSERT操作是被禁止的、新数据行将被插入到现在UNION选项里列出的第一个数据表或最后一个数据表。
(4)对现有的merge表可以删除或新增包好的数据表,比如新增相同结构的数据表log_2018

CREATE TABLE log_2009 LIKE log_2008;  
ALTER TABLE log_merge UNION=(log_2015, log_2016,log_2017,log_2018);

4.3.21 清空表内容

truncate [tablename];

truncate 与 delete 均可以删除表记录,区别主要有如下几点:
(1)truncate 属于 DDL,delete 属于 DML;
(2)truncate 用于删除表中的所有行,delete 可以使用 where 子句有选择地进行删除;
(3)delete 每次删除一行,并在事务日志中为所删除的每行记录一项。truncate 释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放,所以truncate 比 delete 使用的系统和事务日志资源更少,效率更高;
(4)truncate 导致自动增加字段的初始值被重置,delete 没有影响,自增字段的值还是按照最后一次插入的基础上递增;
(5)对于由 FOREIGN KEY 约束引用的表,不能使用 truncate,而应使用不带 where 子句的 delete 语句。由于 truncate 不记录在日志中,所以它不能激活触发器。
(6)TRUNCATE TABLE 不能用于参与了索引视图的表。
(7)对用 TRUNCATE TABLE 删除数据的表上增加数据时,要使用UPDATE STATISTICS来维护索引信息。
(8)如果有 ROLLBACK 语句,DELETE 操作将被撤销,但 TRUNCATE 不会撤销。

请记住,当你不再需要该表时用 drop;当你仍要保留该表,但要删除所有记录时用 truncate;当你要删除部分记录时用 delete。

4.4 DQL 篇(数据查询篇)

4.4.1 查询记录

#命令格式
mysql> SELECT [列名称] FROM [表名称] where [条件]

说明: 一个完整的SELECT语句包含可选的几个子句。SELECT语句的定义如下:

<SELECT clause> [<FROM clause>] [<WHERE clause>] [<GROUP BY clause>] [<HAVING clause>] [<ORDER BY clause>] [<LIMIT clause>] 

(1)SELECT子句是必选的,其它子句如FROM、WHERE、GROUP BY子句等是可选的。
(2)一个SELECT语句中,子句的顺序是固定的。例如GROUP BY子句不会位于WHERE子句的前面。
(3) SELECT语句执行顺序 :

开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果

每个子句执行后都会产生一个中间数据结果,即所谓的临时视图,供接下来的子句使用,如果不存在某个子句,就跳过。MySQL和标准SQL执行顺序基本是一样的。

4.4.2 where 子句

where 子句按所需条件从表中选取数据,如法如下:

SELECT 列名称 FROM 表名称 WHERE 列 运算符 值

下面的运算符可在 WHERE 子句中使用:

运算符描述
=等于
<>不等于
>大于
<小于
>=大于等于
<=小于等于
BETWEEN AND在某个范围内
LIKE搜索某种模式
AND多个条件与
OR多个条件或

(1)where in的用法。
in在where子句中的用法主要有两种:
(a)in 后面是子查询产生的记录集,注意,子查询结果数据列只能有一列且无需给子表添加别名。如:

select  *  from  table  where   uname  in(select  uname  from  user); 

(b)in 后面是数据集合,如:

select * from  table  where   uname  in('aaa',bbb','ccc','ddd','eee',ffff''); 

注意:如果数据类型是字符串,一定要将字符串用单引号标注起来。

4.4.3 group by 子句

group by 子句中的数据列应该是 SELECT 列表中指定的每一列,除非这列是用于聚合函数,如 sum()、avg()、count()等。但是,如果 select 列表中指定的数据列,没有用于聚合函数也不在 group by 子句中,按理说会报错,但是 MySQL 会选择第一条显示在结果集中。

# 选择发起加好友请求次数超过10次的QQ(uin),被加方(to_uin)只会显示第一个
select uin,to_uin,count(*) as reqCnt from inner_raw_add_friend_20170514 group by uin having  reqCnt>10 limit 10;

4.4.4 where 与 having 子句的区别

(1)作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组;

# 选取QQ 3585076592和3585075773在20170514当天发出加好友请求次数且满足次数>10
select uin,count(*) as reqCnt from inner_raw_add_friend_20170514 where uin=3585076592 or uin=3585075773 group by uin having  reqCnt>10

结果:

(2)作用的阶段不同。WHERE 在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算),而 HAVING 在分组和聚集之后选取分组。因此,WHERE 子句不能包含聚集函数,因为试图用聚集函数判断哪些行输入给聚集运算是没有意义的。 相反,HAVING 子句一般包含聚集函数。当然,也可以使用 HAVING 对结果集进行筛选,但不建议这样做,同样的条件可以更有效地用于 WHERE 阶段。

# 查询指定QQ加好友请求信息(where作用于输入阶段的数据集)
select * from inner_raw_add_friend_20170514 where uin=3585078528;

# 等同于having,作用于结果阶段的结果集
select * from inner_raw_add_friend_20170514 having uin=3585078528;

4.4.5 order by 子句

ORDER BY 语句用于根据指定的列对结果集进行排序。ORDER BY 语句默认按照升序对记录进行排序。如果希望按照降序对记录进行排序,可以使用 DESC(descend)关键字,升序关键字是 ASC(ascend),随机使用order by rand()

# 以QQ号码降序排序
select * from inner_raw_add_friend_20170514 order by uin desc;

4.4.6 limit 子句

语法格式如下:

LIMIT [<offset>,] <row_count> | <row_count> OFFSET <offset>

LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数值参数。参数必须是一个整数常量。如果给定两个参数,有两种用法。

第一种:offset,row_count,第一个参数指定返回记录行的开始偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是0。

第二种:[row_count] OFFSET [offset],第一个参数row_count为返回记录行的最大数目,第二个参数offset为返回记录行的开始偏移量。

特殊用法:
(1)只给一个参数,表示返回记录行的TOP最大行数,起始偏移量默认为0;
(2)返回从起始偏移量开始,返回剩余所有的记录,可以使用一些值很大的第二个参数。如检索所有从第96行到最后一行:

SELECT * FROM tbl LIMIT 95,18446744073709551615;

注意,MySQL目前不支持使用-1表示返回从偏移量开始剩余的所有记录,即下面的写法是错误的:

SELECT * FROM tbl LIMIT 95,-1

4.4.7 distinct 用法

(1)在使用 mysql 时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数。用法如下:

# 选择每一个QQ发起加好友请求涉及到的不同的QQ数
select uin,count(distinct toUin) from addFriend group by uin;

(2)distinct 用于选择不同的记录,且只能放在所选列的开头,作用于紧随其后的所有列。示例:

# 查询uin和toUin不重复的加好友请求
select distinct uin,toUin from addFriend;

# 示例数据表
uin      toUin
10000    123456
10000    121212
10001    121212
10001    131313

# 结果集
uin      toUin
10000    123456
10000    121212
10001    121212
10001    131313

如果想使 distinct 的功能作用于第二列的 toUin,使用 distinct 是无望了,因为 MySQL 语法尚不支持,可以使用 group by 取而代之。

select uin,toUin from addFriend where group by toUin;

# 结果集
uin      toUin
10000    123456
10000    121212
10001    131313

这个奇怪的技巧只能存在于 MySQL 中,因为标准的 SQL 语法规定非聚合函数中的列一定要存在于 group by 子句中。MySQL 规定,当非聚合函数中的列不存在于 group by 子句中,则选择每个分组的第一行。

(3)count distinct 统计符合条件的记录。
找了很长时间,有两种方法:
(a)可以使用count(distinct case where 条件 then 字段 end),具体参见 MySQL distinct count if conditions unique
(b)使用count(distinct xx,if(use_status=1,true,null)),参见 mysql count if distinct

4.4.8 检查查询语句的执行效率

mysql> explain [select statement];

# 或者
mysql> desc [select以上是关于MySQL 入门常用命令大全的主要内容,如果未能解决你的问题,请参考以下文章

Linux常用基本命令大全介绍

MySQL命令大全:MySQL常用命令手册MySQL命令行大全查询工具

MySQL常用命令大全

常用mysql命令大全

oracle常用命令大全及心得

MySQL 常用命令大全