MySQL基本语句入门

目录:

1. SQL基础 1
1.1结构化查询语言包含6个部分: 4
1.2 SQL语句: 5
1.3SQL数据类型 6
1.4 SQL语法 6
1.5 SQL函数 7
2.MySQL基本操作 9
2.1.DDL语句 9
2.2DML语句 14
1.插入记录 14
2.更新记录 16
3.删除记录 16
4.查询记录 17
2.3DCL语句 26
2.4帮助 27


1. SQL基础

结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuːˈel/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。

百度百科:https://baike.baidu.com/item/%E7%BB%93%E6%9E%84%E5%8C%96%E6%9F%A5%E8%AF%A2%E8%AF%AD%E8%A8%80/10450182?fr=aladdin&fromid=86007&fromtitle=sql

wiki百科:

https://zh.wikipedia.org/zh-cn/SQL。

SQL结构化查询语言是一种特定目的程序语言,用于管理关系数据库管理系统(RDBMS),或在关系流数据管理系统(RDSMS)中进行流处理。

SQL基于关系代数和元组关系演算,包括一个数据定义语言和数据操纵语言。SQL的范围包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制。尽管SQL经常被描述为,而且很大程度上是一种声明式编程(4GL),但是其也含有过程式编程的元素。

 

历史:MySQL自2001年开始引入InnoDB存储引擎,并于2002年全面支持事物(transaction),满足事物的ACID属性(Atomicity,原子性;Consistent,一致性;Isolation,隔离性;Durable,持久性),支持外键约束。2003年支持集合UNION操作。2004年对子查询的支持。2005年MySQL5.0增加了视图(View)、数据存储过程(Stored Procedure)、触发器(Trigger)、服务端游标(Cursor)、以及分布式事务协议XA、复制特性。支持企业级应用。LAMP(Linux+Apache+MySQL+Per/PHP/Python)成为IT业广泛使用的Web应用框架。

InnoDB,是MySQL的数据库引擎之一,为MySQL AB发布binary的标准之一。

 

 

NoSQL(Not OnlySQL):泛指非关系型的数据库。

 

NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

NoSQL数据库的四大分类:

 

1.键值(Key-Value)存储数据库

这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。举例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.

2.列存储数据库。

这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak.

3.文档型数据库

文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:CouchDB, MongoDb. 国内也有文档型数据库SequoiaDB,已经开源。

3.图形(Graph)数据库

图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。如:Neo4J, InfoGrid, Infinite Graph.

因此,我们总结NoSQL数据库在以下的这几种情况下比较适用:1、数据模型比较简单;2、需要灵活性更强的IT系统;3、对数据库性能要求较高;4、不需要高度的数据一致性;5、对于给定key,比较容易映射复杂值的环境。


分类

Examples举例

典型应用场景

数据模型

优点

缺点

键值(key-value

Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB

内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。

Key 指向 Value 的键值对,通常用hash table来实现

查找速度快

数据无结构化,通常只被当作字符串或者二进制数据

列存储数据库

Cassandra, HBase, Riak

分布式的文件系统

以列簇式存储,将同一列数据存在一起

查找速度快,可扩展性强,更容易进行分布式扩展

功能相对局限

文档型数据库

CouchDB, MongoDb

Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容)

Key-Value对应的键值对,Value为结构化数据

数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构

查询性能不高,而且缺乏统一的查询语法。

图形(Graph)数据库

Neo4J, InfoGrid, Infinite Graph

社交网络,推荐系统等。专注于构建关系图谱

图结构

利用图结构相关算法。比如最短路径寻址,N度关系查找等

很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。


1.1结构化查询语言包含6个部分:

一:数据查询语言(DQL:Data Query Language):
其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。
二:数据操作语言(DML:Data Manipulation Language):
其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。
三:事务处理语言(TPL):
它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。
四:数据控制语言(DCL):
它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。
五:数据定义语言(DDL):
其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
六:指针控制语言(CCL):
它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。


1.2 SQL语句:

1. DDL(Data Definition Languages)数据定义语句,这些语句定义的不同的数据段、数据库、表、列、索引等数据库对象。常用的语句关键字包括:create、drop、alter.
2. DML(Data Manipulation Language)数据操纵语句,用于添加、删除、更新、查询数据库记录,并检查数据完整性。insert、delete、update、select。

3. DCL(Data Control Language)数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限、安全级别。主要语句包括:grant、revoke。


1.3SQL数据类型

