sql语句一文看懂

SQL

sql基本语法

Sql语句必须以关键词开头,也必须以;结尾,sql语句可以写在一行,也可以是多行

sql常用指令

INSERT INTO(增)

INSERT INTO 命令向数据库中插入新的数据,它的用法如下:

INSERT INTO table_name( column1, column2....columnN)
VALUES ( value1, value2....valueN);

DELETE(删)

DELETE 命令用于从数据库中删除数据,它的用法如下:

DELETE FROM table_name
WHERE  {CONDITION};

UPDATE(改)

UPDATE 命令用于更新数据库中的数据,它的用法如下:

UPDATE table_name
SET column1 = value1, column2 = value2....columnN=valueN
[ WHERE  CONDITION ];

SELECT(查)

SELECT 命令用于从数据库中查询(选取)数据,它的用法如下:

SELECT column1, column2....columnN
FROM   table_name;

CREATE TABLE

CREATE TABLE 命令用于创建一个新的数据表,它的用法如下:

CREATE TABLE table_name(
column1 datatype,
column2 datatype,
column3 datatype,
.....
columnN datatype,
PRIMARY KEY( one or more columns )
);

ALTER TABLE

ALTER TABLE 命令用于修改数据表。ALTER TABLE 可以用来修改数据表的字段,例如:

ALTER TABLE table_name {
   
   ADD|DROP|MODIFY} column_name {data_type};

也可以用来修改数据表的名称,例如:

ALTER TABLE table_name RENAME TO new_table_name;

DROP TABLE

DROP TABLE 命令用来删除数据表,它的用法如下:

DROP TABLE table_name;

CREATE DATABASE

CREATE DATABASE 用来创建一个新的数据库,它的用法如下:

CREATE DATABASE database_name;

CREATE INDEX

CREATE INDEX 命令用于创建索引,它的用法如下:

CREATE UNIQUE INDEX index_name
ON table_name ( column1, column2,...columnN);

DROP INDEX

DROP INDEX 命令用来删除索引,它的用法如下:

ALTER TABLE table_name
DROP INDEX index_name;

基本命令使用

create database

使用 create database database_name;
创建一个名为database_name的数据库
可以使用指令

show databases

来展现所有的数据库名

在创建之前必须确保自己具有管理员权限

drop database

使用drop database database_name;
即可删除数据库,完成跑路,使用之前请确保,自己确认要跑路;

use database_name

use database_name 代表要使用该数据库,使用前需要确保,该数据库明确存在

CRAETE TABLE

创建一个表,表一旦被创建完毕后,列将不可改变,但是行是可以进行改变的

CREATE TABLE table_name(
   column1 datatype,
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
   PRIMARY KEY( one or more columns )
);

PRIMARY KEY代表是主键

CREATE TABLE website (
    id      INT              NOT NULL   AUTO_INCREMENT,
    name    VARCHAR(20)      NOT NULL,
    url     VARCHAR(30)                 DEFAULT '',
    age     TINYINT UNSIGNED NOT NULL,
    alexa   INT UNSIGNED     NOT NULL,
    uv      FLOAT                       DEFAULT '0',
    country CHAR(3)          NOT NULL   DEFAULT '',
    PRIMARY KEY (`id`)
);

NOT NULL 代表数据不能为空
AUTO_INCREMENT 代表自动增长的序列;
DEFAULT代表字段的默认值
PRIMARY KEY代表主键

创建表以后我们可以通过下面这个指令来查看表结构

desc website
+---------+------------------+------+-----+---------+----------------+
| Field   | Type             | Null | Key | Default | Extra          |
+---------+------------------+------+-----+---------+----------------+
| id      | int              | NO   | PRI | NULL    | auto_increment |
| name    | varchar(20)      | NO   |     | NULL    |                |
| url     | varchar(30)      | YES  |     |         |                |
| age     | tinyint unsigned | NO   |     | NULL    |                |
| alexa   | int unsigned     | NO   |     | NULL    |                |
| uv      | float            | YES  |     | 0       |                |
| country | char(3)          | NO   |     |         |                |
+---------+------------------+------+-----+---------+----------------+

