MySQL备忘录

1. mysql基础概念

  • 数据库:保存有组织数据的容器
  • 表:一种结构化的文件,用户储存特定类型的数据。同一个数据库中表名称具有唯一性
  • 列:表中的一个字段,每一个字段都有相应的数据类型,数据类型可以限制存储在其中的数据种类
  • 行:也叫记录(record),表示一条信息
  • 主键:primary-key,表中用于唯一区分每一行的那一列。主键值不允许为NULL
  • SQL:structured query language,用于与数据库通信的计算机语言,用于从数据库中读写数据
  • DBMS:数据库管理系统,数据的所有存储,检索,管理和处理都是有数据库管理系统完成的,mysql就是一种DBMS

mysql的一些基础命令:

## 显示数据库中所有的表
SHOW TABLES;

## 显示表中所有列的信息
##用于查看列名,数据类型,是否可以为空,默认值以及主键信息等...
SHOW COLUMNS FROM customers;

2. 数据检索

SELECT关键字用于从表中检索数据,sql语句不区分大小写,习惯是将关键字大写,表名称和字段名称小写。sql语句中的空格都会被忽略,分成多行的sql语句便于阅读理解。
2.1 基本检索:

## 检索单个列中所有信息
SELECT prod_name FROM products;

## 检索多个列的信息,列名称之间加逗号
SELECT prod_id, prod_name, prod_price FROM products;

## 检索所有列,也就是表中所有数据
SELECT * FROM products;

## 检索限定行信息,第一个参数表示行号(从0开始),第二个参数是指定检索出多少行
SELECT * FROM products LIMIT 5, 5;

----------------------------------------------------------------

## 对检索出的数据进行排序
## 使用 ORDER BY 子句对检索出的数据按指定列排序,默认是升序
## 此时先按prod_price排序,prod_price相同再按prod_name排序
SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price, prod_name;

## 按指定字段降序排序,DESC 关键字
SELECT prod_id, prod_price, prod_name FROM products
ORDER BY prod_price DESC;

## note: 关于 ORDER BY 和 limit 一起使用时好像会出bug,结果可能与预期不一样
##      网上是说mysql对limit进行优化,导致检索结果有问题,后期注意

2.2 条件检索:

## 使用WHERE子句作为过滤条件检索指定数据(相等性测试)
SELECT prod_name, prod_price FROM products
WHERE prod_price = 2.5;

## 使用条件过滤符检索指定数据
## != , < , <= , > , >= , >= , BETWEEN
## note: between 匹配的值包括开始值和结束值
SELECT prod_name, prod_price FROM products
WHERE prod_price BETWEEN 5 AND 10
ORDER BY prod_price;

## 使用组合WHERE子句进行多条件过滤
## AND操作符指示DBMS只返回匹配所有过滤条件的行
SELECT prod_id, prod_price, prod_name, vend_id FROM products
WHERE vend_id = 1003 AND prod_price <= 10;

## OR操作符与AND相反,它指示DBMS返回匹配任一条件的行
## note: AND在sql中的计算次序优先级高于OR
SELECT prod_name, prod_price FROM products
WHERE vend_id = 1002 OR vend_id = 1003;

## IN操作符用于指定条件范围,范围中每个条件都可以进行匹配
## 此时的IN相当于OR操作符,IN的另一个作用是用于子查询
SELECT prod_name, prod_price FROM products
WHERE vend_id IN (1002, 1003)
ORDER BY prod_name;

## NOT操作符用于否定之后的过滤条件
SELECT prod_name, prod_price FROM products
WHERE vend_id NOT IN (1002, 1003)
ORDER BY prod_name;

2.3 使用通配符:
使用通配符组成的搜索模式(search pattern)可以用于进行模糊查询

## % 通配符表示任意字符出现任意次数
## search pattern 'jet%' : 指示DBMS检索prod_name以jet开头,后面跟任意字符,不管是多少的数据
SELECT prod_id, prod_name FROM products
WHERE prod_name LIKE 'jet%';

## 下划线 _ 通配符只匹配单个字符
SELECT prod_id, prod_name FROM products
WHERE prod_name LIKE '_ ton anvil';

2.4 计算字段:
计算字段不存在于实际的数据库表中,它是在执行select语句时创建的,应用程序使用计算字段和使用其他列的数据是相同的

## 拼接字段Concat()函数
## AS别名指示DBMS创建名为vend_title的计算字段,这样应用程序就可以像使用其他普通字段那样使用计算字段
SELECT CONCAT(RTRIM(vend_name), ' (', RTRIM(vend_country), ')') AS vend_title
FROM vendors
ORDER BY vend_name;

## 使用计算字段对检索出的数据进行算术计算
## 业务逻辑:检索出订单号为20005的订单中所有的商品,包含单价和数量,并用计算字段表示每种商品的总价
SELECT prod_id, quantity, item_price,
       quantity*item_price AS expended_price
FROM orderitems
WHERE order_num = 20005;

2.5 汇总数据:

## AVG() 求平均数,通过计算表中行数和特定列之和,求得该列的平均值
## note: AVG忽略列值为NULL的行,该行不计入总行数
SELECT AVG(prod_price) AS avg_price
FROM products;

## 通过过滤条件计算指定行的平均值
SELECT AVG(prod_price) AS avg_price FROM products
WHERE vend_id = 1003;

## COUNT(*) 对表中的行数目进行统计
## COUNT(column) 对特定列中有值的行进行统计,列值为NULL的行会被忽略,不计入总行数
SELECT COUNT(*) FROM customers;

## MAX() 返回指定列中的最大值
SELECT prod_id, prod_name, MAX(prod_price) AS max_price
FROM products;

## MIN() 返回指定列中的最小值
SELECT MIN(prod_price) AS min_price
FROM products;

## SUM() 返回指定列值的总和,NULL会被忽略
## 业务逻辑:检索出订单号20005的所有商品,计算使用商品单价和数量计算订单总价
SELECT SUM(item_price * quantity) AS total_price
FROM orderitems
WHERE order_num = 20005;

2.6 数据分组:

## 在SELECT语句中使用GROUP BY子句对数据进行分组
## GROUP BY 语句指示mysql按vend_id对表数据排序并分组
SELECT vend_id, COUNT(*) AS num_prods
FROM products
GROUP BY vend_id;

## 使用HAVAING子句过滤分组,WHERE子句用于过滤行
## 业务逻辑:对订单表按cust_id进行分组统计每个客户的订单数,检索出订单数大于等于2的分组
SELECT cust_id, COUNT(*) AS num_order
FROM orders
GROUP BY cust_id
HAVING num_order >= 2;

2.7 子查询:

## 子查询(subquery): 第一个查询所得的结果是第二个查询的条件
## 业务逻辑: 先根据orderitem表中检索出含有商品'TNT2'的订单号,再根据orders检索出下单客户的cust_id
SELECT cust_id FROM orders
WHERE order_num IN (SELECT order_num 
                    FROM orderitems
                    WHERE prod_id = 'TNT2');

2.8 联结表(非常重要):

猜你喜欢

转载自blog.csdn.net/cainiaomanong/article/details/77438930