Sign In
Sign In

SQL Basics Cheat Sheet

SQL Basics Cheat Sheet
Anees Asghar
Technical writer
SQL
04.12.2024
Reading time: 11 min

SQL is a globally operated Query Language that interacts with the databases. It assists us in finding, editing, and handling data effectively. A cheat sheet makes learning easier by giving a quick way to memorize important commands. In this tutorial, we'll go over primary SQL commands, clauses, joins, transactions, and much more to assist you in administering databases instantly and easily. To demonstrate these concepts, we will implement each command in MySQL.

SQL Data Types

A data type determines the kind of values that can be preserved in a column, outlined below with their explanations:

  • INT: It keeps integers.
  • CHAR(n): It saves a static-size string consisting of n characters.
  • VARCHAR(n): It keeps a variable-length string, comprising a max of n characters.
  • TEXT: It enables the storage of extensive text or strings.
  • DATE: It lets us store dates.
  • DATETIME: It saves dates & times.
  • FLOAT: It stores floating-point digits.
  • BOOLEAN: Postgres and MySQL offer BOOLEAN for storing true or false entries. In contrast, SQL Server utilizes BIT for this purpose.

Basic SQL Commands

Commands let us create tables, delete, and insert or edit records. For example:

  • CREATE: Generates new databases and other objects.
  • SHOW: Displays a list of all accessible databases and other objects. Postgres doesn’t offer SHOW; however, the equivalent functionality can be obtained in psql by utilizing meta-commands like \l, \dt, \dn, etc.
  • USE: Switches the database. Postgres uses \c meta-command, instead.
  • INSERT: Appends new entries into a designated table.
  • SELECT: Displays information from the stated table(s).
  • UPDATE: Ugrades existing entries in a table.
  • DELETE: Removes desired or all rows.
  • DROP: Permanently drops a database or other objects.

Example 1: Create Database

Let’s generate a database called hostman_info:

CREATE DATABASE hostman_info;

Now execute SHOW to justify the database creation:

SHOW DATABASES;

Image7

Now utilize hostman_info by employing the USE command:

USE hostman_info;

The screenshot below demonstrates that we have successfully established a connection with the hostman_info:

Image9

Example 2: Create Table

The below-stated query demonstrates the table creation with various data types:

CREATE TABLE hostman_team (
    Hostman_EID INT AUTO_INCREMENT PRIMARY KEY,
    Hostman_FName VARCHAR(30),
    Hostman_LName VARCHAR(30),
    Hostman_DOB DATE,
    Hostman_ESalary FLOAT,
    Hostman_EStatus BOOLEAN
);

It constructs a new hostman_team table with the requested columns, which can be confirmed with this command:

SHOW TABLES;

Image8

Example 3: Insert Rows

Once a table is formed, we can append new entries to the hostman_team table:

INSERT INTO hostman_team (Hostman_FName, Hostman_LName, Hostman_DOB, Hostman_ESalary, Hostman_EStatus)
VALUES ('Anees', 'Asghar', '1995-01-01', 60000, TRUE);

Image11

Similarly, users can insert as many records as necessary with a single INSERT statement. In this scenario, each entry to be appended must be separated by a comma.

INSERT INTO hostman_team (Hostman_FName, Hostman_LName, Hostman_DOB, Hostman_ESalary, Hostman_EStatus) 
VALUES ('Joe', 'Root', '1990-01-15', 65000, TRUE),
   ('Steve', 'Smith', '1980-03-12', 70000, FALSE);

Image10

Example 4: Fetch Records

Next, execute SELECT to display data from hostman_team:

SELECT * FROM hostman_team;

Image13

Similarly, we can extract only the preferred columns by defining their names:

SELECT Hostman_FName, Hostman_LName, Hostman_ESalary 
FROM hostman_team;

Image12

Example 5: Update Table

SQL gives another helpful statement called UPDATE that assists us in editing existing records:

UPDATE hostman_team
SET Hostman_ESalary = 62000
WHERE Hostman_EID = 1;

Image15

To edit entries as per defined criteria, we can utilize UPDATE with the WHERE clause:

UPDATE hostman_team
SET Hostman_ESalary = 75000
WHERE Hostman_ESalary >= 65000;

Image14

Example 6: Delete Data

If a particular entry is no longer relevant, we can remove it:

DELETE FROM hostman_team
WHERE Hostman_EID = 3;

To clear all entries of hostman_team, utilize the subsequent query:

DELETE FROM hostman_team;

SQL SELECT Queries

SQL presents various SELECT queries that let us collect data in different ways, including filtering, arranging, and limiting results according to our requirements:

  • DISTINCT: It fetches distinct values while deleting duplicates.
  • WHERE: Obtain the entries according to predetermined criteria.
  • ORDER BY: It gives a certain order to the resultant table.
  • LIMIT: It applies restrictions to the entries to be fetched.

This would extract distinct firstNames from Hostman_team:

SELECT DISTINCT Hostman_FName 
FROM hostman_team;

Similarly, the subsequent query extracts entries from Hostman_team with EmpID 2 or above and then sorts them in descending sequence to exhibit only the topmost entry:

SELECT * FROM hostman_team 
WHERE Hostman_EID >= 2
ORDER BY Hostman_EID DESC 
LIMIT 1;

Image18

SQL Joins