DROP TABLE

在你不想使用某一个表的时候可以尝试将他删除,

drop table table_name

重命名表

sql支持两种重命名表的方式

ALTER TABLE old_table_name  RENAME TO new_table_name; 
RENAME TABLE old_table _name TO new_table_name;

插入数据

INSERT INTO
插入数据主要有两种方法

  1. 按照指定列进行数据插入
INSERT INTO table_name (column1, column2, column3,...columnN) 
VALUES (value1, value2, value3,...valueN);
  1. 在所有列中插入数据
INSERT INTO table_name VALUES (value1,value2,value3,...valueN);

第一种示例

insert into website values(1,'淘宝','https://www.tabao.com',10,2,100.1,'cn');
 insert into website values(2,'淘宝','https://www.tabao.com',10,2,100.1,'cn');

第二种示例

insert into website(name,url,uv) values('京东','https://www.jingdong.com',100.2);

使用 select *from website;查看表内数据

+----+--------+--------------------------+-----+-------+--------+---------+
| id | name   | url                      | age | alexa | uv     | country |
+----+--------+--------------------------+-----+-------+--------+---------+
|  1 | 百度   | https://www.baidu.com    |  21 |     1 | 5010.5 | cn      |
|  2 | 淘宝   | https://www.tabao.com    |  10 |     2 |  100.1 | cn      |
|  3 | 京东   | https://www.jingdong.com |   2 |   100 |      0 | cn      |
+----+--------+--------------------------+-----+-------+--------+---------+
3 rows in set (0.00 sec)

表之间的互相填充

可以使用一个表对另外一个表进行填充,不过前提是另外一个表也必须具有一组字段和当前是可以进行匹配的

INSERT INTO first_table_name [(column1, column2, ... columnN)]
    SELECT column1, column2, ...columnN
    FROM second_table_name
    [WHERE condition];

查询 selcet

select会返回一个临时表,显示你想要的数据
格式为

SELECT column1, column2, columnN
FROM table_name
WHERE conditions;

column是键名;
table_name是表名;
conditions是判断条件名

select name from website where id<2;

会返回

+--------+
| name   |
+--------+
| 百度   |
+--------+

conditions是可选的可以输入也可以不输入
如果我们想要看到表内的所有数据可以使用

select * from website
+----+--------+--------------------------+-----+-------+--------+---------+
| id | name   | url                      | age | alexa | uv     | country |
+----+--------+--------------------------+-----+-------+--------+---------+
|  1 | 百度   | https://www.baidu.com    |  21 |     1 | 5010.5 | cn      |
|  2 | 淘宝   | https://www.tabao.com    |  10 |     2 |  100.1 | cn      |
|  3 | 京东   | https://www.jingdong.com |   2 |   100 |      0 | cn      |
+----+--------+--------------------------+-----+-------+--------+---------+

where

where子句增加判断条件,可以用在select update以及delete中

where后的条件可以是<,>.=也可以是and,or等逻辑运算符,也可以是like,not like等模糊判断语句

select * from website where id<5 and name like '%o%';

意为id<5,并且name中带有o的数据,结果为

+----+--------+------------------------+-----+-------+--------+---------+
| id | name   | url                    | age | alexa | uv     | country |
+----+--------+------------------------+-----+-------+--------+---------+
|  4 | google | https://www.goggle.com |  15 |    50 | 1000.2 | en      |
+----+--------+------------------------+-----+-------+--------+---------+

and和or

and代表和,or代表或,and可以理解为&&,or理解为||

update

update我们一般会配合着where进行使用,否则会对所有的数据进行更改,我们不推荐这样做

UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];

示例:
修改前:

