# Databases : PostgreSQL : Advanced : Schemas
```
A database contains one or more named schemas, which in turn contain tables.
Schemas also contain other kinds of named objects, including data types, functions, and operators.
The same object name can be used in different schemas without conflict.
Unlike databases, schemas are not rigidly separated:
a user can access objects in any of the schemas in the database they are connected to,
if they have privileges to do so.
CREATE SCHEMA <schema>;
DROP SCHEMA <schema> [ CASCADE ]; must be empty if not using CASCADE
CREATE TABLE <schema>.<table> ...;
Schema names beginning with pg_ are reserved for system purposes and cannot be created by users.
Default schema: 'public' (not special, you can even drop it)
CREATE TABLE foo ( ... ); -> CREATE TABLE public.foo ( ... );
When a tables is referred to by an unqualified name (just the table name),
the system determines which table is meant by following a search path,
which is a list of schemas to look in.
The first schema named in the search path is called the current schema.
SHOW search_path; -> "$user", public
SET search_path TO myschema,public; # temporary?
ALTER ROLE ALL SET search_path = ....
In addition to public and user-created schemas, each database contains a pg_catalog schema,
which contains the system tables and all the built-in data types, functions, and operators.
pg_catalog is always effectively part of the search path.
If it is not named explicitly in the path
then it is implicitly searched before searching the path's schemas.
This ensures that built-in names will always be findable.
However, you can explicitly place pg_catalog at the end of your search path
if you prefer to have user-defined names override built-in names.
```