MySQL memo

1. MySQL basic concepts

  • Database: A container that holds organized data
  • Table: A structured file in which users store specific types of data. Table names in the same database are unique
  • Column: A field in the table, each field has a corresponding data type, the data type can limit the kind of data stored in it
  • Line: Also called a record, it represents a piece of information
  • Primary key: primary-key, the column in the table that uniquely distinguishes each row. Primary key value is not allowed to be NULL
  • SQL: structured query language, a computer language for communicating with databases, for reading and writing data from databases
  • DBMS: database management system, all storage, retrieval, management and processing of data are completed by database management system, mysql is a kind of DBMS

Some basic commands of mysql:

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

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

2. Data retrieval

The SELECT keyword is used to retrieve data from a table. SQL statements are not case-sensitive. The habit is to capitalize keywords and lowercase table names and field names. The spaces in the SQL statement will be ignored, and the SQL statement divided into multiple lines is easy to read and understand.
2.1 Basic Search:

## 检索单个列中所有信息
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 Conditional search:

## 使用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 Use wildcards:
Search patterns composed of wildcards can be used for fuzzy queries

## % 通配符表示任意字符出现任意次数
## 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 Calculated field:
The calculated field does not exist in the actual database table, it is created when the select statement is executed, and the data used by the application using the calculated field and other columns is the same

## 拼接字段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 Aggregated data:

## 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 Data grouping:

## 在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 Subqueries:

## 子查询(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 Junction table (very important):

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325628448&siteId=291194637