+----+----------------+--------------------------------+-----+-------+--------+---------+
| id | name           | url                            | age | alexa | uv     | country |
+----+----------------+--------------------------------+-----+-------+--------+---------+
|  1 | 百度           | https://www.baidu.com          |  21 |     1 | 5010.5 | cn      |
|  2 | 淘宝           | https://www.tabao.com          |  10 |     2 |  100.1 | cn      |
|  3 | 京东           | https://www.jingdong.com       |   2 |   100 |      0 | cn      |
|  4 | google         | https://www.goggle.com         |  15 |    50 | 1000.2 | en      |
|  5 | stack overflow | https://www.stack-overflow.com |  30 |    20 |  100.1 | en      |
+----+----------------+--------------------------------+-----+-------+--------+---------+

update website set name = ‘stack-overflow’ where id = 5;
修改后:

+----+----------------+--------------------------------+-----+-------+--------+---------+
| id | name           | url                            | age | alexa | uv     | country |
+----+----------------+--------------------------------+-----+-------+--------+---------+
|  1 | 百度           | https://www.baidu.com          |  21 |     1 | 5010.5 | cn      |
|  2 | 淘宝           | https://www.tabao.com          |  10 |     2 |  100.1 | cn      |
|  3 | 京东           | https://www.jingdong.com       |   2 |   100 |      0 | cn      |
|  4 | google         | https://www.goggle.com         |  15 |    50 | 1000.2 | en      |
|  5 | stack-overflow | https://www.stack-overflow.com |  30 |    20 |  100.1 | en      |
+----+----------------+--------------------------------+-----+-------+--------+---------+

delect

删除列表中的数据
用法和update相似,也是推荐使用where语句来进行筛选

like

like和where配合使用,能够出现模糊匹配的效果

百分号(%): 代表零个、一个或者多个任意的字符。

下划线(_) : 代表单个字符或者数字。

[charlist] : 字符列表中的任何单一字符。可以使用连字符(-)根据 ASCII 编码指定一个字符范围,例如:
[0-9] 表示从 0 到 9 的任一数字;
[a-z] 表示小写英文字母;
[a-zA-Z] 表示英文字母,不区分大小写;
[a-zA-Z0-9] 表示英文字母和阿拉伯数字。

[^charlist] 或 [!charlist]: 不在字符列表中的任何单一字符。同上,也可以使用连字符(-)指定一个字符范围。

示例:

  1. WHERE uv LIKE ‘200%’
    查找 uv 字段中以 200 开头的值。
  2. WHERE uv LIKE ‘%200%’
    查找 uv 字段中包含 200 的值(200 可以在开头、末尾或者中间的任意位置)。
  3. WHERE uv LIKE ‘_00%’
    查找 uv 字段中第二个和第三个字符都是 0 的值。
  4. WHERE uv LIKE ‘2_%_%’
    查找 uv 字段中以 2 开头,且长度至少为 3 的任意值。
  5. WHERE uv LIKE ‘%2’
    查找 uv 字段中以 2 结尾的值。
  6. WHERE name LIKE ‘%sh%’
    查找 name 字段中包含 sh 的值。
  7. WHERE name LIKE ‘[xyz]’
    查找 name 字段中至少包含 xyz 其中一个字符的值。
  8. WHERE name LIKE ‘[^a-e]’
    查找 name 字段中不包含 a-e 中任何一个字符的值。

top

top也是一种条件判断
top后会跟随一个数字代表从顶开始的前几条数据,对于一些数据量很大的数据库来说,这一点是非常有必要的;
在sql server运行

SELECT TOP 3 * FROM website;

但是不同的数据库具有不同的关键字,
比如我们使用mysql,就需要使用limit来代替

select * from website limit 3;

如果是使用oracle,就需要ROWNUM来进行代替

SELECT * FROM website WHERE ROWNUM <= 3;

上面三条语句的含义是相同的,意在查看前三条数据

order by

order by是配合查询使用的,为了对查询得到的临时表进行排序

SELECT column_list
FROM table_name
[WHERE condition]
[ORDER BY column1, column2, .. columnN] [ASC | DESC];

column是我们在排序时进行取值根据的字段
asc为升序,desc为降序,默认为asc

+----+----------------+--------------------------------+-----+-------+--------+---------+
| id | name           | url                            | age | alexa | uv     | country |
+----+----------------+--------------------------------+-----+-------+--------+---------+
|  1 | 百度           | https://www.baidu.com          |  20 |     1 | 5010.5 | cn      |
|  2 | 淘宝           | https://www.tabao.com          |  20 |     2 |  100.1 | cn      |
|  3 | 京东           | https://www.jingdong.com       |  20 |   100 |      0 | cn      |
|  4 | google         | https://www.goggle.com         |  20 |    50 | 1000.2 | en      |
|  5 | stack-overflow | https://www.stack-overflow.com |  20 |    20 |  100.1 | en      |
+----+----------------+--------------------------------+-----+-------+--------+---------+
5 rows in set (0.01 sec)

select *from order by alexa;

根据alexa进行排序

select *from order by alexa,uv,

当alexa相等时按照uv进行排序

select * from website order by alexa desc, uv;

根据alexa降序,uv升序;

group by

在一些情况下会面临分组的问题,因为表中行与行难免会有一些数据是相同的,我们可以根据这些相同的数据进行分组,使用方式为:

SELECT column1, column2
FROM table_name
WHERE [ conditions ]
GROUP BY column1, column2
ORDER BY column1, column2

GROUP BY 子句需要和 SELECT 语句一起使用;
如果有 WHERE 子句,那么 WHERE 子句需要放在 GROUP BY 子句之前;
如果有 ORDER BY 子句,那么 ORDER BY 子句需要放在 GROUP 子句之后。

select name,sum(uv) from website group by name;

查询的临时表中显示name和uv之和,判断的依据为name

需要注意的是表中显示的数据一定要和后面所依赖的是相同的

根据sql聚合函数,我们可以对组内数据进行再加工

SUM( ) 函数可以对指定字段的值进行求和;
COUNT( ) 函数可以计算某个分组内数据的条数;
AVG( ) 函数可以对指定字段的值求平均数。

distinct

SQL DISTINCT 关键字需要和 SELECT 语句一起使用,用来删除结果集中所有重复的记录,仅保留唯一的一条记录。

数据表中有时候会有重复的记录,如果您只需要其中一条,就可以使用 DISTINCT 关键字。

SELECT DISTINCT column1, column2,.....columnN
FROM table_name
WHERE [condition]

distint后跟的字段一定需要全部重复才会进行删除,删除后对原表不构成影响,生成的新暂时表显示的字段也是distint后的字段;

sql约束

约束(Constraint)是指表的数据列必须强行遵守的规则,这些规则用于限制插入表中的数据类型,这样能够确保每份数据的准确定和可靠性。

约束可以是列级别,也可以是表级别;列级约束仅作用于某一列,而表级约束则作用于整张表。

下面是 SQL 常用的一些约束:

NOT NULL: 非空约束,确保列中不能有 NULL 值。
DEFAULT: 默认约束,如果未指定值,那么列将提供默认值。
UNIQUE: 唯一约束,确保列中所有的值都不相同。
PRIMARY: Key 主键,用来唯一标识数据库中的每一行/记录。
FOREIGN: Key 外键,用来唯一标识任何其它数据库中表的行/记录。
CHECK: 检查性约束,用于确保列中的所有值都必须满足某些条件。
INDEX: 索引,用于快速从数据库中检索或者获取数据。

创建约束

在创建数据表时,可以使用 CREATE TABLE 语句指定约束规则;创建数据表以后,也可以使用 ALTER TABLE 语句来增加约束规则。

删除约束

可以使用带有 DROP CONSTRAINT 选项的 ALTER TABLE 语句来删除已经定义的约束。例如,删除 EMPLOYEES 表中的主键可以使用下面的语句:

ALTER TABLE EMPLOYEES DROP CONSTRAINT EMPLOYEES_PK;

null