SQL comes up with distinct kinds of JOIN that let us merge rows from several tables using related columns.

Let’s create a couple of tables titled Hostman_depts and Hostman_staff with the following structure:

CREATE TABLE Hostman_depts (
    HDptID INT AUTO_INCREMENT PRIMARY KEY,
    HDptName VARCHAR(255),
    HDptLocation VARCHAR(255)
);
CREATE TABLE Hostman_staff (
    HStaffID INT AUTO_INCREMENT PRIMARY KEY,
    HFirstName VARCHAR(255),
    HLastName VARCHAR(255),
    HEmail VARCHAR(255),
    HPhoneNumber VARCHAR(20),
    HHireDate DATE,
    HDptID INT,
    FOREIGN KEY (HDptID) REFERENCES Hostman_depts(HDptID)
        ON DELETE CASCADE
        ON UPDATE CASCADE
);

The above query creates the hostman_staff table with a foreign key HDptID linking to the hostman_depts table. After creating the table, we insert some records in these tables, which are populated with the following query:

SELECT * FROM Hostman_depts;
SELECT * FROM Hostman_staff;

Image16

INNER JOIN

It fetches rows that have related records in both target tables:

SELECT 
    HStaffID, HFirstName, HLastName, HEmail, HDptName, HDptLocation
FROM 
    Hostman_staff
INNER JOIN 
    Hostman_depts
ON 
    Hostman_staff.HDptID = Hostman_depts.HDptID;

We combine records where the HDptID in the Hostman_staff table corresponds to the HDptID in the Hostman_depts table:

Image17

LEFT JOIN

It fetches all data from the left table with associated entries from the right table. If unmatched, NULLs fill the right table's columns.

The below query displays all staff members with their respective departments and addresses:

SELECT 
    HStaffID, HFirstName, HLastName, HEmail, HDptName, HDptLocation
FROM 
    Hostman_staff
LEFT JOIN 
    Hostman_depts
ON 
    Hostman_staff.HDptID = Hostman_depts.HDptID;

Every record of Hostman_staff is returned, even if there is no related match in the Hostman_depts table:

Image19

RIGHT JOIN

It exhibits all details from the right table and associated entries from the left table. If unmatched, NULL will be displayed for the left table:

SELECT 
    HStaffID, HFirstName, HLastName, HEmail, HDptName, HDptLocation
FROM 
    Hostman_staff
RIGHT JOIN 
    Hostman_depts
ON 
    Hostman_staff.HDptID = Hostman_depts.HDptID;

It displays all departments and enlisted staff members, with NULL entries when no staff is linked with a department:

Image20

FULL JOIN

It depicts all rows from both tables, with associated records where available. The resultant table possesses NULL values for unavailable records:

SELECT 
    HStaffID, HFirstName, HLastName, HEmail, HDptName, HDptLocation
FROM 
    Hostman_staff
FULL JOIN 
    Hostman_depts
ON 
    Hostman_staff.HDptID = Hostman_depts.HDptID;

It exhibits all staff members with departments, even if no staff members are allocated to each department.

Note: Some SQL versions may not directly support FULL OUTER JOIN. In this scenario, we can integrate LEFT and RIGHT JOIN with UNION to accomplish a similar functionality:

SELECT 
    HStaffID, HFirstName, HLastName, HEmail, HDptName, HDptLocation
FROM
    Hostman_staff
LEFT JOIN
    Hostman_depts
ON
    Hostman_staff.HDptID = Hostman_depts.HDptID
UNION
SELECT
    HStaffID, HFirstName, HLastName, HEmail, HDptName, HDptLocation
FROM
    Hostman_staff
RIGHT JOIN 
    Hostman_depts
ON
    Hostman_staff.HDptID = Hostman_depts.HDptID;

Image21

Aggregate Functions

SQL offers distinct aggregate functions that execute computations on numerous rows and yield a single outcome:

  • COUNT: Computes the total records.
  • SUM: Finds the aggregate of the targeted column.
  • AVG: Calculates column average.
  • MIN: Extracts the column's minimal value.
  • MAX: Locates the column's most elevated value.

Let us invoke the aggregate methods to demonstrate their working in practice:

SELECT 
    COUNT(*) AS TotalStaff,
    MIN(HHireDate) AS EarliestHireDate, 
    MAX(HHireDate) AS LatestHireDate
FROM Hostman_staff;

The outcome demonstrates TotalStaff, EarliestHireDate, and LatestHireDate:

Image22

Grouping and Filtering in SQL

SQL contains several clauses for grouping and filtering the table’s details, as illustrated below.

GROUP BY

It combines rows with identical entries in targeted columns into a single summary row:

SELECT HDptID, COUNT(*) AS TotalStaff
FROM Hostman_staff
GROUP BY HDptID;

The staff members are grouped by HDptID and show the total staff in each department:

Image23

HAVING

It sorts groups as per predefined aggregate criteria. It groups data after the aggregation, unlike WHERE, which filters rows before aggregation:

SELECT HDptID, COUNT(*) AS TotalStaff
FROM Hostman_staff
GROUP BY HDptID
HAVING COUNT(*) >3;

It assembles staff by HDptID, computes staff members in each department, and demonstrates only departments exceeding 3 staff members:

Image24

Aliases and Subqueries

SQL aliases shorten table and column names, while subqueries assist us in returning data by embedding one query within another.

