SQL 简介

SQL (Structured Query Language:结构化查询语言) 是用于管理关系数据库管理系统(RDBMS)。 SQL 的范围包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制。
一句话就是:访问和处理数据库的标准的计算机语言

SQL 是什么?

  • SQL 指结构化查询语言
  • SQL 使我们有能力访问数据库
  • SQL 是一种 ANSI 的标准计算机语言

注:ANSI,美国国家标准化组织

SQL 能做什么?

SQL基础语法(增删查改)

重要的事情说三遍:
使用SQL语句的时候 末尾一定要加’;’ 切记 (SQL 对大小写不敏感:SELECT 与 select 是相同的。)
使用SQL语句的时候 末尾一定要加’;’ 切记 (SQL 对大小写不敏感:SELECT 与 select 是相同的。)
使用SQL语句的时候 末尾一定要加’;’ 切记 (SQL 对大小写不敏感:SELECT 与 select 是相同的。)

数据库

一个数据库通常包含一个或多个表(每个表又有不同的数据),每个表都有一个名字表示,表包含带有数据的记录(行)。
打个比方 就是:
一个班级有不同的学生,每个学生都有自己的兴趣爱好

mysql> use test;
Database changed
mysql> select * from text;
+-------+----------+--------------+------------+
| pk_id | idx_name | idx_password | idx_driver |
+-------+----------+--------------+------------+
|     1 | abc      | abc          | NULL       |
|     4 | 111      | 111          | NULL       |
+-------+----------+--------------+------------+

use test; 命令用于选择数据库
select * from test; 读取数据表的信息。
上面的表包含2条记录(每一条对应一个人的信息)和4个列(pk_id,idx_name,idx_password,idx_driver)。
补充语句 set names utf8; 命令用于设置使用的字符集。 因为有人用的是GBK等版本 默认应该还是utf-8
例如我的test表的就是:
utf8mb4_0900_ai_ci

create table (新建表)

create TABLE text(
pk_id int,
idx_name varchar(20),
idx_password varchar(20),
idx_driver varchar(20)
)

SQL SELECT 语句(查询数据)

其实这个我刚刚上面已经放过代码了 没注意的铁子 可以看到 数据库 这个地方

  • SELECT 语句用于从数据库中选取数据。

  • SELECT 语句用于从数据库中选取数据。

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

SQL SELECT 语法

mysql> select idx_name ,idx_password from text;
+----------+--------------+
| idx_name | idx_password |
+----------+--------------+
| abc      | abc          |
| 111      | 111          |
+----------+--------------+

或者

mysql> select * from text;
+-------+----------+--------------+------------+
| pk_id | idx_name | idx_password | idx_driver |
+-------+----------+--------------+------------+
|     1 | abc      | abc          | NULL       |
|     4 | 111      | 111          | NULL       |
+-------+----------+--------------+------------+

其实 他们的区别就是 *(代表全部列)和具体的列名
如果你下想查看每一列的数据,那就使用 select * from 表名; 如果只是查看具体的某几列,那就使用 select 列名1,列名2 from 表名;


SQL INSERT INTO 语句(新增数据)

INSERT INTO 语句用于向表中插入新记录。

SQL INSERT INTO语法

INSERT INTO 语句可以有两种编写形式。

第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:

INSERT INTO 表名
VALUES (value1,value2,value3,...);
//这些个value都是对应表的每一列取写入的   所以 不管你的id是自增序列还是上面的  这个不能省略
//这个单引号是因为 列的数据类型是 varchar 因为要那个单引号  不然就会报错
mysql> insert into text values(123,'CCW','CCWNB','NB'); 
Query OK, 1 row affected (0.01 sec)
mysql> select * from text;
+-------+----------+--------------+------------+
| pk_id | idx_name | idx_password | idx_driver |
+-------+----------+--------------+------------+
|     1 | abc      | abc          | NULL       |
|     4 | 111      | 111          | NULL       |
|   123 | CCW      | CCWNB        | NB         |
+-------+----------+--------------+------------+
3 rows in set (0.04 sec)

第二种形式需要指定列名及被插入的值:

