SQL代表结构化查询语言。它是用于处理和管理关系数据库(通常称为“ SQL数据库”)中数据的最常用工具。
SQL通常被称为“续集”。它最受欢迎的变体是MySQL,PostgreSQL和SQLite-SQL的一种版本,通常用于原型制作。它介绍了使用SQL查询通过一个命令访问许多记录的概念。
查询的SELECT部分通常是确定要在结果中显示数据的哪些列。您还可以应用其他选项来显示不是表列的数据。
本示例显示了从“学生”表中选择的三列和一个计算出的列。该数据库存储该学生的studentID,FirstName和LastName。我们可以组合名字和姓氏列来创建FullName计算列。
select studentID, FirstName, LastName, FirstName + ' ' + LastName as FullNamefrom student;
+-----------+-------------------+------------+------------------------+| studentID | FirstName | LastName | FullName |+-----------+-------------------+------------+------------------------+| 1 | Monique | Davis| Monique Davis|| 2 | Teri| Gutierrez| Teri Gutierrez || 3 | Spencer | Pautier| Spencer Pautier|| 4 | Louis | Ramsey | Louis Ramsey || 5 | Alvin | Greene | Alvin Greene || 6 | Sophie| Freeman| Sophie Freeman || 7 | Edgar Frank "Ted" | Codd | Edgar Frank "Ted" Codd || 8 | Donald D. | Chamberlin | Donald D. Chamberlin || 9 | Raymond F.| Boyce| Raymond F. Boyce |+-----------+-------------------+------------+------------------------+9 rows in set (0.00 sec)
CHECK约束用于限制可以放在列中的值范围。
如果在单个列上定义CHECK约束,则该列仅允许某些值。
如果在表上定义CHECK约束,则可以基于行中其他列中的值来限制某些列中的值。
创建“人员”表时,以下SQL在“年龄”列上创建CHECK约束。CHECK约束确保您不能有18岁以下的任何人:
MySQL:
CREATE TABLE Persons ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, CHECK (Age>=18));
SQL Server / Oracle / MS Access:
CREATE TABLE Persons ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int CHECK (Age>=18));
若要命名CHECK约束,并在多个列上定义CHECK约束,请使用以下SQL语法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, City varchar(255), CONSTRAINT CHK_Person CHECK (Age>=18 AND City='Sandnes'));
要在表已创建时在“年龄”列上创建CHECK约束,请使用以下SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD CHECK (Age>=18);
若要命名CHECK约束,并在多个列上定义CHECK约束,请使用以下SQL语法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD CONSTRAINT CHK_PersonAge CHECK (Age>=18 AND City='Sandnes');
要删除CHECK约束,请使用以下SQL:
SQL Server / Oracle / MS Access:
ALTER TABLE PersonsDROP CONSTRAINT CHK_PersonAge;
MySQL:
ALTER TABLE PersonsDROP CHECK CHK_PersonAge;
WHERE
条款(和/或,IN
,BETWEEN
,和LIKE
)该WHERE
子句用于限制返回的行数。
在这种情况下,将使用所有这五个都是有点荒谬的WHERE
条款。
这是当前完整的学生列表,可与WHERE
子句结果集进行比较:
select studentID, FullName, sat_score, rcd_updated from student;
+-----------+------------------------+-----------+---------------------+| studentID | FullName | sat_score | rcd_updated |+-----------+------------------------+-----------+---------------------+| 1 | Monique Davis| 400 | 2017-08-16 15:34:50 || 2 | Teri Gutierrez | 800 | 2017-08-16 15:34:50 || 3 | Spencer Pautier|1000 | 2017-08-16 15:34:50 || 4 | Louis Ramsey |1200 | 2017-08-16 15:34:50 || 5 | Alvin Greene |1200 | 2017-08-16 15:34:50 || 6 | Sophie Freeman |1200 | 2017-08-16 15:34:50 || 7 | Edgar Frank "Ted" Codd |2400 | 2017-08-16 15:35:33 || 8 | Donald D. Chamberlin |2400 | 2017-08-16 15:35:33 || 9 | Raymond F. Boyce |2400 | 2017-08-16 15:35:33 |+-----------+------------------------+-----------+---------------------+9 rows in set (0.00 sec)
将显示以下行:
WHERE
学生证介于1到5(含)之间
OR
学生编号= 8
这是一个更新的查询,其中不会显示此列表中的SAT分数(1000、1400)的任何记录:
selectstudentID, FullName, sat_score, recordUpdatedfromstudentwhere (studentID between 1 and 5 or studentID = 8) and sat_score NOT in (1000, 1400);
+-----------+----------------------+-----------+---------------------+| studentID | FullName | sat_score | rcd_updated |+-----------+----------------------+-----------+---------------------+| 1 | Monique Davis| 400 | 2017-08-16 15:34:50 || 2 | Teri Gutierrez | 800 | 2017-08-16 15:34:50 || 4 | Louis Ramsey |1200 | 2017-08-16 15:34:50 || 5 | Alvin Greene |1200 | 2017-08-16 15:34:50 || 8 | Donald D. Chamberlin |2400 | 2017-08-16 15:35:33 |+-----------+----------------------+-----------+---------------------+5 rows in set (0.00 sec)
*与所有这些SQL事物一样,它们比本入门指南中的内容要多得多。
我希望这至少能给您足够的入门。
请参阅数据库管理员的手册,并尝试自己尝试不同的选项,这很有趣。
要更新表中的记录,请使用以下UPDATE
语句。
小心。您可以更新表中的所有记录或仅更新其中的一些记录。使用WHERE
条件指定要更新的记录。可以一次更新一个或多个列。语法为:
UPDATE table_nameSET column1 = value1, column2 = value2, ...WHERE condition;
这是一个使用ID 4更新记录名称的示例:
UPDATE PersonSET Name = “Elton John”WHERE Id = 4;
您还可以通过使用其他表中的值来更新表中的列。Use JOIN
子句从多个表获取数据。语法为:
UPDATE table_name1SET table_name1.column1 = table_name2.columnA table_name1.column2 = table_name2.columnBFROM table_name1JOIN table_name2 ON table_name1.ForeignKey = table_name2.Key
这是所有记录的更新管理器的示例:
UPDATE PersonSET Person.Manager = Department.ManagerFROM PersonJOIN Department ON Person.DepartmentID = Department.ID
通过更新查询,DBA或使用SQL的程序员可以使用一个命令来更新许多记录。
重要安全提示!更改之前,请始终保留要更改内容的备份副本!
本节将:
向学生表添加新字段
测试用学校分配的电子邮件地址更新该字段的逻辑
更新新字段。
这是我们开始此过程的学生表:
SELECT * FROM student;
+-----------+------------------------+-----------+------------------+---------------------+---------------------+| studentID | FullName | sat_score | programOfStudy | rcd_Created | rcd_Updated |+-----------+------------------------+-----------+------------------+---------------------+---------------------+| 1 | Monique Davis| 400 | Literature | 2017-08-16 15:34:50 | 2017-08-16 15:34:50 || 2 | Teri Gutierrez | 800 | Programming| 2017-08-16 15:34:50 | 2017-08-16 15:34:50 || 3 | Spencer Pautier|1000 | Programming| 2017-08-16 15:34:50 | 2017-08-16 15:34:50 || 4 | Louis Ramsey |1200 | Programming| 2017-08-16 15:34:50 | 2017-08-16 15:34:50 || 5 | Alvin Greene |1200 | Programming| 2017-08-16 15:34:50 | 2017-08-16 15:34:50 || 6 | Sophie Freeman |1200 | Programming| 2017-08-16 15:34:50 | 2017-08-16 15:34:50 || 7 | Edgar Frank "Ted" Codd |2400 | Computer Science | 2017-08-16 15:35:33 | 2017-08-16 15:35:33 || 8 | Donald D. Chamberlin |2400 | Computer Science | 2017-08-16 15:35:33 | 2017-08-16 15:35:33 || 9 | Raymond F. Boyce |2400 | Computer Science | 2017-08-16 15:35:33 | 2017-08-16 15:35:33 |+-----------+------------------------+-----------+------------------+---------------------+---------------------+9 rows in set (0.00 sec)
ALTER TABLE `fcc_sql_guides_database`.`student` ADD COLUMN `schoolEmailAdr` VARCHAR(125) NULL AFTER `programOfStudy`;
执行更改后的学生表。
mysql> SELECT FullName, sat_score, programOfStudy, schoolEmailAdr FROM student;+------------------------+-----------+------------------+----------------+| FullName | sat_score | programOfStudy | schoolEmailAdr |+------------------------+-----------+------------------+----------------+| Monique Davis| 400 | Literature | NULL || Teri Gutierrez | 800 | Programming| NULL || Spencer Pautier|1000 | Programming| NULL || Louis Ramsey |1200 | Programming| NULL || Alvin Greene |1200 | Programming| NULL || Sophie Freeman |1200 | Programming| NULL || Edgar Frank "Ted" Codd |2400 | Computer Science | NULL || Donald D. Chamberlin |2400 | Computer Science | NULL || Raymond F. Boyce |2400 | Computer Science | NULL |+------------------------+-----------+------------------+----------------+9 rows in set (0.00 sec)
SELECT FullName, instr(FullName," ") AS firstSpacePosition, concat(substring(FullName,1,instr(FullName," ")-1),"@someSchool.edu") AS schoolEmailFROM student;
+------------------------+--------------------+------------------------+| FullName | firstSpacePosition | schoolEmail|+------------------------+--------------------+------------------------+| Monique Davis|8 | Monique@someSchool.edu || Teri Gutierrez |5 | Teri@someSchool.edu|| Spencer Pautier|8 | Spencer@someSchool.edu || Louis Ramsey |6 | Louis@someSchool.edu || Alvin Greene |6 | Alvin@someSchool.edu || Sophie Freeman |7 | Sophie@someSchool.edu|| Edgar Frank "Ted" Codd |6 | Edgar@someSchool.edu || Donald D. Chamberlin |7 | Donald@someSchool.edu|| Raymond F. Boyce |8 | Raymond@someSchool.edu |+------------------------+--------------------+------------------------+9 rows in set (0.00 sec)
关于concat()的说明:在MySQL中,此命令用于组合字符串,而在其他SQL版本中则不是这样(请参阅手册)。在这种用法中,它的工作方式如下:FullName字段的子字符串,直到但不包括第一个空格,都与“ @ someSchool.edu”组合在一起。在现实世界中,这将变得更加复杂,并且您需要确保电子邮件地址是唯一的。
我们将假装这就是我们想要的,并使用以下信息更新表:
UPDATE student SET schoolEmailAdr = concat(substring(FullName,1,instr(FullName," ")-1),"@someSchool.edu")WHERE schoolEmailAdr is NULL;
成功!