{
"cells": [
{
"cell_type": "markdown",
"id": "af2e89d6",
"metadata": {},
"source": [
"# Sets\n",
"\n",
"## Basics\n",
"SQL supports four types of operations `UNION`, `UNION ALL`, `INTERSECT`, and `EXCEPT`. The difference between `UNION` and `UNION ALL` is that the latter includes duplicates. \n",
"Given set A = {L, M, N, O, P} and set B = {P, Q, R, S, T}, the four operations will return\n",
"1. A UNION B = {L, M, N, O, P, Q, R, S, T}\n",
"2. A UNION ALL = {L, M, N, O, P, P, Q, R, S, T} -- Note the two Ps\n",
"3. A INTERSECT B = {P}\n",
"4. A EXCEPT B = {L, M N, O}\n",
"\n",
"When doing set operations, you should use the same column names so you can order the results. \n",
"\n",
"## The `UNION ALL` and `UNION` Operator\n",
"\n",
"```SQL\n",
"SELECT \n",
" 'Teacher' typ,\n",
" t.first_name\n",
"FROM Teachers t\n",
"WHERE t.first_name LIKE 'Jo%'\n",
"UNION ALL\n",
"SELECT \n",
" 'Student' typ,\n",
" s.first_name\n",
"FROM Students s\n",
"WHERE s.first_name LIKE 'Jo%'\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "84114a8b",
"metadata": {
"tags": [
"hide-input",
"output_scroll"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" typ | \n",
" first_name | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Teacher | \n",
" John | \n",
"
\n",
" \n",
" 1 | \n",
" Teacher | \n",
" Joseph | \n",
"
\n",
" \n",
" 2 | \n",
" Teacher | \n",
" Jorge | \n",
"
\n",
" \n",
" 3 | \n",
" Teacher | \n",
" Jonathan | \n",
"
\n",
" \n",
" 4 | \n",
" Teacher | \n",
" Jonathan | \n",
"
\n",
" \n",
" 5 | \n",
" Teacher | \n",
" Joseph | \n",
"
\n",
" \n",
" 6 | \n",
" Teacher | \n",
" Joshua | \n",
"
\n",
" \n",
" 7 | \n",
" Teacher | \n",
" Joshua | \n",
"
\n",
" \n",
" 8 | \n",
" Teacher | \n",
" Jorge | \n",
"
\n",
" \n",
" 9 | \n",
" Teacher | \n",
" Joseph | \n",
"
\n",
" \n",
" 10 | \n",
" Teacher | \n",
" John | \n",
"
\n",
" \n",
" 11 | \n",
" Teacher | \n",
" Joseph | \n",
"
\n",
" \n",
" 12 | \n",
" Teacher | \n",
" Joseph | \n",
"
\n",
" \n",
" 13 | \n",
" Teacher | \n",
" John | \n",
"
\n",
" \n",
" 14 | \n",
" Teacher | \n",
" Jonathan | \n",
"
\n",
" \n",
" 15 | \n",
" Teacher | \n",
" John | \n",
"
\n",
" \n",
" 16 | \n",
" Teacher | \n",
" John | \n",
"
\n",
" \n",
" 17 | \n",
" Teacher | \n",
" John | \n",
"
\n",
" \n",
" 18 | \n",
" Teacher | \n",
" Joshua | \n",
"
\n",
" \n",
" 19 | \n",
" Teacher | \n",
" Jordan | \n",
"
\n",
" \n",
" 20 | \n",
" Teacher | \n",
" Joshua | \n",
"
\n",
" \n",
" 21 | \n",
" Teacher | \n",
" John | \n",
"
\n",
" \n",
" 22 | \n",
" Teacher | \n",
" Johnny | \n",
"
\n",
" \n",
" 23 | \n",
" Teacher | \n",
" Jonathan | \n",
"
\n",
" \n",
" 24 | \n",
" Teacher | \n",
" Joseph | \n",
"
\n",
" \n",
" 25 | \n",
" Teacher | \n",
" Jonathan | \n",
"
\n",
" \n",
" 26 | \n",
" Teacher | \n",
" Joshua | \n",
"
\n",
" \n",
" 27 | \n",
" Teacher | \n",
" Jordan | \n",
"
\n",
" \n",
" 28 | \n",
" Teacher | \n",
" Jordan | \n",
"
\n",
" \n",
" 29 | \n",
" Teacher | \n",
" Jordan | \n",
"
\n",
" \n",
" 30 | \n",
" Teacher | \n",
" John | \n",
"
\n",
" \n",
" 31 | \n",
" Teacher | \n",
" John | \n",
"
\n",
" \n",
" 32 | \n",
" Student | \n",
" John | \n",
"
\n",
" \n",
" 33 | \n",
" Student | \n",
" Jon | \n",
"
\n",
" \n",
" 34 | \n",
" Student | \n",
" John | \n",
"
\n",
" \n",
" 35 | \n",
" Student | \n",
" Joshua | \n",
"
\n",
" \n",
" 36 | \n",
" Student | \n",
" Jose | \n",
"
\n",
" \n",
" 37 | \n",
" Student | \n",
" Joshua | \n",
"
\n",
" \n",
" 38 | \n",
" Student | \n",
" Joseph | \n",
"
\n",
" \n",
" 39 | \n",
" Student | \n",
" Joan | \n",
"
\n",
" \n",
" 40 | \n",
" Student | \n",
" Joan | \n",
"
\n",
" \n",
" 41 | \n",
" Student | \n",
" John | \n",
"
\n",
" \n",
" 42 | \n",
" Student | \n",
" Johnny | \n",
"
\n",
" \n",
" 43 | \n",
" Student | \n",
" Joel | \n",
"
\n",
" \n",
" 44 | \n",
" Student | \n",
" John | \n",
"
\n",
" \n",
" 45 | \n",
" Student | \n",
" John | \n",
"
\n",
" \n",
" 46 | \n",
" Student | \n",
" Joseph | \n",
"
\n",
" \n",
" 47 | \n",
" Student | \n",
" Johnny | \n",
"
\n",
" \n",
" 48 | \n",
" Student | \n",
" Joseph | \n",
"
\n",
" \n",
" 49 | \n",
" Student | \n",
" Jonathan | \n",
"
\n",
" \n",
" 50 | \n",
" Student | \n",
" John | \n",
"
\n",
" \n",
" 51 | \n",
" Student | \n",
" Joseph | \n",
"
\n",
" \n",
" 52 | \n",
" Student | \n",
" Joseph | \n",
"
\n",
" \n",
" 53 | \n",
" Student | \n",
" John | \n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import sqlite3\n",
"import pandas as pd\n",
"\n",
"conn = sqlite3.connect('students_teachers.db')\n",
"\n",
"sql_statement = \"\"\"\n",
"SELECT \n",
" 'Teacher' typ,\n",
" t.first_name\n",
"FROM Teachers t\n",
"WHERE t.first_name LIKE 'Jo%'\n",
"UNION ALL\n",
"SELECT \n",
" 'Student' typ,\n",
" s.first_name\n",
"FROM Students s\n",
"WHERE s.first_name LIKE 'Jo%'\n",
"\"\"\"\n",
"df = pd.read_sql_query(sql_statement, conn)\n",
"df.style.set_table_attributes('style=\"font-size: 12px\"')"
]
},
{
"cell_type": "markdown",
"id": "cdcec7c6",
"metadata": {},
"source": [
"```SQL\n",
"SELECT \n",
" t.first_name\n",
"FROM Teachers t\n",
"WHERE t.first_name LIKE 'Jo%'\n",
"UNION ALL\n",
"SELECT \n",
" s.first_name\n",
"FROM Students s\n",
"WHERE s.first_name LIKE 'Jo%'\n",
"ORDER BY first_name\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "1e41acc9",
"metadata": {
"tags": [
"hide-input",
"output_scroll"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
" \n",
" \n",
" | \n",
" first_name | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Joan | \n",
"
\n",
" \n",
" 1 | \n",
" Joan | \n",
"
\n",
" \n",
" 2 | \n",
" Joel | \n",
"
\n",
" \n",
" 3 | \n",
" John | \n",
"
\n",
" \n",
" 4 | \n",
" John | \n",
"
\n",
" \n",
" 5 | \n",
" John | \n",
"
\n",
" \n",
" 6 | \n",
" John | \n",
"
\n",
" \n",
" 7 | \n",
" John | \n",
"
\n",
" \n",
" 8 | \n",
" John | \n",
"
\n",
" \n",
" 9 | \n",
" John | \n",
"
\n",
" \n",
" 10 | \n",
" John | \n",
"
\n",
" \n",
" 11 | \n",
" John | \n",
"
\n",
" \n",
" 12 | \n",
" John | \n",
"
\n",
" \n",
" 13 | \n",
" John | \n",
"
\n",
" \n",
" 14 | \n",
" John | \n",
"
\n",
" \n",
" 15 | \n",
" John | \n",
"
\n",
" \n",
" 16 | \n",
" John | \n",
"
\n",
" \n",
" 17 | \n",
" John | \n",
"
\n",
" \n",
" 18 | \n",
" John | \n",
"
\n",
" \n",
" 19 | \n",
" Johnny | \n",
"
\n",
" \n",
" 20 | \n",
" Johnny | \n",
"
\n",
" \n",
" 21 | \n",
" Johnny | \n",
"
\n",
" \n",
" 22 | \n",
" Jon | \n",
"
\n",
" \n",
" 23 | \n",
" Jonathan | \n",
"
\n",
" \n",
" 24 | \n",
" Jonathan | \n",
"
\n",
" \n",
" 25 | \n",
" Jonathan | \n",
"
\n",
" \n",
" 26 | \n",
" Jonathan | \n",
"
\n",
" \n",
" 27 | \n",
" Jonathan | \n",
"
\n",
" \n",
" 28 | \n",
" Jonathan | \n",
"
\n",
" \n",
" 29 | \n",
" Jordan | \n",
"
\n",
" \n",
" 30 | \n",
" Jordan | \n",
"
\n",
" \n",
" 31 | \n",
" Jordan | \n",
"
\n",
" \n",
" 32 | \n",
" Jordan | \n",
"
\n",
" \n",
" 33 | \n",
" Jorge | \n",
"
\n",
" \n",
" 34 | \n",
" Jorge | \n",
"
\n",
" \n",
" 35 | \n",
" Jose | \n",
"
\n",
" \n",
" 36 | \n",
" Joseph | \n",
"
\n",
" \n",
" 37 | \n",
" Joseph | \n",
"
\n",
" \n",
" 38 | \n",
" Joseph | \n",
"
\n",
" \n",
" 39 | \n",
" Joseph | \n",
"
\n",
" \n",
" 40 | \n",
" Joseph | \n",
"
\n",
" \n",
" 41 | \n",
" Joseph | \n",
"
\n",
" \n",
" 42 | \n",
" Joseph | \n",
"
\n",
" \n",
" 43 | \n",
" Joseph | \n",
"
\n",
" \n",
" 44 | \n",
" Joseph | \n",
"
\n",
" \n",
" 45 | \n",
" Joseph | \n",
"
\n",
" \n",
" 46 | \n",
" Joseph | \n",
"
\n",
" \n",
" 47 | \n",
" Joshua | \n",
"
\n",
" \n",
" 48 | \n",
" Joshua | \n",
"
\n",
" \n",
" 49 | \n",
" Joshua | \n",
"
\n",
" \n",
" 50 | \n",
" Joshua | \n",
"
\n",
" \n",
" 51 | \n",
" Joshua | \n",
"
\n",
" \n",
" 52 | \n",
" Joshua | \n",
"
\n",
" \n",
" 53 | \n",
" Joshua | \n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import sqlite3\n",
"import pandas as pd\n",
"\n",
"conn = sqlite3.connect('students_teachers.db')\n",
"\n",
"sql_statement = \"\"\"\n",
"SELECT \n",
" t.first_name\n",
"FROM Teachers t\n",
"WHERE t.first_name LIKE 'Jo%'\n",
"UNION ALL\n",
"SELECT \n",
" s.first_name\n",
"FROM Students s\n",
"WHERE s.first_name LIKE 'Jo%'\n",
"ORDER BY first_name\n",
"\"\"\"\n",
"df = pd.read_sql_query(sql_statement, conn)\n",
"df.style.set_table_attributes('style=\"font-size: 12px\"')"
]
},
{
"cell_type": "markdown",
"id": "afb56a7c",
"metadata": {},
"source": [
"```SQL\n",
"SELECT \n",
" t.first_name\n",
"FROM Teachers t\n",
"WHERE t.first_name LIKE 'Jo%'\n",
"UNION \n",
"SELECT \n",
" s.first_name\n",
"FROM Students s\n",
"WHERE s.first_name LIKE 'Jo%'\n",
"ORDER BY first_name\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "78768333",
"metadata": {
"tags": [
"hide-input",
"output_scroll"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
" \n",
" \n",
" | \n",
" first_name | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Joan | \n",
"
\n",
" \n",
" 1 | \n",
" Joel | \n",
"
\n",
" \n",
" 2 | \n",
" John | \n",
"
\n",
" \n",
" 3 | \n",
" Johnny | \n",
"
\n",
" \n",
" 4 | \n",
" Jon | \n",
"
\n",
" \n",
" 5 | \n",
" Jonathan | \n",
"
\n",
" \n",
" 6 | \n",
" Jordan | \n",
"
\n",
" \n",
" 7 | \n",
" Jorge | \n",
"
\n",
" \n",
" 8 | \n",
" Jose | \n",
"
\n",
" \n",
" 9 | \n",
" Joseph | \n",
"
\n",
" \n",
" 10 | \n",
" Joshua | \n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import sqlite3\n",
"import pandas as pd\n",
"\n",
"conn = sqlite3.connect('students_teachers.db')\n",
"\n",
"sql_statement = \"\"\"\n",
"SELECT \n",
" t.first_name\n",
"FROM Teachers t\n",
"WHERE t.first_name LIKE 'Jo%'\n",
"UNION\n",
"SELECT \n",
" s.first_name\n",
"FROM Students s\n",
"WHERE s.first_name LIKE 'Jo%'\n",
"ORDER BY first_name\n",
"\"\"\"\n",
"df = pd.read_sql_query(sql_statement, conn)\n",
"df.style.set_table_attributes('style=\"font-size: 12px\"')"
]
},
{
"cell_type": "markdown",
"id": "929f2d3d",
"metadata": {},
"source": [
"## The `INTERSECT` Operator\n",
"\n",
"```SQL\n",
"SELECT \n",
" t.first_name\n",
"FROM Teachers t\n",
"WHERE t.first_name LIKE 'Jo%'\n",
"INTERSECT \n",
"SELECT \n",
" s.first_name\n",
"FROM Students s\n",
"WHERE s.first_name LIKE 'Jo%'\n",
"ORDER BY first_name\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "602e1c16",
"metadata": {
"tags": [
"hide-input",
"output_scroll"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
" \n",
" \n",
" | \n",
" first_name | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" John | \n",
"
\n",
" \n",
" 1 | \n",
" Johnny | \n",
"
\n",
" \n",
" 2 | \n",
" Jonathan | \n",
"
\n",
" \n",
" 3 | \n",
" Joseph | \n",
"
\n",
" \n",
" 4 | \n",
" Joshua | \n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import sqlite3\n",
"import pandas as pd\n",
"\n",
"conn = sqlite3.connect('students_teachers.db')\n",
"\n",
"sql_statement = \"\"\"\n",
"SELECT \n",
" t.first_name\n",
"FROM Teachers t\n",
"WHERE t.first_name LIKE 'Jo%'\n",
"INTERSECT \n",
"SELECT \n",
" s.first_name\n",
"FROM Students s\n",
"WHERE s.first_name LIKE 'Jo%'\n",
"ORDER BY first_name\n",
"\"\"\"\n",
"df = pd.read_sql_query(sql_statement, conn)\n",
"df.style.set_table_attributes('style=\"font-size: 12px\"')"
]
},
{
"cell_type": "markdown",
"id": "5c644b26",
"metadata": {},
"source": [
"## The `EXCEPT` Operator\n",
"\n",
"```SQL\n",
"SELECT \n",
" t.first_name\n",
"FROM Teachers t\n",
"WHERE t.first_name LIKE 'Jo%'\n",
"EXCEPT \n",
"SELECT \n",
" s.first_name\n",
"FROM Students s\n",
"WHERE s.first_name LIKE 'Jo%'\n",
"ORDER BY first_name\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "0452858a",
"metadata": {
"tags": [
"hide-input",
"output_scroll"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
" \n",
" \n",
" | \n",
" first_name | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Jordan | \n",
"
\n",
" \n",
" 1 | \n",
" Jorge | \n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import sqlite3\n",
"import pandas as pd\n",
"\n",
"conn = sqlite3.connect('students_teachers.db')\n",
"\n",
"sql_statement = \"\"\"\n",
"SELECT \n",
" t.first_name\n",
"FROM Teachers t\n",
"WHERE t.first_name LIKE 'Jo%'\n",
"EXCEPT\n",
"SELECT \n",
" s.first_name\n",
"FROM Students s\n",
"WHERE s.first_name LIKE 'Jo%'\n",
"ORDER BY first_name\n",
"\"\"\"\n",
"df = pd.read_sql_query(sql_statement, conn)\n",
"df.style.set_table_attributes('style=\"font-size: 12px\"')"
]
}
],
"metadata": {
"jupytext": {
"formats": "md:myst",
"text_representation": {
"extension": ".md",
"format_name": "myst"
}
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.7"
},
"source_map": [
11,
41,
63,
79,
100,
117,
138,
156,
177,
196
]
},
"nbformat": 4,
"nbformat_minor": 5
}