一、基本概念
1.1数据库
我们每天都在使用数据库,以登录微信为例,每个用户的用户名和密码都是保存在腾讯的服务器上的数据库里面的,登录的时候需要验证通过才能登录成功。那么怎么定义数据库,简单的说:
数据库就是保存有组织的数据的容器。
可以把数据库说成是存储数据的文件柜。
1.2表
一个数据库中有很多数据表,数据库就像一个大的文件柜,而表是一个一个的小格子。比如用户购物的数据信息是一个数据库,存储用户信息的是一张表,存储用户订单的是另外一张表。
表是某种特定类型数据的结构化清单。
在同一个数据库中表名是唯一的,在不同的数据库中可以使用相同的数据库表名。比如在购物数据库中有用户表,在学生信息数据库中也可以有用户表,互不影响。
1.3列和数据类型
一张数据表有行有列就像excel表格一样,列就相当于表格第一行的信息一样。每个表都是由一个或多个列组成的。
列是表中的一个字段,所有表都是由一个或多个列组成的。
数据类型是定义列用那种数据类型存储,比如姓名用文本类型,年龄用数字类型。
每个表的列都用相应的数据类型,限制该列中存储的数据。
1.4行
表中的数据是按行存储的,比如一张学生信息表,列由学号、姓名、语文成绩、数学成绩等组成,一行就是一个学生的信息。
行是表中的一个记录。
1.5主键和外键
表中的每一行都可以由一列或几列唯一标识自己。以学生信息表为例,每个学生的学号都是唯一的,不会重复,因此可以用学号作为学生信息表的主键。为什么要有主键?举个例子:如果要修改姓名为张三的学生多数学成绩,那么同时有2个或多个学生点姓名都是张三的时候就不知道应该修改那一个,要是以学号修改的标识就很确定要修改哪一个。
主键:表中的一列(或一组列),其值能够唯一标识表中的每一个记录。
外键:是另一表的主键,能唯一确定另外一个表中的每一个记录。
二、SQL
SQL是结构化查询语言(Structured Query Language)的缩写,是专门用来与数据库沟通的语言。
SQL不是某个特定数据库供应商专有的语言,几乎所有重要的DBMS都支持SQL。SQL简单易学,功能强大。
标准SQL由ANSI管理会管理,成为ANSI SQL。
三、 常用命令
3.1登录MySQL的命令
mysql -u root -p
3.2 查看数据库
SHOW DATABASES;
3.3 使用某个数据库
mysql> USE toyshop
Database changed
3.4 查看数据库下的所有表
SHOW TABLES
3.5查看表结构
mysql> SHOW COLUMNS FROM customers;
+--------------+-----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-----------+------+-----+---------+----------------+
| cust_id | int(11) | NO | PRI | NULL | auto_increment |
| cust_name | char(50) | NO | | NULL | |
| cust_address | char(50) | YES | | NULL | |
| cust_city | char(50) | YES | | NULL | |
| cust_state | char(5) | YES | | NULL | |
| cust_zip | char(10) | YES | | NULL | |
| cust_country | char(50) | YES | | NULL | |
| cust_contact | char(50) | YES | | NULL | |
| cust_email | char(255) | YES | | NULL | |
+--------------+-----------+------+-----+---------+----------------+
9 rows in set (0.00 sec)
或者
DESC customers
3.6 检索单个列
SELECT prod_name
FROM products;
3.7 检索多个列
SELECT prod_id,prod_name
FROM products;
3.8 检索所有列
SELECT *
FROM products;
3.9 检索不同的列(去重)
SELECT DISTINCT vend_id
FROM products;
3.10 限制结果的个数
SELECT prod_name
FROM products
LIMITS 5;
3.11 从指 定行数开始返回指定个数
SELECT prod_name
FROM products
LIMIT 10,5;
从第4行开始返回3行:
SELECT prod_name
FROM products
LILMIT 4,3
从第3行开始返回4行:
SELECT prod_name
FROM products
LIMIT 4 OFFSET 3;
3.12 使用完全限定的表名
SELECT products.prod_name
FROM toyshop.products;
3.13 排序
SELECT prod_name
FROM products
ORDER BY prod_name;
3.14 多列排序
SELECT prod_id,prod_name,prod_price
FROM products
ORDER BY prod_price,prod_name;
3.15 指定排序方向
按价格降序排序
SELECT prod_name,prod_price
FROM products
ORDER BY prod_price DESC;
3.16 ORDER BY和IMIT一起用求最大值和最小值
求最小值:
SELECT *
FROM products
ORDER BY prod_price ASC
LIMIT 1;
求最大值:
SELECT *
FROM products
ORDER BY prod_price DESC
LIMIT 1;
3.17 使用WHERE子句
SELECT prod_name,prod_price
FROM products
WHERE prod_price=2.5
3.18 Mysql在执行默认匹配的时候不区分大小写。
mysql> SELECT prod_name,prod_price
-> FROM products
-> WHERE prod_name='fuses';
+-----------+------------+
| prod_name | prod_price |
+-----------+------------+
| Fuses | 3.42 |
+-----------+------------+
1 row in set (0.00 sec)
3.19 列出价格小于10美元的所有产品。
SELECT prod_name,prod_price
FROM products
WHERE prod_price <10;
3.20 列出价格小于等于10美元的所有产品。
SELECT prod_name,prod_price
FROM products
WHERE prod_price <=10;
3.21 选出vend_id不等于1003的产品
SELECT vend_id,prod_name
FROM products
WHERE vend_id<>1003;
等价于:
SELECT vend_id,prod_name
FROM products
WHERE vend_id != 1003;
3.22 IS NULL和IS NOT NULL
SELECT cust_name,cust_email
FROM customers
WHERE cust_email IS NOT NULL;
BETWEEN
mysql> SELECT prod_id,prod_price
-> FROM products
-> WHERE prod_price BETWEEN 5 AND 10;
+---------+------------+
| prod_id | prod_price |
+---------+------------+
| ANV01 | 5.99 |
| ANV02 | 9.99 |
| FB | 10.00 |
| OL1 | 8.99 |
| TNT2 | 10.00 |
+---------+------------+
5 rows in set (0.00 sec)
3.23 AND的优先级高于OR
SELECT prod_name,prod_price,vend_id
FROM products
WHERE vend_id =1002 OR vend_id =1003 AND vend_price >=10;
使用括号分割:
SELECT prod_name,prod_price,vend_id
FROM products
WHERE (vend_id = 1002 OR vend_id =1003) AND prod_price >=10;
3.24 IN操作符
SELECT prod_name,prod_price
FROM products
WHERE vend_id = 1002 OR vend_id = 1005
ORDER BY prod_name;
IN操作符可以完成与OR相同的功能。
IN操作符的优点:
- IN操作符的语法更加清楚更加直观
- 使用IN操作,计算的次序更加容易管理
- IN操作符一般比OR操作符更快
- IN可以包含其他的SELECT语句
3.25 NOT操作符
WHERE子句的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。
mysql> SELECT prod_id,prod_name,prod_price,vend_id
-> FROM products
-> WHERE vend_id NOT IN (1002,1005);
+---------+----------------+------------+---------+
| prod_id | prod_name | prod_price | vend_id |
+---------+----------------+------------+---------+
| ANV01 | .5 ton anvil | 5.99 | 1001 |
| ANV02 | 1 ton anvil | 9.99 | 1001 |
| ANV03 | 2 ton anvil | 14.99 | 1001 |
| DTNTR | Detonator | 13.00 | 1003 |
| FB | Bird seed | 10.00 | 1003 |
| FC | Carrots | 2.50 | 1003 |
| SAFE | Safe | 50.00 | 1003 |
| SLING | Sling | 4.49 | 1003 |
| TNT1 | TNT (1 stick) | 2.50 | 1003 |
| TNT2 | TNT (5 sticks) | 10.00 | 1003 |
+---------+----------------+------------+---------+
10 rows in set (0.00 sec)
这篇博客介绍了数据库的基本概念,下篇博客动手实践,创建数据库、创建表、插入数据、设置主键和外键。
参考书:《SQL必知必会 4th》