INSERT INTO 表名(列名1,列名2,列名3,...)
VALUES (value1,value2,value3,...);
//如果说自增序列 你不想自己输入  那么这个就可以做到 因为你可以不输入那个列嘛
mysql> insert into text(idx_name,idx_password,idx_driver) values('CCW','CCWNB','NB');
Query OK, 1 row affected (0.01 sec)

mysql> select * from text;
+-------+----------+--------------+------------+
| pk_id | idx_name | idx_password | idx_driver |
+-------+----------+--------------+------------+
|     1 | abc      | abc          | NULL       |
|     4 | 111      | 111          | NULL       |
|   123 | CCW      | CCWNB        | NB         |
|   124 | CCW      | CCWNB        | NB         |
+-------+----------+--------------+------------+
4 rows in set (0.04 sec)
你看这个 124 就是数据库自动输入的 在上一个基础上+1 

SQL UPDATE 语句(修改数据)

UPDATE 语句用于更新表中的记录(已存在)。

SQL UPDATE 语法

UPDATE 表名
SET 列名1=value1,列名2=value2,...   //这里是要修改列里面的数据
WHERE some_column=some_value; 

 /*这个是 怎么说呢  让我思考一下  嗯... 你要修改某一行的数据,那么你首先找到这一行是吧
 但你只需要 这一行的其他数据,然后通过这个取定位*/

演示:

mysql> UPDATE text
SET idx_name='AAA'
WHERE idx_password='111';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

mysql> SELECT * FROM TEXT;
+-------+----------+--------------+------------+
| pk_id | idx_name | idx_password | idx_driver |
+-------+----------+--------------+------------+
|     1 | abc      | abc          | NULL       |
|     4 | AAA      | 111          | NULL       |
|   123 | CCW      | CCWNB        | NB         |
|   124 | CCW      | CCWNB        | NB         |
+-------+----------+--------------+------------+
4 rows in set (0.02 sec)

特别注意: 如果 你的where后的的查找值不是唯一的 那么 那几行都会修改 如果不懂我的意思的话 就看下面的代码样例吧

mysql> UPDATE text
SET idx_name='ccw'  //我把大写的 CCW 改成了小写的 ccw
WHERE idx_password='CCWNB';
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from text;
+-------+----------+--------------+------------+
| pk_id | idx_name | idx_password | idx_driver |
+-------+----------+--------------+------------+
|     1 | abc      | abc          | NULL       |
|     4 | AAA      | 111          | NULL       |
|   123 | ccw      | CCWNB        | NB         |
|   124 | ccw      | CCWNB        | NB         |
+-------+----------+--------------+------------+
4 rows in set (0.03 sec)

Update 警告!

在更新记录时要格外小心!在上面的实例中,如果我们省略了 WHERE 子句,如下所示:

UPDATE text
SET idx_name='JSU',idx_password='jsu'
执行以上代码会将 Websites 表中所有数据的 idx_name改为 JSU,idx_password 改为 jsu。

执行没有 WHERE 子句的 UPDATE 要慎重,再慎重。
这…我还是演示一下吧!

mysql> UPDATE text
SET idx_name='JSU',idx_password='jsu';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> select * from text;
+-------+----------+--------------+------------+
| pk_id | idx_name | idx_password | idx_driver |
+-------+----------+--------------+------------+
|     1 | JSU      | jsu          | NULL       |
|     4 | JSU      | jsu          | NULL       |
|   123 | JSU      | jsu          | NB         |
|   124 | JSU      | jsu          | NB         |
+-------+----------+--------------+------------+
4 rows in set (0.04 sec)

SQL DELETE 语句(删除数据)

DELETE 语句用于删除表中的记录。

SQL DELETE 语法

DELETE FROM 表名
WHERE some_column=some_value;
//这个也是定位   指定一列的值 然后通过查找 然后删除指定的列对应的值的哪一行数据

演示:

mysql> delete from text where pk_id=1;
Query OK, 1 row affected (0.01 sec)