Aliases

They are temporary names allotted to tables or columns to make queries user-friendly:

SELECT 
    HFirstName AS FN, 
    HLastName AS LN, 
    HDptID AS DID
FROM Hostman_staff AS HS;

Image25

Subqueries

SQL subqueries are referred to as the queries embedded inside another query and execute actions as per the outcomes of the outer query:

SELECT HFirstName, HLastName, HDptID
FROM Hostman_staff
WHERE HDptID = (
    SELECT HDptID
    FROM Hostman_staff
    GROUP BY HDptID
    ORDER BY COUNT(*) DESC
    LIMIT 1
);

It fetches staff members who are registered in the department with the highest number of staff:

Image26

Indexes 

Indexes boost the data fetching rate but consume more memory and demand extra supervision. Let’s create an index titled idx_HFirstName on the HFirstName column of Hostman_staff:

CREATE INDEX idx_HFirstName
ON Hostman_staff (HFirstName);

Image1

To abolish an index, employ this query:

DROP INDEX 
ON Hostman_staff;

Image2

Constraints in SQL

They impose limitations on table content to sustain precision and stability:

  • PRIMARY KEY: Uniquely recognizes every row.
  • FOREIGN KEY: Sustains referential integrity among tables.
  • NOT NULL: Restrict NULL entries.
  • UNIQUE: Accept distinct entries.
  • CHECK: It applies a restriction check on the data.

Let’s constructs a Hostman_orders table with the columns Hostman_OID, Hostman_ODate, Hostman_EID, and more:

CREATE TABLE Hostman_orders (
    Hostman_OID INT AUTO_INCREMENT PRIMARY KEY,
    Hostman_ODate DATE NOT NULL,
    Hostman_EID INT NOT NULL,
    Hostman_OrderAmount DECIMAL(10, 2) CHECK (Hostman_OrderAmount > 0),
    Hostman_Status VARCHAR(50) DEFAULT 'Pending',
    HDptID INT,
    FOREIGN KEY (HDptID) REFERENCES Hostman_depts(HDptID),
    FOREIGN KEY (Hostman_EID) REFERENCES Hostman_staff(HStaffID),
    CHECK (Hostman_ODate >= '2020-01-01')
);

The Hostman_OID is set as the primary key, ensuring unique identification for each order. Hostman_ODate must keep a date on or after January 1, 2020. Hostman_EID must reference a valid HStaffID from the Hostman_staff table via a foreign key constraint. The HDptID references a valid HDptID from the Hostman_depts table through a foreign key constraint. Additionally, the Hostman_OrderAmount has a check constraint to ensure it holds a value greater than 0, and the Hostman_Status has a default value of Pending:

Image3

Data Modifying Statements

ALTER TABLE enables modifications to the table’s structure. These changes can involve adding, editing, or deleting columns:

ALTER TABLE Hostman_staff
ADD HStaffEmail VARCHAR(100);

It appends a column titled HStaffEmail in the Hostman_staff table:

Image4

To edit the HStaffEmail column, we employ the MODIFY clause:

ALTER TABLE Hostman_staff
MODIFY COLUMN HStaffEmail TEXT;

Image5

To delete EmpEmail from HostmanEmployee, we employ the DROP clause:

ALTER TABLE Hostman_staff
DROP COLUMN HStaffEmail;

Image6

SQL Transactions

SQL transactions make sures that multiple functions are carried out as one cohesive action to keep data precise and consistent:

  • COMMIT: Finalizes and keeps any modifications made during the recent transaction.
  • ROLLBACK: Cancels any modifications applied throughout the ongoing transaction, reversing all alterations.
  • SAVEPOINT: Designates a precise point within a transaction to which it return if needed.
  • ROLLBACK TO: Undoes modifications to the preferred savepoint if a problem emerges.

Conclusion

In this cheat sheet, we've gone over core SQL concepts for successfully supervising data in databases. Grasping fundamental SQL principles is vital for successfully manipulating and engaging with databases. We've also illustrated advanced concepts like transaction control, joins, aggregate functions, and SQL constraints that may assist you manage data more accurately.

Hostman provides a SQL database hosting for your needs.

SQL
04.12.2024
Reading time: 11 min

Similar

SQL

SQL Constraints