SQL数据类型:字符型,文本型,数值型,逻辑型和日期型。
1.字符型:VARCHARVS CHAR
VARCHAR型和CHAR型数据的这个差别是细微的,但是非常重要。他们都是用来储存字符串长度小于255的字符。
2.文本型:TEXT:
注意文本型数据没有长度,而上一节中所讲的字符型数据是有长度的。一个文本型字段中的数据通常要么为空,要么很大。
3.数值型
整数INT 、小数NUMERIC、钱数MONEY
INT VS SMALLINT VS TINYINT
你可以在NUMERIC型字段中存储小数3.14。
4. 逻辑型 BIT
如果你使用复选框(CHECKBOX)从网页中搜集信息,你可以把此信息存储在BIT型字段中。BIT型字段只能取两个值:0或1。
当心,在你创建好一个表之后,你不能向表中添加 BIT型字段。如果你打算在一个表中包含BIT型字段,你必须在创建表时完成。

5.日期型DATETIME VS SMALLDATETIME

1.4 SQL语法

SQL语言分成了几种要素,包括:
子句,是语句和查询的组成成分。(在某些情况下,这些都是可选的。)
表达式,可以产生任何标量值,或由列和行的数据库表
谓词,给需要评估的SQL三值逻辑(3VL)(true/false/unknown)或布尔真值指定条件,并限制语句和查询的效果,或改变程序流程。
查询,基于特定条件检索数据。这是SQL的一个重要组成部分。
语句,可以持久地影响纲要和数据,也可以控制数据库事务、程序流程、连接、会话或诊断。
SQL语句也包括分号(";")语句终结符。尽管并不是每个平台都必需,但它是作为SQL语法的标准部分定义的。
无意义的空白在SQL语句和查询中一般会被忽略,更容易格式化SQL代码便于阅读。

1.5 SQL函数

函数

描述

AVG

平均值

COUNT