mysql> select * from text;
+-------+----------+--------------+------------+
| pk_id | idx_name | idx_password | idx_driver |
+-------+----------+--------------+------------+
|     4 | JSU      | jsu          | NULL       |
|   123 | JSU      | jsu          | NB         |
|   124 | JSU      | jsu          | NB         |
+-------+----------+--------------+------------+
3 rows in set (0.04 sec)

同时 这个也是 注意where 和上面UPDATA警告 一样一样的

mysql> delete from text where idx_name='JSU';
Query OK, 3 rows affected (0.01 sec)

mysql> select * from text;
Empty set
//现在就是空表了  因为我删完了

拓展一下

1.多表查询

不多说 直接看例子好吧 待老夫先去整俩个表

测试数据:
表名为:person
在这里插入图片描述

表名为:text
在这里插入图片描述

1.1概述

在实际的数据库应用中,我们经常需要从多个数据表中读取数据,这时我们就可以使用SQL语句中的连接(JOIN),在两个或多个数据表中查询数据。

JOIN 按照功能可分为如下三类:

INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录;
LEFT JOIN(左连接):获取左表中的所有记录,即使在右表没有对应匹配的记录;
RIGHT JOIN(右连接):与 LEFT JOIN 相反,用于获取右表中的所有记录,即使左表没有对应匹配的记录。

1.2用法

1.2.1 SQL INNER JOIN (交集)

如图:
在这里插入图片描述
SQL INNER JOIN 语法

SELECT column_name(s) 查询的列
FROM table1 //表一  
INNER JOIN table2 //表二
ON table1.column_name=table2.column_name; //需要判断相等的列

或:

SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;

注释:INNER JOIN 与 JOIN 是相同的。

  select text.idx_name ,person.idx_name 
 from text
 inner join person
 on person.idx_team=text.idx_name//需要判断相等的列
 order by person.idx_name; //通过这一列 排序
+----------+----------+
| idx_name | idx_name |
+----------+----------+
| 皇马     | C罗      |
| 巴萨     | 格列兹曼 |
| 巴萨     | 梅西     |
| 拜仁     | 莱万     |
| 曼联     | 鲁尼     |
+----------+----------+
5 rows in set (0.03 sec)

注释:INNER JOIN 关键字在表中存在至少一个匹配时返回行。如果 “text” 表中的行在 “person” 中没有匹配,则不会列出这些行。

1.2.2 SQL LEFT JOIN (看左边)

LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。

上图:
在这里插入图片描述
SQL LEFT JOIN 语法
用法差不多,只是返回的结果不一样

SELECT column_name(s)
FROM table1   
LEFT JOIN table2
ON table1.column_name=table2.column_name;
或:

SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;

注释:在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN。(这个咱也没遇到过 咱也不晓得 所以不多赘述)

演示:
这个为了演示 在text中多加了与一行记录

INSERT into text VALUES(5,'曼城','曼城NB');

这个就是 通过表一的值 然后去表二去查找 找到返回,找不到 就返回NULL

  select text.idx_name ,person.idx_name
 from text  
left join person //表二
 on person.idx_team=text.idx_name; //判断条件
+----------+----------+
| idx_name | idx_name |
+----------+----------+
| 巴萨     | 格列兹曼 |
| 巴萨     | 梅西     |
| 皇马     | C罗      |
| 拜仁     | 莱万     |
| 曼联     | 鲁尼     |
| 曼城     | NULL     |
+----------+----------+
6 rows in set (0.04 sec)

注释:LEFT JOIN 关键字从左表(text)返回所有的行,即使右表(person)中没有匹配。

1.2.3 SQL RIGHT JOIN (看右边)

RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。

返回结果如图:
在这里插入图片描述
SQL RIGHT JOIN 语法

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;
或:

SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;

注释:在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN。

演示:
这里为了演示在person表中新增一个 马儿吧
因为 右边返回的值 左边对应不上 就是 NULL

INSERT INTO person VALUES (6,'内马尔','巴黎');
mysql>  select text.idx_name ,person.idx_name
 from person
left join text
 on person.idx_team=text.idx_name;