When working with SQL tables, you'll often need to set constraints on the data types stored in a specific table. For instance, if you have a table with employee data, it's logical that some fields should not contain null values. You can apply such a constraint to the SQL values with a simple command. You can also require that entered values be unique or that data be checked against certain conditions. In this article, we'll look at how to do this and cover all possible types of constraints, but first, let's start with some terminology. What Are SQL Constraints? An SQL constraint is a rule that we apply to fields in SQL, determining which values are allowed and which are not. After adding a constraint, the program will check whether it's possible to insert, update, or delete data in the table based on the user-defined constraints. If not, the operation will not be executed, and the program will return an error. Now, let's explore all possible types of constraints in SQL databases, and for clarity, we'll provide examples that could be practically useful for you. Adding SQL Constraints You can create SQL constraints using the following commands: PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK, and NOT NULL. NOT NULL Constraint The NOT NULL constraint ensures that a column must have a value for every record, meaning the value cannot be null. This prevents empty values from being stored in the column. Let's create a table with a column that has this constraint: CREATE TABLE Countries (Country VARCHAR(46) NOT NULL,Capital VARCHAR(46)) Here, we allow the name of the country's capital to be omitted, but the name of the country must always be provided. Let's try to add a record that violates this rule: INSERT INTO Countries VALUES (null, 'Madrid') It will result in this error: Column 'Country' cannot be null However, this record will not trigger an error because we did not prohibit leaving the capital name (Capital) column empty: INSERT INTO Countries VALUES ('Spain', null) The NOT NULL constraint can be useful for columns with contact information when we need to require the user to enter their email address or phone number, for example. Therefore, such mandatory fields often use the NOT NULL constraint to ensure that the user enters a specific value: CREATE TABLE Subscribers (SubscriberName VARCHAR(46) NOT NULL,SubscriberContact VARCHAR(46) NOT NULL,) In this case, we require users to obligatorily enter their name and email address, setting a 64-character limit for each field in the table. Specifying character limits for certain fields can also be useful to prevent the addition of invalid data. This operation is often applied for efficiency so the database size is not unnecessarily inflated. UNIQUE Constraint This constraint’s name fully reflects its essence. The UNIQUE constraint ensures that no two values in the specified column will be the same. Let’s take a look at a table where UNIQUE is used: CREATE TABLE Workers1 (WorkerName VARCHAR(46) NOT NULL,WorkerDate DATE,WorkerContact INTEGER UNIQUE) We created an employee table, where we will add the employee's name (the field cannot be empty, as we have already set the familiar NOT NULL constraint), the hire date (in date format, indicated by the DATE data type), and the phone number. The phone number must be unique, as indicated by the UNIQUE constraint. Let’s insert the following data into our table: INSERT INTO Workers1 VALUES ('John Smith', DATE '2018-05-10', 375123456789) Now, when trying to insert a row with the same phone number: INSERT INTO Workers1 VALUES ('James Smith', DATE '2020-06-11', 375123456789) The program will throw an error: Duplicate entry 375123456789 for key 'uniqueconstraint.WorkerContact' The UNIQUE constraint is ideal for columns that should not contain duplicate values. For example, each of us has a unique social security number. Therefore, if a table contains a column for SSN, it should use the UNIQUE constraint. This is necessary to avoid two people having the same numbers, which could be inserted by mistake or intentionally. CHECK Constraint The CHECK constraint is used to validate values based on a specific condition. Consider the following example: CREATE TABLE Customers1 (CustomerName1 VARCHAR(46),CustomerName2 VARCHAR(46),CustomerEmail VARCHAR(56),CustomerAge INTEGER CHECK (CustomerAge>17)) We have set an age constraint where the age must be greater than 17. Now, let’s see what happens when a customer enters the following data: INSERT INTO Customers1 VALUES ('John', 'Smith, '[email protected]', 17) That’s what we’ll see: Check constraint 'checkconstraint_chk_1' is violated The CHECK constraint can be used to implement custom rules. For example, if a table should only store data for adults, we could use the CHECK constraint for the CustomerAge column (CustomerAge > 17, as shown in the example above). Another example: if the table should only store data for Cyprus citizens, we could use CHECK for a new column CustomerCountry: CHECK (CustomerCountry = 'Cyprus'). PRIMARY KEY Constraint PRIMARY KEY is one of the table key constraints in SQL, specifically the primary key. It is used to create an identifier that corresponds to each row in the table. Additionally, a PRIMARY KEY can only apply to one column in a table (since it serves as the identifier). Therefore, each PRIMARY KEY value must be unique, and null values are not allowed in the column defined by the PRIMARY KEY. To better understand this, let’s look at the following example: CREATE TABLE Workers2 (id INTEGER PRIMARY KEY,WorkerName1 VARCHAR(46),WorkerName2 VARCHAR(46),WorkerAge INTEGER CHECK (WorkerAge>17)) As we can see, the PRIMARY KEY constraint allows us to assign an employee ID, so that each record can be referenced using a unique numeric key. Also, notice the familiar CHECK constraint in the age column. FOREIGN KEY constraint A FOREIGN KEY constraint creates a reference to a PRIMARY KEY from another table. Therefore, a column with a FOREIGN KEY points to the PRIMARY KEY column from another table, linking the current table to it through this constraint. To better understand what this key does, let’s look at an example of a FOREIGN KEY constraint linked to the PRIMARY KEY from the previously created table: CREATE TABLE WorkersTaxes (WorkerTax INTEGER,Worker_id INTEGER,FOREIGN KEY (Worker_id) REFERENCES Workers2(id)) So, we needed to create a table for calculating workers' taxes. To link this table (WorkersTaxes) with the workers' table (Workers2), we used a FOREIGN KEY reference, which identifies workers based on the PRIMARY KEY from the Workers2 table. This way, we achieved data consistency, and now each employee can easily be identified in both tables by the linked keys. Other constraints We should also note that the SQL Standard sometimes includes DEFAULT as a constraint; however, DEFAULT does not restrict the type of data entered, so technically it is not considered a constraint. Nevertheless, it is important to mention here because it enables a crucial function: setting default values when users do not input data. This can be useful, for example, to avoid potential errors when data is not entered. Let’s consider the following example: CREATE TABLE Customers2 (CustomerName1 VARCHAR(46) NOT NULL,CustomerName2 VARCHAR(46) NOT NULL,CustomerAge INTEGER DEFAULT 18,) Now, if the customer does not provide an age, it will be automatically set. And we required the customer to enter their first and last name using the already familiar NOT NULL constraint. We hope you now understand how to use each SQL constraint and the benefits they offer. Good luck with your work!
13 December 2024 · 6 min to read
SQL