关键词null用来表示缺失的值或者是未定义,表示空值,并不代表0值或者是空格

我们不能使用 =、<、> 等比较运算符来检测 NULL 值,而必须使用 IS NULL 或者 IS NOT NULL 关键字来检测 NULL 值。

创建数据表时可以指定每个值是否为null

CREATE TABLE website (
    id      INT              NOT NULL   AUTO_INCREMENT,
    name    VARCHAR(20)      NOT NULL,
    url     VARCHAR(30),
    age     TINYINT UNSIGNED NOT NULL,
    alexa   INT UNSIGNED     NOT NULL,
    uv      FLOAT                       DEFAULT '0',
    country CHAR(3)          NOT NULL   DEFAULT '',
    PRIMARY KEY (`id`)
);

NOT NULL 关键字表示不允许该字段为空值,在插入或者更新记录时必须为该字段指定一个具体的值。url 和 uv 两个字段没有使用 NOT NULL 关键字,这意味着它们保持默认,也即允许为 NULL。注意,uv 字段指定了默认值 0,如果不为该字段提供值,它的值将是 0;url 字段没有指定默认值,如果不为该字段提供值,它的值将是 NULL。

select * from website where age is not null
查询所有age不为null的行

not null

默认情况下,是允许字段名下为null的,但是如果我们有时不希望为null的话,可以加上not null(非空约束),这时就必须要给一个数据

null并不代表没有值,而是意味着值未知
如果我们已经创建过表了,那么我们想要增加非空依赖的话可以使用

ALTER TABLE website
MODIFY url VARCHAR(30) NOT NULL;

default

SQL DEFAULT 约束用于给字段指定一个默认值,当使用 INSERT INTO 语句向表中插入数据时,如果没有为该字段提供具体的值,那么就使用这个默认值。

CREATE TABLE website (
    id      INT              NOT NULL   AUTO_INCREMENT,
    name    VARCHAR(20)      NOT NULL,
    url     VARCHAR(30),
    age     TINYINT UNSIGNED NOT NULL,
    alexa   INT UNSIGNED     NOT NULL,
    uv      FLOAT                       DEFAULT '10.0',
    country CHAR(3)          NOT NULL   DEFAULT '',
    PRIMARY KEY (`id`)
);

如果已经创建了 website 表,则可以使用 ALTER TABLE 语句将 DEFAULT 约束添加到 uv 字段,如下所示:

ALTER TABLE website
MODIFY uv FLOAT DEFAULT '10.0';

借助 ALTER TABLE 语句也可以删除默认约束,如下所示:

ALTER TABLE website
ALTER COLUMN uv DROP DEFAULT;

unique

unique 在表中意为唯一的值,其他的记录中不能出现重复的值,

unique和primary key的区别是,primary不能出现null,而unique是允许有一条数据为null的

所以我们可以理解为

primary key = unique+not null
一条数据中可以有多个值是unique,但是只能有一个值作为主键

CREATE TABLE website (
    id      INT              NOT NULL   AUTO_INCREMENT,
    name    VARCHAR(20)      NOT NULL,
    url     VARCHAR(30),
    age     TINYINT UNSIGNED NOT NULL,
    alexa   INT UNSIGNED     NOT NULL   UNIQUE,
    uv      FLOAT                       DEFAULT '0',
    country CHAR(3)          NOT NULL,
    PRIMARY KEY (`id`)
);

如果已经创建了表,那么我们想对alexa添加unique约束,则可以:

ALTER TABLE website
MODIFY alexa UNIQUE;

希望为多个添加使用

ALTER TABLE website
ADD CONSTRAINT myUniqueConstraint UNIQUE(alexa, url);

删除unique

ALTER TABLE website
DROP INDEX myUniqueConstraint;

主键

主键可以由一个或者是多个字段组成,唯一标识符

如果 website 表和 id 字段都已经存在,则可以使用 ALTER TABLE 命令添加主键,语法如下:

ALTER TABLE website ADD PRIMARY KEY (id);