+----------+----------+
| idx_name | idx_name |
+----------+----------+
| 巴萨     | 梅西     |
| 皇马     | C罗      |
| 巴萨     | 格列兹曼 |
| 曼联     | 鲁尼     |
| 拜仁     | 莱万     |
| NULL     | 内马尔   |
+----------+----------+
6 rows in set (0.04 sec)

注释:RIGHT JOIN 关键字从右表(access_log)返回所有的行,即使左表(Websites)中没有匹配。

2.约束

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 值。
  • UNIQUE - 保证某列的每行必须有唯一的值。
  • PRIMARY KEY - NOT NULL 和 UNIQUE
    的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
  • FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
  • CHECK - 保证列中的值符合指定的条件。
  • DEFAULT - 规定没有给列赋值时的默认值。
SQL NOT NULL 约束

NOT NULL 约束强制列不接受 NULL 值。

NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。

下面的 SQL 强制 “ID” 列、 “LastName” 列以及 “FirstName” 列不接受 NULL 值:

CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255) NOT NULL,
    Age int
);

添加 NOT NULL 约束
在一个已创建的表的 “Age” 字段中添加 NOT NULL 约束如下所示:

实例

ALTER TABLE Persons
MODIFY Age int NOT NULL;
删除 NOT NULL 约束
在一个已创建的表的 "Age" 字段中删除 NOT NULL 约束如下所示:

实例

ALTER TABLE Persons
MODIFY Age int NULL;
SQL UNIQUE 约束

UNIQUE 约束唯一标识数据库表中的每条记录。

UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。

PRIMARY KEY 约束拥有自动定义的 UNIQUE 约束。

请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY (主键)约束。

CREATE TABLE 时的 SQL UNIQUE 约束
下面的 SQL 在 “Persons” 表创建时在 “P_Id” 列上创建 UNIQUE 约束:

MySQL:

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) 
)

ALTER TABLE 时的 SQL UNIQUE 约束
当表已被创建时,如需在 “P_Id” 列创建 UNIQUE 约束,请使用下面的 SQL:

ALTER TABLE Persons
ADD UNIQUE (P_Id)

撤销 UNIQUE 约束
如需撤销 UNIQUE 约束,请使用下面的 SQL:

ALTER TABLE Persons
DROP INDEX uc_PersonID

注:总的来说 “uc_PersonID ” 是一个约束名 !上面建的是唯一约束,为了方便区别约束名一般起得有规律点比如UC(就是UNIQUE CONSTRAINT的缩写意思是唯一约束) uc_PersonID 就是对表中的PersonID 建唯一约束

SQL PRIMARY KEY 约束

PRIMARY KEY (主键)约束唯一标识数据库表中的每条记录。

主键必须包含唯一的值。

主键列不能包含 NULL 值。

CREATE TABLE 时的 SQL PRIMARY KEY 约束
下面的 SQL 在 “Persons” 表创建时在 “P_Id” 列上创建 PRIMARY KEY 约束:

MySQL:

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)
)

ALTER TABLE 时的 SQL PRIMARY KEY 约束
当表已被创建时,如需在 “P_Id” 列创建 PRIMARY KEY 约束,请使用下面的 SQL:

ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)

撤销 PRIMARY KEY 约束
如需撤销 PRIMARY KEY 约束,请使用下面的 SQL:

ALTER TABLE Persons
DROP PRIMARY KEY    //因为一般来说  一个表一个主键 

.

SQL DEFAULT 约束

DEFAULT 约束用于向列中插入默认值。

如果没有规定其他的值,那么会将默认值添加到所有的新记录。

CREATE TABLE 时的 SQL DEFAULT 约束
下面的 SQL 在 “Persons” 表创建时在 “City” 列上创建 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' 
)

ALTER TABLE 时的 SQL DEFAULT 约束
当表已被创建时,如需在 “City” 列创建 DEFAULT 约束,请使用下面的 SQL:

ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'

撤销 DEFAULT 约束
如需撤销 DEFAULT 约束,请使用下面的 SQL:

ALTER TABLE Persons
ALTER City DROP DEFAULT

这个就讲到这里了 下次见!
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