Най-добрите уроци за SQL база данни

SQL означава език за структурирани заявки. Това е най-често срещаният инструмент, използван за манипулиране и управление на данни в релационна база данни (често наричана „SQL база данни“).

SQL обикновено се произнася „продължение“. Най-популярните му варианти са MySQL, PostgreSQL и SQLite - версия на SQL, която обикновено се използва за прототипиране. Той въведе концепцията за достъп до много записи с една единствена команда, използвайки SQL заявки.

Препоръчваме да започнете с 4-часовия урок за база данни на freeCodeCamp.

Също така препоръчваме курса на Харвард CS50 по бази данни и SQL.

И ако се чувствате добре, ето цял 9-часов урок за проектиране на релационни бази данни, за да можете да изградите своя собствена RDBMS система, използвайки SQL.

Някои често срещани SQL изрази и заявки

Изявлението за избор на SQL

Изберете и от клаузи

Частта SELECT на заявката обикновено е да определи кои колони от данните да се показват в резултатите. Има и опции, които можете да приложите за показване на данни, които не са колона на таблица.

Този пример показва три колони, избрани от таблицата „студент“ и една изчислена колона. Базата данни съхранява studentID, FirstName и LastName на студента. Можем да комбинираме колоните First и Last Name, за да създадем изчислената колона FullName.

select studentID, FirstName, LastName, FirstName + ' ' + LastName as FullName from 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 ПРОВЕРКА на CREATE TABLE

Следващият 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") );

SQL ПРОВЕРКА НА ALTER TABLE

За да създадете ограничение CHECK в колоната „Възраст“, ​​когато таблицата вече е създадена, използвайте следния SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons ADD CHECK (Age>=18);

За да позволите именуване на ограничение CHECK и за дефиниране на ограничение CHECK за множество колони, използвайте следния SQL синтаксис:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons ADD CONSTRAINT CHK_PersonAge CHECK (Age>=18 AND City="Sandnes");

ИЗПАДЕТЕ ПРОВЕРКА Ограничение

За да премахнете ограничението CHECK, използвайте следния SQL:

SQL Server / Oracle / MS Access:

ALTER TABLE Persons DROP CONSTRAINT CHK_PersonAge;

MySQL:

ALTER TABLE Persons DROP CHECK CHK_PersonAge; 

Клауза SQL Where

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 studentID = 8

Ето актуализирана заявка, при която няма да бъде представен запис, който има SAT резултат, който е в този списък (1000, 1400):

select studentID, FullName, sat_score, recordUpdated from student where (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 неща и за тях има МНОГО ПОВЕЧЕ от това в това уводно ръководство.

Надявам се това поне да ви даде достатъчно, за да започнете.

Моля, вижте ръководството за вашия мениджър на база данни и се забавлявайте, опитвайки различни опции сами.

Изявление за актуализация на SQL

За да актуализирате запис в таблица, използвате UPDATEизраза.

Be careful. You can update all records of the table or just a few. Use the WHERE condition to specify which records you want to update. It is possible to update one or more columns at a time. The syntax is:

UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;

Here is an example updating the Name of the record with Id 4:

UPDATE Person SET Name = “Elton John” WHERE Id = 4;

You can also update columns in a table by using values from other tables. Use JOIN clause to get data from multiple tables. The syntax is:

UPDATE table_name1 SET table_name1.column1 = table_name2.columnA table_name1.column2 = table_name2.columnB FROM table_name1 JOIN table_name2 ON table_name1.ForeignKey = table_name2.Key

Here is an example updating Manager of all records:

UPDATE Person SET Person.Manager = Department.Manager FROM Person JOIN Department ON Person.DepartmentID = Department.ID

What an Update query can do

An update query gives the DBA or SQL-using programmer the ability to update many records with one command.

Important Safety Tip! Always have a backup copy of what you are about to change BEFORE you change it!

This section will:

  • add a new field to the student table
  • test the logic to update that field with a school assigned email address
  • update the new field.

Here is the student table as we start this process:

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 the table and add a new field

 ALTER TABLE `fcc_sql_guides_database`.`student` ADD COLUMN `schoolEmailAdr` VARCHAR(125) NULL AFTER `programOfStudy`;

The student table after the alter is executed.

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)

TESTING the logic (VERY important step!)

SELECT FullName, instr(FullName," ") AS firstSpacePosition, concat(substring(FullName,1,instr(FullName," ")-1),"@someSchool.edu") AS schoolEmail FROM student;
+------------------------+--------------------+------------------------+ | FullName | firstSpacePosition | schoolEmail | +------------------------+--------------------+------------------------+ | Monique Davis | 8 | [email protected] | | Teri Gutierrez | 5 | [email protected] | | Spencer Pautier | 8 | [email protected] | | Louis Ramsey | 6 | [email protected] | | Alvin Greene | 6 | [email protected] | | Sophie Freeman | 7 | [email protected] | | Edgar Frank "Ted" Codd | 6 | [email protected] | | Donald D. Chamberlin | 7 | [email protected] | | Raymond F. Boyce | 8 | [email protected] | +------------------------+--------------------+------------------------+ 9 rows in set (0.00 sec)

A note about concat(): in MySQL this command is used to combined strings, not so in other SQL versions (check your manual). In this usage it works like this: The substring of the FullName field up to but not including the first space is combined with “@someSchool.edu”. In the real world this would HAVE TO be much more complex and you would need to ensure that the email address is unique.

Doing the update

We’ll pretend that this is what we want and update the table with this information:

UPDATE student SET schoolEmailAdr = concat(substring(FullName,1,instr(FullName," ")-1),"@someSchool.edu") WHERE schoolEmailAdr is NULL;

Success!

mysql> SELECT FullName, sat_score, programOfStudy, schoolEmailAdr FROM student; +------------------------+-----------+------------------+------------------------+ | FullName | sat_score | programOfStudy | schoolEmailAdr | +------------------------+-----------+------------------+------------------------+ | Monique Davis | 400 | Literature | [email protected] | | Teri Gutierrez | 800 | Programming | [email protected] | | Spencer Pautier | 1000 | Programming | [email protected] | | Louis Ramsey | 1200 | Programming | [email protected] | | Alvin Greene | 1200 | Programming | [email protected] | | Sophie Freeman | 1200 | Programming | [email protected] | | Edgar Frank "Ted" Codd | 2400 | Computer Science | [email protected] | | Donald D. Chamberlin | 2400 | Computer Science | [email protected] | | Raymond F. Boyce | 2400 | Computer Science | [email protected] | +------------------------+-----------+------------------+------------------------+ 9 rows in set (0.00 sec)