aboutsummaryrefslogtreecommitdiff
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "22482673",
   "metadata": {},
   "outputs": [],
   "source": [
    "import agh_db_lectures\n",
    "agh_db_lectures.prepare_notebook_for_sql()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "83f4fffc",
   "metadata": {},
   "source": [
    "# The \"NULL\" value"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8ec0bb1a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Open the diagram in an image viewer for more convenience.\n",
    "agh_db_lectures.nw_diagram.download_open()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d4c3ba6c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Connect to the (locally-hosted) database.\n",
    "%sql postgresql://demo_user:demo_pwd@localhost:25432/agh_it_northwind"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b594cc93",
   "metadata": {},
   "outputs": [],
   "source": [
    "agh_db_lectures.download_restore_nw_postgres_dump()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fc14542d",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%sql\n",
    "SELECT company_name, phone, fax\n",
    "FROM customers"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4e1266e1",
   "metadata": {},
   "source": [
    "_notes_\n",
    "\n",
    "- Theodore, what would an employee do if an customer to record in the db had no phone number?\n",
    "  - Give many ideas.\n",
    "  - What would be their pros and cons be?\n",
    "- `SELECT company_name, phone, fax`\n",
    "- Jupyter (well, Python) happens to have `NULL` values converted to `None`s and presented to us this way.\n",
    "- Do not work:\n",
    "  - `WHERE fax = NULL`, and\n",
    "  - `WHERE fax <> NULL`.\n",
    "- Do work\n",
    "  - `WHERE fax IS NULL`, and\n",
    "  - `WHERE fax IS NOT NULL`.\n",
    "  - Also, `WHERE fax <> '011-4988261' OR fax = '011-4988261'` won't return all table rows."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ad4700a9",
   "metadata": {},
   "source": [
    "## \"NULL\" in arithmetic and comparison operations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c08e4ed5",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%sql\n",
    "SELECT NULL <> 'unknown fax number'"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b2619658",
   "metadata": {},
   "source": [
    "_notes_\n",
    "\n",
    "- Try\n",
    "  - `SELECT NULL`,\n",
    "  - `SELECT NULL > 5`,\n",
    "  - `SELECT NULL <> 'unknown fax number'`,\n",
    "  - `SELECT NULL = NULL`, and\n",
    "  - `SELECT NULL IN (TRUE, FALSE, NULL)`,\n",
    "    - but note that a test for presence of `NULL` (or any other value) in an empty tuple (e.g., `SELECT NULL IN (SELECT 'whatever' LIMIT 0)`) would still give `FALSE`."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0613f611",
   "metadata": {},
   "source": [
    "## \"NULL\" with logical operators"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3cf39c08",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%sql\n",
    "SELECT NOT NULL"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "66b696f3",
   "metadata": {},
   "source": [
    "_notes_\n",
    "\n",
    "- `TRUE OR NULL`\n",
    "- `FALSE AND NULL`\n",
    "- `NOT`"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "502f27dc",
   "metadata": {},
   "source": [
    "## The \"COALESCE\" function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5af26eab",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%sql\n",
    "SELECT company_name,\n",
    "       CASE\n",
    "           WHEN fax IS NULL THEN\n",
    "               'unknown'\n",
    "           ELSE\n",
    "               fax\n",
    "       END\n",
    "FROM customers"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ff370664",
   "metadata": {},
   "source": [
    "_notes_\n",
    "\n",
    "- Replace the `CASE` expression with `COALESCE(fax, 'unknown') AS fax`."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "/gnu/store/q35bxk1i5blx0rcgxphhrq9xqmgha9bz-python-3.11.11/bin/python3",
   "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.11.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}