{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Overview of Views\n",
"Here are the details related to views."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"tags": [
"remove-cell"
]
},
"outputs": [
{
"data": {
"text/html": [
"VIDEO \n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%HTML\n",
"VIDEO "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* View is nothing but a named query. We typically create views for most commonly used queries.\n",
"* Unlike tables, views does not physically store the data and when ever we write a query against view it will fetch the data from underlying tables defined as part of the views.\n",
"* We can perform DML operations over the tables via views with restrictions (for example, we cannot perform DML operations on views with joins, group by etc).\n",
"* Views that can be used to perform DML operations on underlying tables are called as **updatable views**\n",
"* Views can be used to provide restricted permissions on tables for DML Operations. However, it is not used these days."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"%load_ext sql"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"env: DATABASE_URL=postgresql://itversity_retail_user:retail_password@localhost:5432/itversity_retail_db\n"
]
}
],
"source": [
"%env DATABASE_URL=postgresql://itversity_retail_user:retail_password@localhost:5432/itversity_retail_db"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Done.\n"
]
},
{
"data": {
"text/plain": [
"[]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"\n",
"CREATE OR REPLACE VIEW orders_v\n",
"AS\n",
"SELECT * FROM orders"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" * postgresql://itversity_retail_user:***@localhost:5432/itversity_retail_db\n",
"(psycopg2.errors.DuplicateTable) relation \"orders_v\" already exists\n",
"\n",
"[SQL: CREATE VIEW orders_v AS\n",
"SELECT * FROM orders]\n",
"(Background on this error at: http://sqlalche.me/e/13/f405)\n"
]
}
],
"source": [
"%%sql\n",
"\n",
"CREATE VIEW orders_v\n",
"AS\n",
"SELECT * FROM orders"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" * postgresql://itversity_retail_user:***@localhost:5432/itversity_retail_db\n",
"2 rows affected.\n"
]
},
{
"data": {
"text/html": [
"\n",
" \n",
" table_catalog \n",
" table_schema \n",
" table_name \n",
" table_type \n",
" self_referencing_column_name \n",
" reference_generation \n",
" user_defined_type_catalog \n",
" user_defined_type_schema \n",
" user_defined_type_name \n",
" is_insertable_into \n",
" is_typed \n",
" commit_action \n",
" \n",
" \n",
" itversity_retail_db \n",
" public \n",
" orders \n",
" BASE TABLE \n",
" None \n",
" None \n",
" None \n",
" None \n",
" None \n",
" YES \n",
" NO \n",
" None \n",
" \n",
" \n",
" itversity_retail_db \n",
" public \n",
" orders_v \n",
" VIEW \n",
" None \n",
" None \n",
" None \n",
" None \n",
" None \n",
" YES \n",
" NO \n",
" None \n",
" \n",
"
"
],
"text/plain": [
"[('itversity_retail_db', 'public', 'orders', 'BASE TABLE', None, None, None, None, None, 'YES', 'NO', None),\n",
" ('itversity_retail_db', 'public', 'orders_v', 'VIEW', None, None, None, None, None, 'YES', 'NO', None)]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"\n",
"SELECT * FROM information_schema.tables\n",
"WHERE table_name ~ 'orders'"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" * postgresql://itversity_retail_user:***@localhost:5432/itversity_retail_db\n",
"68883 rows affected.\n"
]
},
{
"data": {
"text/plain": [
"[]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"\n",
"UPDATE orders_v\n",
"SET order_status = lower(order_status)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" * postgresql://itversity_retail_user:***@localhost:5432/itversity_retail_db\n",
"10 rows affected.\n"
]
},
{
"data": {
"text/html": [
"\n",
" \n",
" order_id \n",
" order_date \n",
" order_customer_id \n",
" order_status \n",
" \n",
" \n",
" 122 \n",
" 2013-07-26 00:00:00 \n",
" 2071 \n",
" processing \n",
" \n",
" \n",
" 123 \n",
" 2013-07-26 00:00:00 \n",
" 3695 \n",
" pending_payment \n",
" \n",
" \n",
" 124 \n",
" 2013-07-26 00:00:00 \n",
" 2374 \n",
" complete \n",
" \n",
" \n",
" 125 \n",
" 2013-07-26 00:00:00 \n",
" 4611 \n",
" pending_payment \n",
" \n",
" \n",
" 126 \n",
" 2013-07-26 00:00:00 \n",
" 610 \n",
" complete \n",
" \n",
" \n",
" 127 \n",
" 2013-07-26 00:00:00 \n",
" 5261 \n",
" pending_payment \n",
" \n",
" \n",
" 128 \n",
" 2013-07-26 00:00:00 \n",
" 2772 \n",
" pending_payment \n",
" \n",
" \n",
" 129 \n",
" 2013-07-26 00:00:00 \n",
" 9937 \n",
" closed \n",
" \n",
" \n",
" 130 \n",
" 2013-07-26 00:00:00 \n",
" 7509 \n",
" pending_payment \n",
" \n",
" \n",
" 131 \n",
" 2013-07-26 00:00:00 \n",
" 10072 \n",
" processing \n",
" \n",
"
"
],
"text/plain": [
"[(122, datetime.datetime(2013, 7, 26, 0, 0), 2071, 'processing'),\n",
" (123, datetime.datetime(2013, 7, 26, 0, 0), 3695, 'pending_payment'),\n",
" (124, datetime.datetime(2013, 7, 26, 0, 0), 2374, 'complete'),\n",
" (125, datetime.datetime(2013, 7, 26, 0, 0), 4611, 'pending_payment'),\n",
" (126, datetime.datetime(2013, 7, 26, 0, 0), 610, 'complete'),\n",
" (127, datetime.datetime(2013, 7, 26, 0, 0), 5261, 'pending_payment'),\n",
" (128, datetime.datetime(2013, 7, 26, 0, 0), 2772, 'pending_payment'),\n",
" (129, datetime.datetime(2013, 7, 26, 0, 0), 9937, 'closed'),\n",
" (130, datetime.datetime(2013, 7, 26, 0, 0), 7509, 'pending_payment'),\n",
" (131, datetime.datetime(2013, 7, 26, 0, 0), 10072, 'processing')]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"\n",
"SELECT * FROM orders LIMIT 10"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" * postgresql://itversity_retail_user:***@localhost:5432/itversity_retail_db\n",
"68883 rows affected.\n"
]
},
{
"data": {
"text/plain": [
"[]"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"\n",
"UPDATE orders_v\n",
"SET order_status = upper(order_status)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" * postgresql://itversity_retail_user:***@localhost:5432/itversity_retail_db\n",
"Done.\n"
]
},
{
"data": {
"text/plain": [
"[]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"\n",
"CREATE OR REPLACE VIEW order_details_v\n",
"AS\n",
"SELECT * FROM orders o\n",
" JOIN order_items oi\n",
" ON o.order_id = oi.order_item_order_id"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" * postgresql://itversity_retail_user:***@localhost:5432/itversity_retail_db\n",
"10 rows affected.\n"
]
},
{
"data": {
"text/html": [
"\n",
" \n",
" order_id \n",
" order_date \n",
" order_customer_id \n",
" order_status \n",
" order_item_id \n",
" order_item_order_id \n",
" order_item_product_id \n",
" order_item_quantity \n",
" order_item_subtotal \n",
" order_item_product_price \n",
" \n",
" \n",
" 1 \n",
" 2013-07-25 00:00:00 \n",
" 11599 \n",
" CLOSED \n",
" 1 \n",
" 1 \n",
" 957 \n",
" 1 \n",
" 299.98 \n",
" 299.98 \n",
" \n",
" \n",
" 2 \n",
" 2013-07-25 00:00:00 \n",
" 256 \n",
" PENDING_PAYMENT \n",
" 2 \n",
" 2 \n",
" 1073 \n",
" 1 \n",
" 199.99 \n",
" 199.99 \n",
" \n",
" \n",
" 2 \n",
" 2013-07-25 00:00:00 \n",
" 256 \n",
" PENDING_PAYMENT \n",
" 3 \n",
" 2 \n",
" 502 \n",
" 5 \n",
" 250.0 \n",
" 50.0 \n",
" \n",
" \n",
" 2 \n",
" 2013-07-25 00:00:00 \n",
" 256 \n",
" PENDING_PAYMENT \n",
" 4 \n",
" 2 \n",
" 403 \n",
" 1 \n",
" 129.99 \n",
" 129.99 \n",
" \n",
" \n",
" 4 \n",
" 2013-07-25 00:00:00 \n",
" 8827 \n",
" CLOSED \n",
" 5 \n",
" 4 \n",
" 897 \n",
" 2 \n",
" 49.98 \n",
" 24.99 \n",
" \n",
" \n",
" 4 \n",
" 2013-07-25 00:00:00 \n",
" 8827 \n",
" CLOSED \n",
" 6 \n",
" 4 \n",
" 365 \n",
" 5 \n",
" 299.95 \n",
" 59.99 \n",
" \n",
" \n",
" 4 \n",
" 2013-07-25 00:00:00 \n",
" 8827 \n",
" CLOSED \n",
" 7 \n",
" 4 \n",
" 502 \n",
" 3 \n",
" 150.0 \n",
" 50.0 \n",
" \n",
" \n",
" 4 \n",
" 2013-07-25 00:00:00 \n",
" 8827 \n",
" CLOSED \n",
" 8 \n",
" 4 \n",
" 1014 \n",
" 4 \n",
" 199.92 \n",
" 49.98 \n",
" \n",
" \n",
" 5 \n",
" 2013-07-25 00:00:00 \n",
" 11318 \n",
" COMPLETE \n",
" 9 \n",
" 5 \n",
" 957 \n",
" 1 \n",
" 299.98 \n",
" 299.98 \n",
" \n",
" \n",
" 5 \n",
" 2013-07-25 00:00:00 \n",
" 11318 \n",
" COMPLETE \n",
" 10 \n",
" 5 \n",
" 365 \n",
" 5 \n",
" 299.95 \n",
" 59.99 \n",
" \n",
"
"
],
"text/plain": [
"[(1, datetime.datetime(2013, 7, 25, 0, 0), 11599, 'CLOSED', 1, 1, 957, 1, 299.98, 299.98),\n",
" (2, datetime.datetime(2013, 7, 25, 0, 0), 256, 'PENDING_PAYMENT', 2, 2, 1073, 1, 199.99, 199.99),\n",
" (2, datetime.datetime(2013, 7, 25, 0, 0), 256, 'PENDING_PAYMENT', 3, 2, 502, 5, 250.0, 50.0),\n",
" (2, datetime.datetime(2013, 7, 25, 0, 0), 256, 'PENDING_PAYMENT', 4, 2, 403, 1, 129.99, 129.99),\n",
" (4, datetime.datetime(2013, 7, 25, 0, 0), 8827, 'CLOSED', 5, 4, 897, 2, 49.98, 24.99),\n",
" (4, datetime.datetime(2013, 7, 25, 0, 0), 8827, 'CLOSED', 6, 4, 365, 5, 299.95, 59.99),\n",
" (4, datetime.datetime(2013, 7, 25, 0, 0), 8827, 'CLOSED', 7, 4, 502, 3, 150.0, 50.0),\n",
" (4, datetime.datetime(2013, 7, 25, 0, 0), 8827, 'CLOSED', 8, 4, 1014, 4, 199.92, 49.98),\n",
" (5, datetime.datetime(2013, 7, 25, 0, 0), 11318, 'COMPLETE', 9, 5, 957, 1, 299.98, 299.98),\n",
" (5, datetime.datetime(2013, 7, 25, 0, 0), 11318, 'COMPLETE', 10, 5, 365, 5, 299.95, 59.99)]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"\n",
"SELECT * FROM order_details_v LIMIT 10"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" * postgresql://itversity_retail_user:***@localhost:5432/itversity_retail_db\n",
"1 rows affected.\n"
]
},
{
"data": {
"text/html": [
"\n",
" \n",
" count \n",
" \n",
" \n",
" 172198 \n",
" \n",
"
"
],
"text/plain": [
"[(172198,)]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"\n",
"SELECT count(1) FROM order_details_v"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" * postgresql://itversity_retail_user:***@localhost:5432/itversity_retail_db\n",
"10 rows affected.\n"
]
},
{
"data": {
"text/html": [
"\n",
" \n",
" order_date \n",
" order_item_product_id \n",
" revenue \n",
" \n",
" \n",
" 2013-07-25 00:00:00 \n",
" 1004 \n",
" 10799.46 \n",
" \n",
" \n",
" 2013-07-25 00:00:00 \n",
" 957 \n",
" 9599.36 \n",
" \n",
" \n",
" 2013-07-25 00:00:00 \n",
" 191 \n",
" 8499.15 \n",
" \n",
" \n",
" 2013-07-25 00:00:00 \n",
" 365 \n",
" 7558.74 \n",
" \n",
" \n",
" 2013-07-25 00:00:00 \n",
" 1073 \n",
" 6999.65 \n",
" \n",
" \n",
" 2013-07-25 00:00:00 \n",
" 1014 \n",
" 6397.44 \n",
" \n",
" \n",
" 2013-07-25 00:00:00 \n",
" 403 \n",
" 5589.57 \n",
" \n",
" \n",
" 2013-07-25 00:00:00 \n",
" 502 \n",
" 5100.00 \n",
" \n",
" \n",
" 2013-07-25 00:00:00 \n",
" 627 \n",
" 2879.28 \n",
" \n",
" \n",
" 2013-07-25 00:00:00 \n",
" 226 \n",
" 599.99 \n",
" \n",
"
"
],
"text/plain": [
"[(datetime.datetime(2013, 7, 25, 0, 0), 1004, Decimal('10799.46')),\n",
" (datetime.datetime(2013, 7, 25, 0, 0), 957, Decimal('9599.36')),\n",
" (datetime.datetime(2013, 7, 25, 0, 0), 191, Decimal('8499.15')),\n",
" (datetime.datetime(2013, 7, 25, 0, 0), 365, Decimal('7558.74')),\n",
" (datetime.datetime(2013, 7, 25, 0, 0), 1073, Decimal('6999.65')),\n",
" (datetime.datetime(2013, 7, 25, 0, 0), 1014, Decimal('6397.44')),\n",
" (datetime.datetime(2013, 7, 25, 0, 0), 403, Decimal('5589.57')),\n",
" (datetime.datetime(2013, 7, 25, 0, 0), 502, Decimal('5100.00')),\n",
" (datetime.datetime(2013, 7, 25, 0, 0), 627, Decimal('2879.28')),\n",
" (datetime.datetime(2013, 7, 25, 0, 0), 226, Decimal('599.99'))]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"\n",
"SELECT order_date,\n",
" order_item_product_id,\n",
" round(sum(order_item_subtotal)::numeric, 2) AS revenue\n",
"FROM order_details_v \n",
"GROUP BY order_date,\n",
" order_item_product_id\n",
"ORDER BY order_date,\n",
" revenue DESC\n",
"LIMIT 10"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" * postgresql://itversity_retail_user:***@localhost:5432/itversity_retail_db\n",
"3 rows affected.\n"
]
},
{
"data": {
"text/html": [
"\n",
" \n",
" order_id \n",
" order_date \n",
" order_customer_id \n",
" order_status \n",
" order_item_id \n",
" order_item_order_id \n",
" order_item_product_id \n",
" order_item_quantity \n",
" order_item_subtotal \n",
" order_item_product_price \n",
" \n",
" \n",
" 2 \n",
" 2013-07-25 00:00:00 \n",
" 256 \n",
" PENDING_PAYMENT \n",
" 2 \n",
" 2 \n",
" 1073 \n",
" 1 \n",
" 199.99 \n",
" 199.99 \n",
" \n",
" \n",
" 2 \n",
" 2013-07-25 00:00:00 \n",
" 256 \n",
" PENDING_PAYMENT \n",
" 3 \n",
" 2 \n",
" 502 \n",
" 5 \n",
" 250.0 \n",
" 50.0 \n",
" \n",
" \n",
" 2 \n",
" 2013-07-25 00:00:00 \n",
" 256 \n",
" PENDING_PAYMENT \n",
" 4 \n",
" 2 \n",
" 403 \n",
" 1 \n",
" 129.99 \n",
" 129.99 \n",
" \n",
"
"
],
"text/plain": [
"[(2, datetime.datetime(2013, 7, 25, 0, 0), 256, 'PENDING_PAYMENT', 2, 2, 1073, 1, 199.99, 199.99),\n",
" (2, datetime.datetime(2013, 7, 25, 0, 0), 256, 'PENDING_PAYMENT', 3, 2, 502, 5, 250.0, 50.0),\n",
" (2, datetime.datetime(2013, 7, 25, 0, 0), 256, 'PENDING_PAYMENT', 4, 2, 403, 1, 129.99, 129.99)]"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"\n",
"SELECT * FROM order_details_v\n",
"WHERE order_id = 2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"```{note}\n",
"We cannot directly update data in tables via views when the view is defined with joins. Even operations such as `GROUP BY` or `ORDER BY` etc will make views not updatable by default.\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" * postgresql://itversity_retail_user:***@localhost:5432/itversity_retail_db\n",
"(psycopg2.errors.ObjectNotInPrerequisiteState) cannot update view \"order_details_v\"\n",
"DETAIL: Views that do not select from a single table or view are not automatically updatable.\n",
"HINT: To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.\n",
"\n",
"[SQL: UPDATE order_details_v SET order_status = 'pending_payment'\n",
"WHERE order_id = 2]\n",
"(Background on this error at: http://sqlalche.me/e/13/e3q8)\n"
]
}
],
"source": [
"%%sql\n",
"\n",
"UPDATE order_details_v\n",
"SET\n",
" order_status = 'pending_payment'\n",
"WHERE order_id = 2"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "",
"name": ""
},
"language_info": {
"name": ""
}
},
"nbformat": 4,
"nbformat_minor": 4
}