计数(不含Null

First

第一个记录的值

MAX

最大值

MIN

最小值

STDEV

样本标准差

STDEVP

总体标准差

SUM

求和

VAR

样本方差

VARP

总体方差

UCASE

转化为全大写字母

LCASE

转化为全小写字母

MID

取中值

LEN

计算字符串长度

INSTR

获得子字符串在母字符串的起始位置

LEFT

取字符串左边子串

RIGHT

取字符串右边子串

ROUND

数值四舍五入取整

MOD

取余

NOW

获得当前时间的值

FORMAT

字符串格式化

DATEDIFF

获得两个时间的差值


MySQL官网:

https://www.mysql.com/

 详细的MySQL资料要去参考官方用户手册:

https://dev.mysql.com/doc/

 Oracle MySQLCloud Service:

https://www.mysql.com/cloud/



2.MySQL基本操作

2.1.DDL语句

DDL:对数据库内部的对象进行创建、删除、修改等操作的语句。
DML只对表内部的数据进行操作,而不涉及表的定义、结构的修改,更不会涉及其他对象。
DDL语句更多有DBA使用,开发人员一般很少使用。

1. 登陆数据库:

C:\Users\77280>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.22-log MySQL Community Server (GPL)Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>

2.查看当前已有的数据库:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+
6 rows in set (0.02 sec)
information_schema:主要存储了系统中的一些数据库对象信息,比如用户表信息、列信息、权限信息、字符集信息、分区信息等。

mysql:存储系统的用户权限信息。


2. 创建数据库

mysql> create database test1;
Query OK, 1 row affected (0.01 sec)

3. 选择要操作的数据库

mysql> use test1;
Database changed

4. 创建表

创建一个名称为emp的表。表中包括ename、hiradata和sal三个字段

mysql> create table emp(ename varchar(10),hiredata date,sal decimal(10,2),deptno int(2));
Query OK, 0 rows affected (0.04 sec)

5. 查看表定义

mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename    | varchar(10)   | YES  |     | NULL    |       |
| hiredata | date          | YES  |     | NULL    |       |
| sal      | decimal(10,2) | YES  |     | NULL    |       |
| deptno   | int(2)        | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.01 sec)mysql> show create table emp;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                       |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| emp   | CREATE TABLE `emp` (`ename` varchar(10) DEFAULT NULL,`hiredata` date DEFAULT NULL,`sal` decimal(10,2) DEFAULT NULL,`deptno` int(2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

6. 修改表结构

ALTER TABLE tablename MODIFY[COLIME] colume_definition[FIRST|AFTER col_name]
#修改emp的ename字段,将其数据类型由varchar(10)改为varchar(20):
mysql> alter table emp modify ename varchar(20);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

7. 增加表字段

ALTER TABLE tablename ADD[COLUMN] column_defition[FIRST|AFTER col_name]
#在表emp中增加age字段,类型为int(3):
mysql> alter table emp add column age int(3);
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

8. 删除表字段

ALTER TABLE tablename DROP[COLUMN]col_name
#删除age字段:
mysql> alter table emp drop column age;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

9. 字段改名

ALTER TABLE tablename CHANGE[COLUMN] old_name
column_definition[FIRST|AFTER col_name]
#将age改名为age1:
mysql> alter table emp change age age1 int(3);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

change可以修改列名、modify则不能。

10. 修改字段的排列顺序

字段的增加和修改语法(ADD/CHANGE/MODIFY)中,都有一个可选项first|after column_name,这个选项可以用来修改字段在表中的位置,ADD增加的新字段默认加在表的最后一列,CHANGE/MODIFY不会改变字段的位置。

#在表emp中新增字段birth,新增在ename之后:
mysql> alter table emp add birth date after ename;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0
#将age字段放在最前面:
mysql> alter table emp modify age int(3) first;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

11. 更改表名

ALTER TABLE tablename RENAME [TO] new_tablename
mysql> alter table emp rename emp1;
Query OK, 0 rows affected (0.01 sec)

12. 删除表字段

ALTER TABLE tablename DROP[COLUMN] col_name
#删除emp表的age字段:
mysql> alter table emp drop column age;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

13. 删除表

DROP TABLE tablename
#删除emp表:
drop table emp;
2.2DML语句

1.插入记录

INSERT INTO tablename(field1,field2,...,fieldn)VALUES(value1,value2,...,value3);

mysql>  insert into emp(ename,birth,hiredata,sal,deptno)values('zzx1','2000-01-01','1980-01-01','3000',2);
Query OK, 1 row affected (0.01 sec)
mysql> select * from emp;
+-------+------------+------------+---------+--------+
| ename | birth      | hiredata   | sal     | deptno |
+-------+------------+------------+---------+--------+
| zzx1  | 2000-01-01 | 1980-01-01 | 3000.00 |      2 |
+-------+------------+------------+---------+--------+
1 row in set (0.00 sec)

#可以不指定字段名,但排列顺序要求一致:
mysql> insert into emp values('lisa','2003-01-01','1982-01-01','3000',2);
Query OK, 1 row affected (0.00 sec)

一些特殊字段(可为空NULL的字段、非空但含有默认值的字段、自增字段)可以不用在insert后的字段列表里面出现,values后面只写对应的字段名称value。(可默认为NULL、默认值、自增的下一个数字。

如,对表emp只插入ename 和sal字段:

mysql> insert into emp(ename,sal)values('dony',1000);
Query OK, 1 row affected (0.00 sec)
mysql> select * from emp;
+-------+------------+------------+---------+--------+
| ename | birth      | hiredata   | sal     | deptno |
+-------+------------+------------+---------+--------+
| zzx1  | 2000-01-01 | 1980-01-01 | 3000.00 |      2 |
| lisa  | 2003-01-01 | 1982-01-01 | 3000.00 |      2 |
| dony  | NULL       | NULL       | 1000.00 |   NULL |
+-------+------------+------------+---------+--------+
3 rows in set (0.00 sec)

一次插入多条记录:

先新建一个部门表:

mysql> create table dept(deptno int(2),deptname varchar(10));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into dept values(1,'tech'),(2,'sale');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
|      1 | tech     |
|      2 | sale     |
+--------+----------+
2 rows in set (0.00 sec)

2.更新记录

UPDATE tablename SET field1=value1,field2=value2,...,fieldn=valuen[WHRER CONDITION]

#将表emp中ename字段值为lisa的记录对应的薪水从3000提高到4000;
mysql> update emp set sal=4000 where ename='lisa';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

同时更新多个表的数据:

UPDATE t1,t2,...,tn SET t1.field1=expr1,...,tn.fieldn=exprn[WHRER CONDITION]
如同时更新emp表的sal字段和dept表的deptname字段:
mysql>  update emp a,dept b set a.sal=a.sal*b.deptno,b.deptname=a.ename where a.deptno=b.deptno;
Query OK, 3 rows affected (0.01 sec)
Rows matched: 3  Changed: 3  Warnings: 0

多表更新:常用于根据一个表的字段来动态地更新另外一个表的字段。

3.删除记录

DELETE FROM tablename[WHRER CONDITION]
#在emp表中将ename为’dony’的记录全部删除:
mysql> delete from emp where ename='dony';
Query OK, 1 row affected (0.01 sec)

可一次删除多个表的数据:

DELETE t1,t2,...,tn FROM t1,t2,...,tn[WHRER CONDITION]
mysql> insert into emp values('mike','1980-02-02','2003-01-01','5000',3);
Query OK, 1 row affected (0.00 sec)mysql> insert into dept values(3,'hr');
Query OK, 1 row affected (0.00 sec)#同时删除表emp和表dept中deptno=3的记录:
mysql> delete a,b from emp a,dept b where a.deptno=b.deptno and a.deptno=3;
Query OK, 2 rows affected (0.01 sec)

注意:删除delete若不加where条件将会把表的所有记录都删除!

4.查询记录

SELECT * FROM tablename[WHRER CONDITION]
将表emp的所有记录都显示出来:
mysql> select * from emp;
+-------+------------+------------+---------+--------+
| ename | birth      | hiredata   | sal     | deptno |
+-------+------------+------------+---------+--------+
| zzx1  | 2000-01-01 | 1980-01-01 | 6000.00 |      2 |
| lisa  | 2003-01-01 | 1982-01-01 | 8000.00 |      2 |
+-------+------------+------------+---------+--------+
2 rows in set (0.00 sec)

#只查询部分字段:(各字段间用逗号隔开)
mysql> select ename,sal from emp;
+-------+---------+
| ename | sal     |
+-------+---------+
| zzx1  | 6000.00 |
| lisa  | 8000.00 |
+-------+---------+
2 rows in set (0.00 sec)mysql>  insert into emp values('mike','19850505','20030505',7000,1);
Query OK, 1 row affected (0.00 sec)
mysql> select * from emp;
+-------+------------+------------+---------+--------+
| ename | birth      | hiredata   | sal     | deptno |
+-------+------------+------------+---------+--------+
| zzx1  | 2000-01-01 | 1980-01-01 | 6000.00 |      2 |
| lisa  | 2003-01-01 | 1982-01-01 | 8000.00 |      2 |
| mike  | 1985-05-05 | 2003-05-05 | 7000.00 |      1 |
+-------+------------+------------+---------+--------+
3 rows in set (0.00 sec)

(1) 查询不重复的记录:(使用distinct关键字)
mysql> select * from emp;
+-------+------------+------------+---------+--------+
| ename | birth      | hiredata   | sal     | deptno |
+-------+------------+------------+---------+--------+
| zzx1  | 2000-01-01 | 1980-01-01 | 6000.00 |      2 |
| lisa  | 2003-01-01 | 1982-01-01 | 8000.00 |      2 |
| mike  | 1985-05-05 | 2003-05-05 | 7000.00 |      1 |
+-------+------------+------------+---------+--------+
3 rows in set (0.00 sec)

(2) 条件查询WHRER关键字

mysql> select * from emp where deptno=1;
+-------+------------+------------+---------+--------+
| ename | birth      | hiredata   | sal     | deptno |
+-------+------------+------------+---------+--------+
| mike  | 1985-05-05 | 2003-05-05 | 7000.00 |      1 |
+-------+------------+------------+---------+--------+
1 row in set (0.00 sec)(=、>、<、>=、<= 、!=),多个条件之间可以and、or连接
mysql> select * from emp where deptno=1 and sal<=3000;
Empty set (0.00 sec)

(3) 排序和限制

按某个字段进行排序、ORDER BY

SELECT * FROM tablename[WHRER CONDITION] [ORDER BY field1[DESC|ASC],field2[DESC|ASC],...,fieldn[DESC|ASC]];

默认是升序。ORDER BY后面可以跟多个不同的排序字段,并且每个排序字段可以有不同的排序顺序,如果某个字段的值相同,则按下一个排序字段的值进行排序。如果只有一个排序字段,则值相同的记录将会无序排列。

把emp表的记录按工资高低进行排序:

mysql> select * from emp order by sal;
+-------+------------+------------+---------+--------+
| ename | birth      | hiredata   | sal     | deptno |
+-------+------------+------------+---------+--------+
| zzx1  | 2000-01-01 | 1980-01-01 | 6000.00 |      2 |
| mike  | 1985-05-05 | 2003-05-05 | 7000.00 |      1 |
| lisa  | 2003-01-01 | 1982-01-01 | 8000.00 |      2 |
+-------+------------+------------+---------+--------+
3 rows in set (0.00 sec)

mysql> select * from emp order by deptno,sal desc;
+-------+------------+------------+---------+--------+
| ename | birth      | hiredata   | sal     | deptno |
+-------+------------+------------+---------+--------+
| mike  | 1985-05-05 | 2003-05-05 | 7000.00 |      1 |
| lisa  | 2003-01-01 | 1982-01-01 | 8000.00 |      2 |
| zzx1  | 2000-01-01 | 1980-01-01 | 6000.00 |      2 |
+-------+------------+------------+---------+--------+
3 rows in set (0.00 sec)
#只显示部分记录用LIMIT关键字
SELECT...[LIMIT offset_startRow,rowCount]
offset_startRow=0:偏移量起始行号,默认是0;
显示emp表按sal排序后的前2条记录:
mysql> select * from emp order by sal limit 2;
+-------+------------+------------+---------+--------+
| ename | birth      | hiredata   | sal     | deptno |
+-------+------------+------------+---------+--------+
| zzx1  | 2000-01-01 | 1980-01-01 | 6000.00 |      2 |
| mike  | 1985-05-05 | 2003-05-05 | 7000.00 |      1 |
+-------+------------+------------+---------+--------+
2 rows in set (0.00 sec)

(4) 聚合操作

SELECT [field1,field2,...,fieldn] fun_mame
FROM tablename
[WHERE where_condition]
[GROUP BY field1,field2,...fieldn [WITH ROLLUP]]
[HAVING having_condition]

fun_name:要进行的聚会操作,聚合函数,有sum、count(*)、max、min;

GROUP BY关键字表示要进行分类聚合的字段,要按照部门分类统计员工数量,部分就应该写在group by后面。

WITH ROLLUP(可选项)表示是否对分类聚合后的结果进行再汇总。

HAVING关键字表示对分类后的结果再进行条件的过滤

HAVING是对聚合后的结果进行条件过滤,WHRER是在聚合前就对记录进行过滤。


eg:在emp表中统计员工的总人数:


mysql> select count(1) from emp;
+----------+
| count(1) |
+----------+
|       3 |
+----------+
1 row in set (0.00 sec)

统计各个部门的人数:

mysql> select deptno,count(1) from emp group by deptno;
+--------+----------+
| deptno | count(1) |
+--------+----------+
|      1 |        1 |
|      2 |        2 |
+--------+----------+
2 rows in set (0.00 sec)

统计人数大于1的部门人数:

mysql> select deptno,count(1) from emp group by deptno having count(1)>1;
+--------+----------+
| deptno | count(1) |
+--------+----------+
|      2 |        2 |
+--------+----------+
1 row in set (0.00 sec)

统计员工的薪水总额,最高和最低薪水:

mysql> select sum(sal),max(sal),min(sal) from emp;
+----------+----------+----------+
| sum(sal) | max(sal) | min(sal) |
+----------+----------+----------+
| 21000.00 |  8000.00 |  6000.00 |
+----------+----------+----------+
1 row in set (0.00 sec)

(5) 表连接(多表连接)

当需要同时显示多个表中的字段时,就可以用表连接来实现。

内连接和外连接

内连接仅选出两张表中相互匹配的记录、外连接会选出其他不匹配的记录。

从emp表和dept表中查询雇员的名字和所在部门的名字:

mysql> select ename,deptname from emp,dept where emp.deptno=dept.deptno;
+-------+----------+
| ename | deptname |
+-------+----------+
| zzx1  | zzx1     |
| lisa  | zzx1     |
| mike  | tech     |
+-------+----------+
3 rows in set (0.00 sec)

外连接又分为左连接和右连接:

左连接:包含所有左边表中的记录甚至是右边表中没有和它匹配的记录;

右连接:包含所有右边表的记录...

查询emp中所有雇员和所在部门的名称:

mysql> select ename,deptname from emp left join dept on emp.deptno=dept.deptno;
+-------+----------+
| ename | deptname |
+-------+----------+
| mike  | tech     |
| zzx1  | zzx1     |
| lisa  | zzx1     |
| dony  | NULL     |
+-------+----------+
4 rows in set (0.00 sec)

等价于:(用右连接)

mysql> select ename,deptname from dept right join emp on dept.deptno=emp.deptno;
+-------+----------+
| ename | deptname |
+-------+----------+
| mike  | tech     |
| zzx1  | zzx1     |
| lisa  | zzx1     |
| dony  | NULL     |
+-------+----------+
4 rows in set (0.00 sec)

(6) 子查询

某些情况下,当进行查询的时候,需要的条件是另外一个select语句的结果,这个时候,就要用的子查询。关键字:in、not in、=、!= 、exists、not exists
eg:从emp表中查询出所有部门在dept表中的记录:

mysql> select * from emp where deptno in(select deptno from dept);
+-------+------------+------------+---------+--------+
| ename | birth      | hiredata   | sal     | deptno |
+-------+------------+------------+---------+--------+
| zzx1  | 2000-01-01 | 1980-01-01 | 6000.00 |      2 |
| lisa  | 2003-01-01 | 1982-01-01 | 8000.00 |      2 |
| mike  | 1985-05-05 | 2003-05-05 | 7000.00 |      1 |
+-------+------------+------------+---------+--------+
3 rows in set (0.00 sec)

如果子查询记录数唯一,可以用=代替in

mysql> select * from emp where deptno=(select deptno from dept);
ERROR 1242 (21000): Subquery returns more than 1 row
mysql> select * from emp where deptno=(select deptno from dept limit 1);
+-------+------------+------------+---------+--------+
| ename | birth      | hiredata   | sal     | deptno |
+-------+------------+------------+---------+--------+
| mike  | 1985-05-05 | 2003-05-05 | 7000.00 |      1 |
+-------+------------+------------+---------+--------+
1 row in set (0.00 sec)
子查询:某些情况下子查询可以转换为表连接:
select * from emp where deptno in(select deptno from dept);
转换为表连接:
select emp.* from emp,dept where emp.deptno=dept.deptno;

表连接在很多情况下性能优于子查询。


(7)记录联合

将两张表的数据按照一定的查询条件查询出来以后,将结果合并到一起显示出来,这个时候,就需要用union和union all关键字。

SELECT * FROM t1
UNION|UNION ALL
SELECT * FROM t2
UNION|UNION ALL
...
UNION|UNION ALL
SELECT * FROM tn

UNION ALL把结果集直接合并在一起,而UNION 是将UNION ALL后的结果进行一次DISTINCT,去除掉重复记录后的结果!


eg:将emp表和dept表中的部门编号的集合显示出来:

mysql> select deptno from emp-> union all-> select deptno from dept;
+--------+
| deptno |
+--------+
|      2 |
|      2 |
|      1 |
|   NULL |
|      4 |
|      1 |
|      2 |
|      3 |
+--------+
8 rows in set (0.00 sec)

将结果去掉重复记录后再显示出来:

mysql>  select deptno from emp-> union-> select deptno from dept;
+--------+
| deptno |
+--------+
|      2 |
|      1 |
|   NULL |
|      4 |
|      3 |
+--------+
5 rows in set (0.00 sec)
2.3DCL语句
grant 和revoke
#创建一个数据库的用户user1具有对test1数据库中所有表格的SELECT/INSERT操作下权限:
mysql> grant select,insert on test1.* to 'user1'@'localhost' identified by '123';
Query OK, 0 rows affected, 1 warning (0.01 sec)

退出,然后用该用户登陆:

mysql> exit;Bye
C:\Users\77280>mysql -u user1 -p123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.22-log MySQL Community Server (GPL)Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test1;
Database changed
mysql> insert into emp values('rose','19900204','20100505',8000,3);
Query OK, 1 row affected (0.00 sec)

root用户现在要收回user1对数据库test1的insert权限:

C:\Users\77280>mysql -u root –p
mysql> revoke insert on test1.* from 'user1'@'localhost';
Query OK, 0 rows affected (0.01 sec)
mysql> quit;
Bye

再用user1用户登陆后执行insert就会报错,执行失败!

mysql> insert into emp values('小明','19900101','20110506',9000,2);
ERROR 1142 (42000): INSERT command denied to user 'user1'@'localhost' for table 'emp'

2.4帮助

有命令行下自带的安装的帮助文档和官网的。

按照层次查看帮助:

mysql> ? contents;#(注意? 和contents之间有个空格)
You asked for help about help category: "Contents"
For more information, type 'help ', where  is one of the following
categories:Account ManagementAdministrationCompound StatementsData DefinitionData ManipulationData TypesFunctionsFunctions and Modifiers for Use with GROUP BYGeographic FeaturesHelp MetadataLanguage StructurePluginsProceduresStorage EnginesTable MaintenanceTransactionsUser-Defined FunctionsUtility

查看支持的数据类型:

mysql> ? Data Types;
You asked for help about help category: "Data Types"
For more information, type 'help ', where  is one of the following
topics:AUTO_INCREMENTBIGINTBINARYBITBLOBBLOB DATA TYPEBOOLEANCHARCHAR BYTEDATEDATETIMEDECDECIMALDOUBLEDOUBLE PRECISIONENUMFLOATINTINTEGERLONGBLOBLONGTEXTMEDIUMBLOBMEDIUMINTMEDIUMTEXTSET DATA TYPESMALLINTTEXTTIMETIMESTAMPTINYBLOBTINYINTTINYTEXTVARBINARYVARCHARYEAR DATA TYPE#查看INT:
mysql> ? INT
Name: 'INT'
Description:
INT[(M)] [UNSIGNED] [ZEROFILL]A normal-size integer. The signed range is -2147483648 to 2147483647.
The unsigned range is 0 to 4294967295.

URL: http://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html

2. 通过关键字快速查看帮助:

mysql> ? show
Name: 'SHOW'
Description:
SHOW has many forms that provide information about databases, tables,
columns, or status information about the server. This section describes
those following:SHOW {BINARY | MASTER} LOGS
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
SHOW CHARACTER SET [like_or_where]
SHOW COLLATION [like_or_where]
SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [like_or_where]
SHOW CREATE DATABASE db_name
SHOW CREATE EVENT event_name
SHOW CREATE FUNCTION func_name
SHOW CREATE PROCEDURE proc_name
SHOW CREATE TABLE tbl_name
SHOW CREATE TRIGGER trigger_name
SHOW CREATE VIEW view_name
SHOW DATABASES [like_or_where]
SHOW ENGINE engine_name {STATUS | MUTEX}
SHOW [STORAGE] ENGINES
SHOW ERRORS [LIMIT [offset,] row_count]
SHOW EVENTS
SHOW FUNCTION CODE func_name
SHOW FUNCTION STATUS [like_or_where]
SHOW GRANTS FOR user
SHOW INDEX FROM tbl_name [FROM db_name]
SHOW MASTER STATUS
SHOW OPEN TABLES [FROM db_name] [like_or_where]
SHOW PLUGINS
SHOW PROCEDURE CODE proc_name
SHOW PROCEDURE STATUS [like_or_where]
SHOW PRIVILEGES
SHOW [FULL] PROCESSLIST
SHOW PROFILE [types] [FOR QUERY n] [OFFSET n] [LIMIT n]
SHOW PROFILES
SHOW RELAYLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
SHOW SLAVE HOSTS
SHOW SLAVE STATUS [FOR CHANNEL channel]
SHOW [GLOBAL | SESSION] STATUS [like_or_where]
SHOW TABLE STATUS [FROM db_name] [like_or_where]
SHOW [FULL] TABLES [FROM db_name] [like_or_where]
SHOW TRIGGERS [FROM db_name] [like_or_where]
SHOW [GLOBAL | SESSION] VARIABLES [like_or_where]
SHOW WARNINGS [LIMIT [offset,] row_count]like_or_where:LIKE 'pattern'| WHERE exprIf the syntax for a given SHOW statement includes a LIKE 'pattern'
part, 'pattern' is a string that can contain the SQL % and _ wildcard
characters. The pattern is useful for restricting statement output to
matching values.Several SHOW statements also accept a WHERE clause that provides more
flexibility in specifying which rows to display. See
http://dev.mysql.com/doc/refman/5.7/en/extended-show.html.URL: http://dev.mysql.com/doc/refman/5.7/en/show.htmlmysql> ? create table;
Name: 'CREATE TABLE'
Description:
Syntax:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name(create_definition,...)[table_options][partition_options]CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name[(create_definition,...)][table_options][partition_options][IGNORE | REPLACE][AS] query_expressionCREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name{ LIKE old_tbl_name | (LIKE old_tbl_name) }create_definition:col_name column_definition| [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)[index_option] ...| {INDEX|KEY} [index_name] [index_type] (index_col_name,...)[index_option] ...| [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY][index_name] [index_type] (index_col_name,...)[index_option] ...| {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...)[index_option] ...| [CONSTRAINT [symbol]] FOREIGN KEY[index_name] (index_col_name,...) reference_definition| CHECK (expr)column_definition:data_type [NOT NULL | NULL] [DEFAULT default_value][AUTO_INCREMENT] [UNIQUE [KEY]] [[PRIMARY] KEY][COMMENT 'string'][COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}][STORAGE {DISK|MEMORY|DEFAULT}][reference_definition]| data_type [GENERATED ALWAYS] AS (expression)[VIRTUAL | STORED] [NOT NULL | NULL][UNIQUE [KEY]] [[PRIMARY] KEY][COMMENT 'string']data_type:BIT[(length)]| TINYINT[(length)] [UNSIGNED] [ZEROFILL]| SMALLINT[(length)] [UNSIGNED] [ZEROFILL]| MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]| INT[(length)] [UNSIGNED] [ZEROFILL]| INTEGER[(length)] [UNSIGNED] [ZEROFILL]| BIGINT[(length)] [UNSIGNED] [ZEROFILL]| REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]| DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]| FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]| DECIMAL[(length[,decimals])] [UNSIGNED] [ZEROFILL]| NUMERIC[(length[,decimals])] [UNSIGNED] [ZEROFILL]| DATE| TIME[(fsp)]| TIMESTAMP[(fsp)]| DATETIME[(fsp)]| YEAR| CHAR[(length)][CHARACTER SET charset_name] [COLLATE collation_name]| VARCHAR(length)[CHARACTER SET charset_name] [COLLATE collation_name]| BINARY[(length)]| VARBINARY(length)| TINYBLOB| BLOB[(length)]| MEDIUMBLOB| LONGBLOB| TINYTEXT[CHARACTER SET charset_name] [COLLATE collation_name]| TEXT[(length)][CHARACTER SET charset_name] [COLLATE collation_name]| MEDIUMTEXT[CHARACTER SET charset_name] [COLLATE collation_name]| LONGTEXT[CHARACTER SET charset_name] [COLLATE collation_name]| ENUM(value1,value2,value3,...)[CHARACTER SET charset_name] [COLLATE collation_name]| SET(value1,value2,value3,...)[CHARACTER SET charset_name] [COLLATE collation_name]| JSON| spatial_typeindex_col_name:col_name [(length)] [ASC | DESC]index_type:USING {BTREE | HASH}index_option:KEY_BLOCK_SIZE [=] value| index_type| WITH PARSER parser_name| COMMENT 'string'reference_definition:REFERENCES tbl_name (index_col_name,...)[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE][ON DELETE reference_option][ON UPDATE reference_option]reference_option:RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULTtable_options:table_option [[,] table_option] ...table_option:AUTO_INCREMENT [=] value| AVG_ROW_LENGTH [=] value| [DEFAULT] CHARACTER SET [=] charset_name| CHECKSUM [=] {0 | 1}| [DEFAULT] COLLATE [=] collation_name| COMMENT [=] 'string'| COMPRESSION [=] {'ZLIB'|'LZ4'|'NONE'}| CONNECTION [=] 'connect_string'| {DATA|INDEX} DIRECTORY [=] 'absolute path to directory'| DELAY_KEY_WRITE [=] {0 | 1}| ENCRYPTION [=] {'Y' | 'N'}| ENGINE [=] engine_name| INSERT_METHOD [=] { NO | FIRST | LAST }| KEY_BLOCK_SIZE [=] value| MAX_ROWS [=] value| MIN_ROWS [=] value| PACK_KEYS [=] {0 | 1 | DEFAULT}| PASSWORD [=] 'string'| ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}| STATS_AUTO_RECALC [=] {DEFAULT|0|1}| STATS_PERSISTENT [=] {DEFAULT|0|1}| STATS_SAMPLE_PAGES [=] value| TABLESPACE tablespace_name [STORAGE {DISK|MEMORY|DEFAULT}]| UNION [=] (tbl_name[,tbl_name]...)partition_options:PARTITION BY{ [LINEAR] HASH(expr)| [LINEAR] KEY [ALGORITHM={1|2}] (column_list)| RANGE{(expr) | COLUMNS(column_list)}| LIST{(expr) | COLUMNS(column_list)} }[PARTITIONS num][SUBPARTITION BY{ [LINEAR] HASH(expr)| [LINEAR] KEY [ALGORITHM={1|2}] (column_list) }[SUBPARTITIONS num]][(partition_definition [, partition_definition] ...)]partition_definition:PARTITION partition_name[VALUES{LESS THAN {(expr | value_list) | MAXVALUE}|IN (value_list)}][[STORAGE] ENGINE [=] engine_name][COMMENT [=] 'string' ][DATA DIRECTORY [=] 'data_dir'][INDEX DIRECTORY [=] 'index_dir'][MAX_ROWS [=] max_number_of_rows][MIN_ROWS [=] min_number_of_rows][TABLESPACE [=] tablespace_name][(subpartition_definition [, subpartition_definition] ...)]subpartition_definition:SUBPARTITION logical_name[[STORAGE] ENGINE [=] engine_name][COMMENT [=] 'string' ][DATA DIRECTORY [=] 'data_dir'][INDEX DIRECTORY [=] 'index_dir'][MAX_ROWS [=] max_number_of_rows][MIN_ROWS [=] min_number_of_rows][TABLESPACE [=] tablespace_name]query_expression:SELECT ...   (Some valid select or union statement)CREATE TABLE creates a table with the given name. You must have the
CREATE privilege for the table.By default, tables are created in the default database, using the
InnoDB storage engine. An error occurs if the table exists, if there is
no default database, or if the database does not exist.For information about the physical representation of a table, see
http://dev.mysql.com/doc/refman/5.7/en/create-table-files.html.URL: http://dev.mysql.com/doc/refman/5.7/en/create-table.html

2.4元数据信息和视图

MySQL5.0之后:information_schema数据库用来记录MySQL中的元数据信息。

元数据是数据的数据。比如表名、列名、列类型、索引名等各种属性名称。


show tables;显示的表也不是实际存储的物理表,而是视图。
一些常用的视图:
SCHEMATA:该表提供了当前mysql实例中所有数据库的信息。show databases;的结果取之此表。
TABLES:该表提供了关于数据库中的表的信息(包括视图),详细描述了某个表属于哪个schema、表类型、表引擎、创建时间等信息。show tables from schemaname的结果取之于此表。
COLUMNS:该表提供了表中的列信息,详细表述了某张表的所有列及每一列的信息。show columns from schemaname.tablename的结果取之此表。

STATISTICS:该表提供了关于表索引的信息。show index from schemaname.tablename;的结果取之于此表。



参考文献[1] 唐汉明. 深入浅出MySQL:数据库开发、优化与管理维护.第2版[M]. 人民邮电出版社, 2014.

[2]https://dev.mysql.com/doc/点击打开链接



MySQL级别操作命令

































本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部