【数据库-MySQL】3. MySQL增删改查详细命令讲解

版权声明:欢迎交流 https://blog.csdn.net/sishuihuahua/article/details/87878360

        关系数据库的基本操作就是增删改查,即CRUD:Create、Retrieve、Update、Delete。前两篇博文讲解了数据库的基本理论知识与它的简单的操作流程,包括一些简单的指令,可以说是简单的入门,所以本篇博文将主要讲解SQL指令用法。

        注意:该部分总结适用MySQL,有些特殊适用方法可能不适用其他数据库,使用其他数据库时请最好以相应的数据库支持为准。

MySQL常用关键字:

  • SELECT - 从数据库中提取数据
  • UPDATE - 更新数据库中的数据
  • DELETE - 从数据库中删除数据
  • INSERT INTO - 向数据库中插入新数据
  • CREATE DATABASE - 创建新数据库
  • ALTER DATABASE - 修改数据库
  • CREATE TABLE - 创建新表
  • ALTER TABLE - 变更(改变)数据库表
  • DROP TABLE - 删除表
  • CREATE INDEX - 创建索引(搜索键)
  • DROP INDEX - 删除索引

SQL 语句

语法

备注

AND / OR

SELECT column_name(s)
FROM table_name
WHERE condition
AND|OR condition

用于基于一个以上的条件对记录进行过滤

ALTER TABLE

ALTER TABLE table_name
ADD column_name datatype

or

ALTER TABLE table_name
DROP COLUMN column_name

用于在已有的表中添加、删除或修改列

AS (alias)

SELECT column_name AS column_alias
FROM table_name

or

SELECT column_name
FROM table_name AS table_alias

取别名,创建别名是为了让列名称的可读性更强

BETWEEN

SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2

用于选取介于两个值之间的数据范围内的值,可以是数值、文本或者日期(不同数据库代表的范围可能不同)

CREATE DATABASE

CREATE DATABASE database_name

用于创建数据库

CREATE TABLE

CREATE TABLE table_name
(
column_name1 data_type,
column_name2 data_type,
column_name2 data_type,
...
)

用于创建数据库中的表

CREATE INDEX

CREATE INDEX index_name
ON table_name (column_name)

or

CREATE UNIQUE INDEX index_name
ON table_name (column_name)

用于在表中创建索引。

在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据

 

CREATE VIEW

CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

创建基于 SQL 语句的结果集的可视化的表

DELETE

DELETE FROM table_name
WHERE some_column=some_value

or

DELETE FROM table_name
(Note: Deletes the entire table!!)

DELETE * FROM table_name
(Note: Deletes the entire table!!)

用于删除表中的记录

DROP DATABASE

DROP DATABASE database_name

用于删除数据库

DROP INDEX

DROP INDEX table_name.index_name (SQL Server)
DROP INDEX index_name ON table_name (MS Access)
DROP INDEX index_name (DB2/Oracle)
ALTER TABLE table_name
DROP INDEX index_name (MySQL)

用于删除表中的索引

DROP TABLE

DROP TABLE table_name

用于删除表

GROUP BY

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name

分组聚合

HAVING

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

当分组筛选的时候用HAVING,用HAVING就一定要和GROUP BY连用

IN

SELECT column_name(s)
FROM table_name
WHERE column_name
IN (value1,value2,..)

允许您在 WHERE 子句中规定多个值(注意不是范围,是值)

INSERT INTO

INSERT INTO table_name
VALUES (value1, value2, value3,....)

or

INSERT INTO table_name
(column1, column2, column3,...)
VALUES (value1, value2, value3,....)

用于向表中插入新记录

INSERT INTO SELECT

INSERT INTO table2
SELECT * FROM table1;

or

INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;

从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响

INNER JOIN

SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name

 

 

如果表中有至少一个匹配,则返回行

LEFT JOIN

SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name

即使右表中没有匹配,也从左表返回所有的行

 

 

RIGHT JOIN

SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name

即使左表中没有匹配,也从右表返回所有的行

    

FULL JOIN

SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name=table_name2.column_name

只要其中一个表中存在匹配,则返回行

 

     

LIKE

SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern

用于在 WHERE 子句中搜索列中的指定模式

ORDER BY

SELECT column_name(s)
FROM table_name
ORDER BY column_name [ASC|DESC]

用于对结果集进行排序

ASC(默认为正序排序)

DESC倒序

SELECT

SELECT column_name(s)
FROM table_name

从数据库中选取数据。

结果被存储在一个结果表中,称为结果集

SELECT *

SELECT *
FROM table_name

从xxx表中选取所有列

SELECT DISTINCT

SELECT DISTINCT column_name(s)
FROM table_name

返回唯一不同的值

SELECT INTO

SELECT *
INTO new_table_name [IN externaldatabase]
FROM old_table_name

or

SELECT column_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_table_name

从一个表复制数据,然后把数据插入到另一个新表中

SELECT TOP

SELECT TOP number|percent column_name(s)
FROM table_name

用于规定要返回的记录的数目(这是MySQL语法,不同数据库有不同语法)

TRUNCATE TABLE

TRUNCATE TABLE table_name

清空表数据

UNION

SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

合并两个或多个 SELECT 语句的结果,每个 SELECT 语句中的列的顺序必须相同。过滤重复。

UNION ALL

SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2

合并两个或多个 SELECT 语句的结果,每个 SELECT 语句中的列的顺序必须相同,全部显示,不过滤

UPDATE

UPDATE table_name
SET column1=value, column2=value,...
WHERE some_column=some_value

 

用于更新表中已存在的记录

WHERE

SELECT column_name(s)
FROM table_name
WHERE column_name operator value

用于提取那些满足指定标准的记录

 

  • WHERE 子句中的运算符

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

运算符

描述

例子

=

等于

 

<>

不等于。注释:在 SQL 的一些版本中,该操作符可被写成 !=

 

>

大于

 

<

小于

 

>=

大于等于

 

<=

小于等于

 

BETWEEN

在某个范围内

Select * from emp where sal between 1500 and 3000;

LIKE

搜索某种模式

Select * from emp where ename like 'M%';

查询 EMP 表中 Ename 列中有 M 的值,M 为要查询内容中的模糊信息。

% 表示多个字值,_ 下划线表示一个字符;

M% : 为能配符,正则表达式,表示的意思为模糊查询信息为 M 开头的。

%M% : 表示查询包含M的所有内容。

%M_ : 表示查询以M在倒数第二位的所有内容。

‘_ M _’    //三位且中间字母是M的

'_ M '    //两位且结尾字母是M的

' M _'    //两位且开头字母是M的

IN

指定针对某个列的多个可能值

Select * from emp where sal in (5000,3000,1500);

查询 EMP 表 SAL 列中等于 5000,3000,1500 的值

IS NULL

空值判断

Select * from emp where comm is null;

在 MySQL 中可以通过设置 sql_safe_updates 这个自带的参数来解决,当该参数开启的情况下,你必须在update 语句后携带 where 条件,否则就会报错。

set sql_safe_updates=1; 表示开启该参数

  • JOIN

http://www.runoob.com/wp-content/uploads/2019/01/sql-join.png

  • SQL 通配符

在 SQL 中,通配符与 SQL LIKE 操作符一起使用。

SQL 通配符用于搜索表中的数据。

通配符

描述

%

替代 0 个或多个字符

_

替代一个字符

[charlist]

字符列中的任何单一字符

[^charlist]

[!charlist]

不在字符列中的任何单一字符

 

  • SQL 约束(Constraints)

SQL 约束用于规定表中的数据规则。

如果存在违反约束的数据行为,行为会被约束终止。

约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。

 

SQL CREATE TABLE + CONSTRAINT 语法

CREATE TABLE table_name
(
column_name1 data_type(size) constraint_name,
column_name2 data_type(size) constraint_name,
column_name3 data_type(size) constraint_name,
....
);

在 SQL 中,我们有如下约束:

  • NOT NULL - 指示某列不能存储 NULL 值。
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
  • UNIQUE - 保证某列的每行必须有唯一的值。
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (P_Id),
CONSTRAINT uc_PersonID UNIQUE (LastName, FirstName)  --命名UNIQUE约束,并定义多个列的UNIQUE 约束
)

如果是已存在的表:

ALTER TABLE Persons
ADD UNIQUE (P_Id)

--或者:

ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)

  撤销UNIQUE约束:

ALTER TABLE Persons
DROP INDEX uc_PersonID
  • PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id),

CONSTRAINT pk_PersonID PRIMARY KEY (LastName, FirstName)  --命名 PRIMARY KEY 约束,并定义多个列的 PRIMARY KEY 约束
)

 如果是已存在的表:

ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)

--或者:

ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)

撤销PRIMARY KEY约束:

ALTER TABLE Persons
DROP PRIMARY KEY
  • FOREIGN KEY – 外键。保证一个表中的数据匹配另一个表中的值的参照完整性。
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(表) (P_Id),

CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id) --命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束
REFERENCES Persons(表)(P_Id)
)

如果是已存在的表:

ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

--或者:

ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

撤销FOREIGN KEY约束:

ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders
  • CHECK - 保证列中的值符合指定的条件。

如果对单个列定义 CHECK 约束,那么该列只允许特定的值。

如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。

CREATE TABLE Persons
(
P_Id int NOT NULL,
Hight int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (P_Id>0),

CONSTRAINT chk_Person CHECK (Hight >0 AND City='Sandnes') --命名 CHECK 约束,并定义多个列的 CHECK 约束
)

如果是已存在的表:

ALTER TABLE Persons
ADD CHECK (P_Id>0)

或者:

ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')

撤销CHECK约束:

ALTER TABLE Persons
DROP CHECK chk_Person
  • DEFAULT - 规定没有给列赋值时的默认值。
CREATE TABLE Persons
(
    P_Id int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255) DEFAULT 'Sandnes',
    OrderDate date DEFAULT GETDATE()
)

如果表已经被创建:
 

ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'

撤销DEFAULT约束:

ALTER TABLE Persons
ALTER City DROP DEFAULT
  • AUTO INCREMENT - 新记录插入表中时生成一个唯一的数字

下面的 SQL 语句把 "Persons" 表中的 "ID" 列定义为 auto-increment 主键字段:

CREATE TABLE Persons
(
ID int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (ID)
)

MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务。

默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。

要让 AUTO_INCREMENT 序列以其他的值起始,请使用下面的 SQL 语法:

ALTER TABLE Persons AUTO_INCREMENT=100

 

  • 视图

        百度百科定义了什么是视图,但是对缺乏相关知识的人可能还是难以理解或者只有一个比较抽象的概念,笔者举个例子来解释下什么是视图。

        朕想要了解皇宫的国库的相关情况,想知道酒窖有什么酒,剩多少,窖藏多少年,于是派最信任的高公公去清点,高公公去国库清点后报给了朕;朕又想知道藏书情况,于是又派高公公去清点并回来报告给朕,又想知道金银珠宝如何,又派高公公清点。。。过一段时间又想知道藏书情况,高公公还得重新再去清点,皇上问一次,高公公就得跑一次路。

        后来皇上觉得高公公不容易,就成立了国库管理部门,小邓子负责酒窖,小卓子负责藏书,而小六子负责金库的清点。。。后来皇上每次想了解国库就直接问话负责人,负责人就按照职责要求进行汇报。

        安排专人管理后,每次皇上想要了解国库情况,就不必让高公公每次都跑一趟,而是指定的人员按照指定的任务完成指定的汇报工作就可以了。

        和数据库相对应,每次进行查询工作,都需要编写查询代码进行查询;而视图的作用就是不必每次都重新编写查询的SQL代码,而是通过视图直接查询即可。因此:

        注意:视图是虚拟表,本身不存储数据,而是按照指定的方式进行查询。

视图参考链接原文:https://blog.csdn.net/moxigandashu/article/details/63254901

创建视图:

CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

注释:视图总是显示最新的数据!每当用户查询视图时,数据库引擎通过使用视图的 SQL 语句重建数据。

更新视图(更新视图是指更新视图所依赖的SQL语句):      

CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

  查询就类似查表,但是实际的意义与效率就不一样了。

 

猜你喜欢

转载自blog.csdn.net/sishuihuahua/article/details/87878360