如果 website 表已经存在,则可以使用下面的 SQL 语句在 id 和 url 字段上添加主键:

ALTER TABLE website
ADD CONSTRAINT PK_CUSTID PRIMARY KEY (id, url);

使用下面的语句可以删除表的主键约束:

ALTER TABLE website DROP PRIMARY KEY;

外键

SQL 外键(Foreign Key)用于将两个表连接在一起,让两个表的数据保持同步。

外键由表中的一个字段或者多个字段构成,一个表的外键用来指向另一个表的主键(Primary Key)。包含外键的表称为从表,被指向的表称为主表。从表的数据受到主表的约束,向从表中插入或者更新数据时,外键的值必须存在于主表的主键中。

对外键约束的几点说明:

  • 一个表可以有多个外键,但是只能有一个主键。
  • 外键约束用于防止破坏两个表之间的关联性,保证数据的完整性和一致性。
  • 外键约束能够防止非法数据进入外键字段,因为它的值必须存在于它指向的主键中。
  • 从表的外键类型,必须与主表的主键类型一致。
  • 删除/更新主表记录时,可以选择同时删除/更新从表中的相关记录,也可以选择不删除/更新,您可以在定义外键时对此进行设置。
  • 删除主表记录时,必须先删除从表中的关联记录,否则主表中的记录将无法删除。
  • 删除主表时,必须先删除从表,否则主表将无法删除。

如果您已经创建了 order 表并且没有设置外键,那么可以使用 ALTER TABLE 命令来添加外键,如下所示:

ALTER TABLE `order`
ADD FOREIGN KEY (uid) REFERENCES user (id);

要删除外键约束,请使用下面的 SQL 语句:

ALTER TABLE `order`
DROP FOREIGN KEY;

主键 VS 外键
以下是 SQL 主键和外键的一些重要区别:

  • 主键不能包含 NULL 值,外键可以包含 NULL 值。
  • 每条记录的主键都必须是唯一的,不能重复,而不同记录的外键可以是相同的。
  • 表中只能有一个主键,但是可以有多个外键。
  • 默认情况下,数据库引擎会自送为主键创建索引;而外键不会,您必须手动为外键创建索引。

check

check为检查性约束,即给一个条件,当满足这个条件时才能够将此数据加入这个字段

CREATE TABLE website (
    id      INT              NOT NULL   AUTO_INCREMENT,
    name    VARCHAR(20)      NOT NULL,
    url     VARCHAR(30),
    age     TINYINT UNSIGNED NOT NULL CHECK(age<=25),
    alexa   INT UNSIGNED     NOT NULL CHECK(alexa<=10000),
    uv      FLOAT                       DEFAULT '0',
    country CHAR(3)          NOT NULL ,
    PRIMARY KEY (id)
);

或者是

CREATE TABLE website (
    id      INT              NOT NULL   AUTO_INCREMENT,
    name    VARCHAR(20)      NOT NULL,
    url     VARCHAR(30),
    age     TINYINT UNSIGNED NOT NULL,
    alexa   INT UNSIGNED     NOT NULL,
    uv      FLOAT                       DEFAULT '0',
    country CHAR(3)          NOT NULL ,
    PRIMARY KEY (id),
    CONSTRAINT myCheck CHECK(age<=25 AND alexa<=10000)
);

如果您已经创建了 website 表,并且希望向 age 字段添加约束,则可以使用下面的语句:

ALTER TABLE website
MODIFY age TINYINT UNSIGNED NOT NULL CHECK(age<=25);

如果您希望给多个字段添加约束,可以使用下面的语法:

ALTER TABLE website
ADD CONSTRAINT myCheck CHECK(age<=25 AND alexa<=10000);

要想删除 CHECK 约束,请使用下面的语法:(该语法不适用于mysql)

ALTER TABLE website
DROP CONSTRAINT myCheck;

猜你喜欢

转载自blog.csdn.net/weixin_44846765/article/details/125268638
今日推荐