How to Select Data in SQL

In the modern world, where information is becoming an increasingly valuable resource, databases (DBs) remain an integral part of any information system, and the ability to retrieve data from them with maximum efficiency becomes a decisive factor in successfully working with these systems. SQL (Structured Query Language) is a specialized programming language for managing records stored in relational databases. Within SQL, there are many operators and methods that allow developers to retrieve the required information from a DB. This article is a practical guide for those who want to learn how to select data from an SQL table. In this guide, we will explore the syntax of the SELECT statement, learn how to filter data using WHERE, and examine how to aggregate data using GROUP BY and HAVING. Basics of the SELECT Statement SQL, being an incredibly flexible language for managing data, offers many tools for working with information stored in databases. One of the most important and widely used tools is the SELECT statement, which allows users to retrieve information from a DB. This statement allows us to select the specific columns from a table and apply various operations to the data. The syntax of the SELECT statement is simple and easy to understand. It begins with the keyword SELECT, followed by a list of columns from which we will retrieve data and the table name from which we will extract the data. Here’s what it looks like in practice: SELECT field1, field2FROM data_table; In this example, field1 and field2 are the specific columns we want to retrieve, and data_table is the name of the table from which we want to fetch the data. You can use the SELECT statement in many different ways. For example, if the task is to select all columns from a particular table, we can use the * symbol, which serves as a wildcard for all columns: SELECT * FROM StaffMembers; This query will return all the data contained in the StaffMembers table. In addition, we can use SELECT to retrieve only unique values from a specific column, excluding duplicate entries, which is especially useful when analyzing data: SELECT DISTINCT DivisionIDFROM StaffMembers; In this example, the query returns a list of unique DivisionID values from the StaffMembers table, removing all duplicate entries. The SELECT statement also allows the use of various aggregation functions, such as COUNT, SUM, AVG, and others. These functions are key for performing aggregate operations that help analyze large volumes of data to obtain totals, averages, or other types of aggregate statistics. For example, we can use the COUNT function to count the number of rows in a table: SELECT COUNT(StaffID)FROM StaffMembers; This query will return the total number of employees. Similarly, we can use other aggregation functions to calculate sums, averages, and other aggregate statistics for the data. Another useful operator is ORDER BY, which orders the results of a query according to specific criteria. This operator allows us to sort data either in ascending (ASC) or descending (DESC) order. If we do not specify the sort order explicitly, ascending order will be used by default. Here's how it looks in practice: SELECT *FROM StaffMembersORDER BY Surname DESC; In this example, the query results will be presented in sorted order, where the data will be sorted by employees' surnames in reverse alphabetical order, from the last name in the alphabet to the first. The SELECT statement plays an important role in SQL as it determines which specific data will be included in the query results. It can be used in conjunction with other operators, so let’s move on to the next key SQL query component—the WHERE clause, which allows us to set specific conditions for data selection. Using WHERE to Filter Data The WHERE clause in SQL provides data filtering based on specified conditions, allowing you to retrieve, update, or delete only the data that meets certain criteria. Without the WHERE clause, we would be forced to extract all data from the table and then manually filter it, for example, in an application, to perform specific tasks. This would be highly inefficient, especially for large databases. The WHERE clause can be used with various operators such as equality (=), inequality (<>), greater than (>), less than (<), greater than or equal to (>=), less than or equal to (<=), as well as more specialized operators like BETWEEN, which allows you to specify a range of values, LIKE, designed for pattern matching, and IN, which allows you to select data from a specific set. Let’s look at some examples of using WHERE to filter data. Using the WHERE clause with the equality operator (=): SELECT *FROM StaffMembers WHERE StaffID = 123456; In this case, the equality operator selects the record where the employee ID matches the number 123456. This is the simple equivalent of the equality operator in mathematics. Using WHERE with the greater than (>) or less than (<) operators: SELECT *FROM StaffMembers WHERE Wage > 60000; Here, the > operator is used, which filters out unnecessary data and returns information about employees whose wage exceeds 60,000. This operator can be useful when searching for records with values above or below a certain threshold. Using WHERE with BETWEEN: SELECT *FROM StaffMembers WHERE Wage BETWEEN 60000 AND 80000; The BETWEEN operator allows you to select records that fall within a specified range of values. In this case, it selects all employees whose salary is between 60,000 and 80,000, inclusive. This is useful when you need to extract a specific range of values. Using WHERE with LIKE and Wildcard Characters: SELECT *FROM StaffMembers WHERE StaffName LIKE '%ja%'; The LIKE operator is used for pattern matching. In SQL databases, two wildcard characters can represent patterns: % replaces zero or more characters, and _ replaces exactly one character. In this specific example, the query returns all records from the StaffMembers table where the staff names contain "ja." This approach is often used when the exact value is not known, or when multiple matches need to be found. These are just a few examples of the possibilities with WHERE in SQL. The variety of combinations and operators makes it a powerful tool when working with data. Next, we will look at the AND, OR, and NOT operators, which are commonly used together with WHERE to create more complex queries for databases. Using the AND, OR, and NOT Operators AND, OR, and NOT are key logical operators in SQL. They are used to combine or invert conditions in SQL operators such as WHERE, HAVING, and others. The AND operator is used to create a query that returns true only when both conditions being compared are true. Let’s consider an example: SELECT * FROM StaffMembers WHERE Wage > 60000 and ExperienceYears > 3; In this case, the AND operator links two selection criteria: a wage greater than 60,000 and more than 3 years of experience. The result of this query will be records from the table that satisfy both conditions simultaneously. The OR operator returns true if at least one of the conditions is true: SELECT * FROM StaffMembers WHERE Division = 'Production' OR Division = 'Advertising'; Here, the OR operator connects two selection conditions. The query will return records from the StaffMembers table where the employee belongs to either the 'Production' or 'Advertising' department. The NOT operator inverts the logical value of a condition, returning true if the condition is false, and false if the condition is true: SELECT * FROM StaffMembers WHERE NOT (Division = 'HR'); In this query, the NOT operator inverts the condition Division = 'HR'. The query will return all rows from the StaffMembers table where the department is not 'HR'. This allows you to create queries that exclude certain categories of data. These operators can be combined in any way to create complex conditions. For example: SELECT * FROM StaffMembers WHERE (Division = 'Production' OR Division = 'Advertising') AND ExperienceYears > 5; Here, the AND and OR operators are combined to create a more complex selection condition. The query will return only those records from the StaffMembers table where the department is either 'Production' or 'Advertising' and the employee has more than five years of experience. Aggregating Data with GROUP BY and HAVING In SQL, GROUP BY and HAVING are often used together to aggregate data and calculate various statistical measures based on grouping data by predefined criteria. Let’s take a closer look at the GROUP BY operator. It is used to group rows in the result set by the values of a specific column or group of columns.  After the grouping, we can use aggregation functions like COUNT, SUM, AVG, and others to calculate statistical data for each individual group. Example: SELECT ClientID, COUNT(PurchaseID)FROM PurchasesGROUP BY ClientID; In this example, we count the total number of purchases (PurchaseID) made by each client (ClientID). The HAVING operator is similar to WHERE, but the key difference is that HAVING is applied after the grouping has been done using GROUP BY. The main purpose of HAVING is to filter groups based on already computed aggregate values. This allows us to display only those groups that meet the criteria we set. For instance, after performing the aggregation, we can filter to only groups meeting a certain threshold. Example: SELECT ClientID, COUNT(PurchaseID)FROM PurchasesGROUP BY ClientIDHAVING COUNT(PurchaseID) > 3; In this example, we only see clients (ClientID) whose total number of orders exceeds three. Note that HAVING is applied in SQL queries exclusively after using GROUP BY. You cannot use HAVING without first grouping the data using GROUP BY. In general, the order of operations in SQL looks like this: FROM: Specify the data source. WHERE: Filter data before grouping. GROUP BY: Group rows into sets based on column values. HAVING: Filter groups after they’ve been created. SELECT: Specify which columns will appear in the query result. ORDER BY: Sort the results in the desired order. This sequence reflects the logic of query processing in SQL. The filtering conditions through WHERE are applied before grouping, which helps reduce the volume of data being processed. Conditions defined in HAVING apply to already formed data groups, allowing for more detailed analysis. The GROUP BY and HAVING operators are essential tools for data aggregation in SQL.  Their use provides extensive data analysis capabilities, allowing statistical data collection and the identification of patterns, trends, and relationships within the data. Using JOIN to Combine Tables Often, developers need to select data from two SQL tables. To accomplish this, the JOIN operator is used, allowing data from two or more sources to be combined based on matching values in specific columns. Tables in a database usually have linking columns that correlate with keys in other tables, thus enabling the linking of data. This allows for automatic synchronization of changes across related tables, which is an invaluable advantage when working with large databases where information is split across multiple tables. The structure of a query using JOIN looks like this: SELECT dataField(s)FROM tableAJOIN tableBON tableA.dataField = tableB.dataField; In this case, JOIN is used to combine two tables (tableA and tableB). The join is performed based on a common column (dataField). Additionally, the query includes the selection of specific columns (dataField(s)) that the developer wants to display in the final result. It is important to note that in SQL, there are different types of table joins, including: INNER JOIN: This allows us to retrieve only those rows that have matching records in both tables, meaning where the join condition is met: SELECT Purchases.PurchaseID, Clients.ClientNameFROM PurchasesINNER JOIN ClientsON Purchases.ClientID = Clients.ClientID; LEFT (OUTER) JOIN: This is used when we need to retrieve all rows from the left table (the one specified first in the query), and the matching rows from the right table. If there are no matching rows in the right table, the results for those rows will contain NULL values: SELECT Clients.ClientName, Purchases.PurchaseIDFROM ClientsLEFT JOIN PurchasesON Clients.ClientID = Purchases.ClientID; RIGHT (OUTER) JOIN: This works similarly to the LEFT JOIN, but in reverse. Here, we get all the records from the right table, supplemented with matching data from the left table. If no matches are found for records from the right table, NULL will be placed in the columns for the left table: SELECT Clients.ClientName, Purchases.PurchaseIDFROM ClientsRIGHT JOIN PurchasesON Clients.ClientID = Purchases.ClientID; FULL (OUTER) JOIN: This type of join gives us all rows from both tables that have corresponding records. In other words, it combines the LEFT and RIGHT JOINs. If there are rows in the first table with no matching rows in the second table, the columns from the second table will contain NULL for those rows. Similarly, if records from the second table do not have matches in the first table, the columns from the first table will contain NULL for those rows: SELECT Clients.ClientName, Purchases.PurchaseIDFROM ClientsFULL OUTER JOIN PurchasesON Clients.ClientID = Purchases.ClientID; It is worth noting that although the FULL (OUTER) JOIN is a standard SQL feature, not all SQL systems support it. For example, MySQL does not have built-in support for FULL (OUTER) JOIN, but you can emulate it using a combination of LEFT JOIN and UNION: SELECT Clients.ClientName, Purchases.PurchaseID FROM Clients LEFT JOIN Purchases ON Clients.ClientID = Purchases.ClientID UNION SELECT Clients.ClientName, Purchases.PurchaseID FROM Purchases LEFT JOIN Clients ON Clients.ClientID = Purchases.ClientID WHERE Clients.ClientID IS NULL; This query first performs a left outer join, attaching records from the Purchases table to the Clients table. Then, it joins records from Clients to Purchases that were not selected in the first query (i.e., those where ClientID is NULL). Finally, it combines the results of these two queries. In this section, we discussed different types of JOIN in SQL. Each of these joins provides flexibility in managing which data from related tables we want to see in the result set. Conclusion In this guide, we explored the use of SQL operators such as SELECT, WHERE, ORDER BY, JOIN, GROUP BY, and HAVING through practical examples. These operators offer users extensive capabilities for processing information, enabling complex analytical queries and extracting maximum value from stored data. We hope that you now have a clear understanding of how to use SQL to extract data from a database!
13 December 2024 · 12 min to read
SQL

How to Insert Data into SQL Databases

The data insertion operation in relational databases is one of the most essential tasks. In this article, we will explain how to perform this operation using relational database management systems (DBMS) that work with the SQL language. We will use MySQL, the most popular SQL-based DBMS. As an example, we will consider two tables: one for leading European football clubs (including their national affiliation, year of establishment, number of national championships won, domestic cups, and European trophies), and another for some leading countries worldwide (with their capitals and population in millions). Initially, the tables (let's call them Clubs and Countries) will be empty, containing only column names. Our task is to populate them using various SQL commands so that they appear as follows: Club Country Year Champs Cups Eurocups Real Madrid Spain 1902 35 19 21 Barcelona Spain 1899 26 31 18 Milan Italy 1899 19 5 14 Juventus Italy 1897 36 14 8 Bavaria Germany 1900 32 20 10 The Countries table: Country Capital Population Russia Moscow 147 USA Washington 336 China Beijing 1427 India Delhi 1435 Brazil Brasilia 218 So, first, we need to create a database and two tables.  Connect to the MySQL server (replace xxx.xxx.xxx.xxx with the appropriate IP address): mysql -u root -h xxx.xxx.xxx.xxx -p Then enter the following command: CREATE DATABASE TestDB; To verify that the new database has been successfully created, use the command: SHOW DATABASES; Our database, TestDB, should appear in the list. Next, we need to grant users access to this database. For example, if we already have a user test_user, we can grant them access using the command: GRANT ALL PRIVILEGES ON TestDB.* TO 'test_user'@'%' WITH GRANT OPTION; Now, we can proceed to create the tables. Let’s start with the table for clubs: CREATE TABLE Clubs ( Club VARCHAR(64) NOT NULL, Country VARCHAR(32), Year INT, Champs INT, Cups INT, Eurocups INT ); This means that for the first two columns, we specified string values, with the length of the data in each cell not exceeding 64 and 32 characters, respectively. Additionally, cells in the Club column cannot be empty when adding data (NOT NULL). For the remaining four columns, we designated integer values (INT). Now, following the same pattern, we create the second table: CREATE TABLE Countries ( Country VARCHAR(32) NOT NULL, Capital VARCHAR(32), Population INT ); That’s it! Our tables are created and ready to be populated. The INSERT INTO Statement The INSERT INTO statement allows you to insert data into an SQL table. However, the data is inserted in the column order, so you must know the exact sequence of columns in the table. Let’s insert data into the first rows of our tables: INSERT INTO Clubs VALUES("Real Madrid", "Spain", 1902, 35, 19, 21); INSERT INTO Countries VALUES("Russia", "Moscow", 147); Note that we must specify values for all columns. For instance, the following entries would result in errors or misaligned values (e.g., we omitted the club’s founding year and the country’s capital): INSERT INTO Clubs VALUES("Real Madrid", "Spain", 35, 19, 21); INSERT INTO Countries VALUES("Russia", 147); The INSERT INTO Statement with Column List This method is more reliable as it prevents errors when skipping columns. However, you must specify the column names explicitly: INSERT INTO Clubs(Club, Country, Champs, Cups, Eurocups) VALUES("Barcelona", "Spain", 26, 31, 18); INSERT INTO Countries(Country, Capital) VALUES("USA", "Washington"); In these examples, we skipped the club's founding year (the Year column) in the first case and the population (the Population column) in the second. No errors occur because these fields simply remain empty and can be filled later. The INSERT INTO Statement for Bulk Insertion Adding data row by row is not always convenient. Therefore, let’s look at how to insert data into multiple rows simultaneously. We can do it with the following command: INSERT INTO Clubs(Club, Country, Eurocups) VALUES ("Real Madrid", "Spain", 21), ("Barcelona", "Spain", 18), ("Milan", "Italy", 14), ("Juventus", "Italy", 8), ("Bavaria", "Germany", 10); INSERT INTO Countries(Country, Population) VALUES ("Russia", 147), ("USA", 336), ("China", 1427), ("India", 1435), ("Brazil", 218); In the first table, we populated the columns with the names of the clubs, their national affiliation, and the number of European trophies won, leaving the remaining columns empty. In the second table, we omitted the countries' capitals.  As we can see, there are some syntax differences, and the commands are split across multiple lines. The SET Statement In combination with INSERT INTO, the SET statement allows you to insert a single record into a table: INSERT INTO Clubs SET Club="Milan", Country="Italy", Year=1899, Champs=19, Cups=5, Eurocups=14; INSERT INTO Countries SET Country="China", Capital="Beijing", Population=1427; However, this is also its drawback, as it does not allow us to insert multiple records into an SQL table at once. For that purpose, the previous method is more suitable. How to Insert Data from Another SQL Table Suppose we have other tables with the same columns, and we want to add their data to our tables. This can be done using the SELECT statement in combination with the familiar INSERT: INSERT INTO Clubs(Club, Country, Year, Champs, Cups, Eurocups) SELECT Club, Country, Year, Champs, Cups, Eurocups FROM Clubs2; INSERT INTO Countries(Country, Capital, Population) SELECT Country, Capital, Population FROM Countries2; The IGNORE Clause for Avoiding Errors We can use the IGNORE clause to prevent MySQL from halting when trying to insert invalid values. For example, if we set a uniqueness constraint on the Club column to ensure that each club name is unique, the clause helps avoid interruptions. In MySQL, the first value in a table is always treated as unique, so manually adding such a constraint may not be necessary. For instance, if we already have a row like this: Real Madrid Spain 1902 35 19 21 This command will result in an error: INSERT INTO Clubs VALUES("Real Madrid", "Spain", 1902, 35, 19, 21); We already have a row with the value Real Madrid in the first column. However, duplicates are likely to occur when copying data from multiple tables. To ensure the program ignores these duplicates without generating errors, we use the IGNORE clause: INSERT IGNORE Clubs(Club, Country, Year, Champs, Cups, Eurocups) VALUES("Real Madrid", "Spain", 1902, 35, 19, 21); The same is true for the second example. We already have the line:  Russia Moscow 147 Running this query: INSERT INTO Countries VALUES("Russia", "Moscow", 147); — will result in an error. That’s why we should use IGNORE: INSERT IGNORE Countries(Country, Capital, Population) VALUES("Russia", "Moscow", 147); The program will simply ignore the duplicate row and continue execution without throwing an error. The LOAD DATA Statement for Importing from a Text File Suppose we have an empty Clubs table with the appropriate columns, and we need to populate it with information from a text file. The LOAD DATA statement allows us to do this. However, you first need to prepare the text file with the data. Open your file (let's say Clubs.txt) in a text editor and format the data as follows, separating values with a tab character: 'Real Madrid' 'Spain' '1902' '35' '19' '21' 'Barcelona' 'Spain' '1899' '26' '31' '18' 'Milan' 'Italy' '1899' '19' '5' '14' 'Juventus' 'Italy' '1897' '36' '14' '8' 'Bavaria' 'Germany' '1900' '32' '20' '10' This SQL query will insert data in the table, placing them in the right columns. But what if we don’t have values for specific columns? Suppose we don’t know when the clubs were established. The record will look like this: 'Real Madrid' 'Spain' '\N' '35' '19' '21' 'Barcelona' 'Spain' '\N' '26' '31' '18' 'Milan' 'Italy' '\N' '19' '5' '14' 'Juventus' 'Italy' '\N' '36' '14' '8' 'Bavaria' 'Germany' '\N' '32' '20' '10' \N means that the cell in the table will remain empty. Now, we just need to load the data into SQL, but first, let's enable working with local files like this: set global local_infile=true; exit mysql --local_infile=1 -u test_user -h xxx.xxx.xxx.xxx -p The Linux command to load data is: LOAD DATA LOCAL INFILE '/your_directory/Clubs.txt' INTO TABLE Clubs; And in Windows, it is done like this: LOAD DATA LOCAL INFILE '/your_directory/Clubs.txt'' INTO TABLE Clubs LINES TERMINATED BY '\r\n'; However, sometimes the system might not respond to these instructions. In that case, you will need to enable working with local files in MySQL, which is explained in detail in the official documentation. To summarize, the value of unsigned int in the MYSQL_OPT_LOCAL_INFILE option, related to the mysql_options() settings, must be non-zero. That’s all for now! Now you know how to insert data into SQL databases using various statements. Just choose the most appropriate statement for the specific case, and you’ll avoid issues when copying data.
12 December 2024 · 8 min to read

Do you have questions,
comments, or concerns?

Our professionals are available to assist you at any moment,
whether you need help or are just unsure of where to start.
Email us
Hostman's Support