一、数据库基础知识:
1. 数据库(database):保存有组织的数据的容器(通常是一个或者一组文件)
2. 数据库管理系统(DBMS):数据库软件,外界通过DBMS来创建和操纵数据库,具体是什么,因数据库不同而不一样。
3. 关系型数据库:一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
4. 表(table):
可以把数据库想象成一个文件柜,则,表就是文件柜里面的一个个文件夹,数据就是具体的文件,被放在一个个文件夹里面,而不是直接全都裸露的放置在文件柜的抽屉里。
表的关键在于:
(1)存储在表中的数据,都是同一件事的数据,eg:顾客和商品,就是两件事物,所以每个顾客的信息和每件商品的信息,就应该放在两个不同的表里面。
(2)每张表的名字都是唯一的,是表名唯一,实际上是根据“数据库名+表名”的组合,所以,在不同的数据库之间,可以使用相同的表名,但是同一个数据库内部,不能使用相同表名。
(3)模式(schema):关于表的特性的信息
5. 行(row):表中的数据按行存储,水平的就是“行”,“行”也被称为“记录(record)”
6. 列(column):表由列组成,列是表中的一个字段。
数据库中的每个列,都有相应的数据类型(datatype),数据类型定义了,该列可以存储哪些类型的数据
7. 主键(primary key):表中的一列或者几列,其值能够唯一的标识表中的每一行,能唯一标识表中每一行的列,被称为主键。
-
-
-
-
-
- 应该永远定义主键
- 表中的任何列都可以当主键,但需要满足条件:
-
-
-
-
(1)表中任意两行,都不能具有相同的主键值
(2)每一个行都必须有一个主键值(主键列,不允许Null值)
(3)主键列中的值不允许修改和更新
(4)主键值不能重用(如果表中的某一行被删除了,则它的主键值不能再赋给以后插入的新行)
-
-
-
-
-
- 多列主键:主键通常定义在一列上面,但是并不是必须这么做,也可以一起使用多个列作为主键。使用多个列作为主键时,上述条件必须应用到所有列,所有主键列值的组合必须是唯一的(但是其中单个主键列的值,可以不唯一)
-
-
-
-
8. 外键:
9. 视图: 视图封装了一个查询,使用视图可以重用SQL语句,可以简化SQL操作,还可以保护数据
9.1 创建视图: Create view 视图名 as (整个查询操作语句)
注意:如果想覆盖或者更新视图,必须先删除视图,然后再次重建。
9.2 删除视图:Drop view 视图名
例:
原操作:Select cust_name, cust_contact From Customers, Orders, OrderItems Where Customers.cust_id = Orders.cust_id and OrderItems.order_num = Orders.order_num;
变成视图操作:Create View ProductCustomers As Select cust_name, cust_contact From Customers, Orders, OrderItems Where Customers.cust_id = Orders.cust_id and OrderItems.order_num = Orders.order_num;
后来再查询,只需要查询视图即可:Select * from ProductCustomers
创建 email 表,并插入如下三行数据
+----+---------+ | Id | Email | +----+---------+ | 1 | [email protected] | | 2 | [email protected] | | 3 | [email protected] | +----+---------+
编写一个 SQL 查询,查找 email 表中所有重复的电子邮箱。
根据以上输入你的查询应返回以下结果:
+---------+ | Email | +---------+ | [email protected] | +---------+
说明:所有电子邮箱都是小写字母。
建表语句:
-- 创建表
CREATE TABLE email ( ID INT NOT NULL PRIMARY KEY, Email VARCHAR(255) NOT NULL );
-- 插入数据
INSERT INTO email VALUES('1','[email protected]'); INSERT INTO email VALUES('2','[email protected]'); INSERT INTO email VALUES('3','[email protected]');
解:
select Distinct Email from email where Email.email in (select email from Email group by email having count(*) > 1);
创建如下 World 表
+------------+----------+---------+--------------+---------------+ | name | continent| area | population | gdp | +------------+----------+---------+--------------+---------------+ | Afghanistan| Asia | 652230 | 25500100 | 20343000 | | Albania | Europe | 28748 | 2831741 | 12960000 | | Algeria | Africa | 2381741 | 37100000 | 188681000 | | Andorra | Europe | 468 | 78115 | 3712000 | | Angola | Africa | 1246700 | 20609294 | 100990000 | +------------+----------+---------+--------------+---------------+
如果一个国家的面积超过 300 万平方公里,或者(人口超过 2500 万并且 gdp 超过 2000 万),那么这个国家就是大国家。
编写一个 SQL 查询,输出表中所有大国家的名称、人口和面积。
例如,根据上表,我们应该输出:
+--------------+-------------+--------------+ | name | population | area | +--------------+-------------+--------------+ | Afghanistan | 25500100 | 652230 | | Algeria | 37100000 | 2381741 | +--------------+-------------+--------------+
解: select name, population, gdp from world where world.area > 3000000 or (population > 25000000 and gdp > 2000000);