这是我学习的
MySQL必知必会的笔记
在使用之前,需要先导入一个sql文件.
文件如下:
https://www.jianguoyun.com/p/DbapeNsQh_PWCBijurED
检索数据
① 准备工作
创建一个vendors表
CREATE TABLE vendors(
vend_id INT PRIMARY KEY AUTO_INCREMENT,
vend_name CHAR(50),
vend_address CHAR(50),
vend_city CHAR(50),
vend_state CHAR(50),
vend_zip CHAR(50),
vend_country CHAR(50)
)
在创建一个有外键约束的一个表.
② 外键
CREATE TABLE products(
prod_id int PRIMARY KEY,
prod_name CHAR(50),
prod_price CHAR(50),
prod_desc CHAR(100),
vend_id int,
FOREIGN KEY(vend_id) REFERENCES vendors(vend_id)
);
然后第二种方式.
就是你表已经建立好了,后面再加一个外键约束.
但是这样有个前提:
从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据
例子如下:
ALTER TABLE products ADD CONSTRAINT vend_id
FOREIGN KEY(vend_id) REFERENCES vendors(vend_id);
③ 检索单个列
SELECT prod_name
FROM products;
意思就是:找products表里面,所以的prod_name
结果如下:
④ 检索多个列
SELECT prod_id,prod_name,prod_price
FROM products;
⑤ 检索所有列
SELECT *
FROM products;
* 是一个通配符,就是全部的意思,关于通配符,先暂时不讲
⑥ 去掉重复的值
SELECT DISTINCT vend_id
FROM products;
DISTINCT 就是去除相同的结果
⑦ 限制结果
SELECT prod_name
FROM products
LIMIT 5;
LIMIT 限制了数量为5 条
⑧ 使用完全限定的表名
SELECT products.prod_name
FROM products
这是选择products表里面的prod_name
从products表里面
SELECT products.prod_name
FROM class.products
完全限定就还要在表前面,加上一个数据库.
排序检索数据
① 排序数据
SELECT prod_name
FROM products
ORDER BY prod_name;
这里主要还是用到了一个
ORDER BY的子句
就是设置排序的
ORDER BY 默认的是按照字典序的顺序.就是升序
就是 A-Z的
② 升序和降序
然后我们也可以自己设置升序和降序.
例如:
SELECT prod_name
FROM products
ORDER BY prod_name DESC;
DESC 就是降序的关键字
ASC 就是升序的关键字,但是因为ORDER BY默认的就是升序,所以用的不多.
③ 多列排序
例如:
SELECT prod_id,prod_price,prod_name
FROM products
ORDER BY prod_name,prod_price;
过滤数据
① 使用WHERE 子句
SELECT prod_price,prod_name
FROM products
WHERE prod_price = 2.50
② WHERE子句操作符
例子一
SELECT prod_price,prod_name
FROM products
WHERE prod_name='fuses';
寻找产品名交fuses的价格和名字
例子二
SELECT prod_price,prod_name
FROM products
WHERE prod_price<10;
寻早产品价格小于10的.
③ 不匹配检查
例子一
SELECT vend_id,prod_name
FROM products
WHERE vend_id<>1003;
列出不是由供应商1003制造的产品:
④ 范围值检查
SELECT prod_price,prod_name
FROM products
WHERE prod_price BETWEEN 5 AND 10;
截图如下:
⑤ 空值检查
SELECT 语句有一个特殊的WHERE语句,可用来检查具有NULL值的列
就是 IS NULL
举个例子
SELECT prod_name
FROM products
WHERE prod_price IS NULL;
返回没有价格的所有产品
因为表中没有这样的行,所有没有返回数据.
数据过滤
① AND
就是和的意思
一个例子:
SELECT prod_name,prod_price,prod_name
FROM products
WHERE vend_id=1003 AND prod_price<=10;
在products表里面找vend_id是1003而且价格小于10的列
② OR
就是或的意思,
注意AND 的优先级比OR高—搞不清,就使用()来.
SELECT prod_name,prod_price,prod_name
FROM products
WHERE vend_id=1003 or vend_id=1002;
找vend_id是1002或者1003的
结果如下:
③ IN
IN和OR的功能其实是一样的,
但是IN有以下的优点
一: IN的操作比OR的更加的清楚
二: IN里面还可以插入SELECT语句
三: IN 比一般的OR语句速度要块
SELECT prod_name,prod_price,prod_name
FROM products
WHERE vend_id IN(1002,1003);
意思和OR的那个一样.
结果如下;
④ NOT
也就是非的意思
SELECT prod_name,prod_price,prod_name
FROM products
WHERE vend_id NOT IN(1002,1003);
就是找vend_id不是1002和1003的对象
结果如下;
用通配符进行过滤
① Like操作符
② 通配符 ‘%’ 和 ‘_’
%表示任何字符,出现任意次数
_ 表示任何字符出现单个次数
举两个例子:
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';
结果如下:
用正则表达式进行搜索
① 基本字符匹配
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000'
ORDER BY prod_name;
REGEXP 后面跟的就是正则表达式
这条语句的作用就是 再producst表中,找prod_name 为1000 的
顺序按照prod_name
结果如下:
② 使用OR匹配
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;
结果如下:
| 就相当于或的意思.
③ 匹配几个字符之一
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[123] ton'
ORDER BY prod_name;
[] 表示的是一组字符
然后里面的123连起来意思就是 1|2|3
'[123] ton'
等同于
'[1|2|3] ton'
^ 字符
'[^123] ton'
就是匹配除了1|2|3 的字符串
④ 匹配范围
比如,我们想匹配0-9
可以使用
[0123456789]
可以使用更加方便的
[0-9]
[a-z]
⑤ 匹配特殊字符
那如果我们需要匹配特殊字符呢
比如 ‘.’ 就是匹配任意单个字符的
‘[]’ 匹配字符串
‘|’ 或
我们需要用到 //
举个例子
SELECT vend_name
FROM vendors
WHERE vend_name REGEXP '\\.'
ORDER BY vend_name;
就是查找 ‘.’
结果如下:
表 空白元字符(PS \ 和\ 之间没有空格)
元字符 | 说明 |
---|---|
\ \ f | 换页 |
\ \ n | 换行 |
\ \ r | 回车 |
\ \ t | 制表 |
\ \ v | 纵向制表 |
⑥ 匹配字符类
⑦ 匹配多个实例
下面是例子:
SELECT prod_name
FROM products
WHERE prod_name REGEXP '\\([0-9] sticks?\\)'
ORDER BY prod_name;
结果如下:
解释一下
\\( 就是 ( 的表示
\\) 就是 )的表示
然后结果就是这样的乐.
⑧ 定位符
举个例子:
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;
就是再开始的地方进行匹配 ^的作用.
创建计算字段
字段:基本上与列的意思相同.经常互换使用,不过数据库列一般成为列,而术语字段通常用于计算字段的连接上.
① 拼接字段
在vendors表中,连接供应商名和位置信息
我们可以使用MySQL中的一个连接函数
ConCat函数
具体用法如下图所示:
SELECT Concat(vend_name,' (',vend_country,')')
FROM vendors
ORDER BY vend_name;
然后结果如下;
还有一个函数
可以删除数据右侧多余的空格
RTrim()函数
上面的语句还可以优化为.
SELECT Concat(RTrim(vend_name),' (',vend_country,')')
FROM vendors
ORDER BY vend_name;
还有别的函数
Trim函数:
LTrim就是去掉左边的空格
然后Trim就是去掉串两边的空格.
L就是左 ,R就是右,非常好理解和记忆
② 使用别名
别名(alias)是一个字段或值的替换名.别名用AS关键字赋予,请看下面的SELECT 语句.
SELECT Concat(RTrim(vend_name),' (',RTrim(vend_country),')') AS vend_title
FROM vendors
ORDER BY vend_name;
③ 执行算术运算
SELECT prod_id,quantity,item_price
FROM orderitems
WHERE order_num =20005;
如果我们要计算总物品的价格呢.
SELECT prod_id,quantity,item_price,
quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num =20005;
使用函数
① 文本处理函数
常用的文本处理函数
函数 | 说明 |
---|---|
Left() | 返回串左边的字符 |
Length() | 返回串的长度 |
Locate() | 找出串的一个字串 |
Lower() | 将串转换为小写 |
LTrim() | 去掉串左边的空格 |
Right() | 返回串右边的字符 |
RTrim() | 去掉串右边的空格 |
Soundex() | 返回串的Soundex值 |
SubString() | 返回字串的字符 |
Upper() | 将串转换为大写 |
下面是几个栗子:
SELECT vend_name,Upper(vend_name) AS vend_name_upcase
FROM vendors
ORDER BY vend_name;
结果如下:
然后就是上面的函数中有一个比较特殊的函数
Soundex函数
这个函数是根据串的音节来找相识的音节
下面是一个例子:
SELECT cust_name,cust_contact
FROM customers
WHERE Soundex(cust_contact)=Soundex('Y Lie');
结果如下:
② 日期和时间处理函数
常见的日期和时间处理函数表
函数 | 说明 |
---|---|
AddDate() | 增加一个日期(天,周等) |
AddTime() | 增加一个时间(时,分等) |
CurDate() | 返回当前日期 |
CurTime() | 返回当前时间 |
Date() | 返回日期时间的日期部分 |
DateDiff() | 计算两个日期之差 |
Date_Add() | 高度灵活的日期运算函数 |
Date_Format() | 返回一个格式化日期运算函数 |
Day() | 返回一个日期的天数部分 |
DayOfWeek() | 对于一个日期,返回对应的星期几 |
Hour() | 返回一个日期,返回对应的星期几 |
Minute() | 返回一个时间的分钟部分 |
Month() | 返回一个日期的月份部分 |
Now() | 返回当前日期和时间 |
Second() | 返回一个时间的秒部分 |
Time() | 返回一个日期时间的时间部分 |
Year() | 返回一个日期的年份部分 |
PS datatime 里面的时间是有时间值的.
就是 2020-8-11 00:00:00
是由时间值的,但是如果我们查询的时间一般不需要时间值.我们改一下
栗子如下:
SELECT cust_id,order_num
FROM orders
WHERE Date(order_date) ='2005-09-01';
那如果我们要查询2005年9月份的所有订单呢.
例子如下:
SELECT cust_id,order_num
FROM orders
WHERE Date(order_date) BETWEEN '2005-09-01' AND '2005-09-30';
如果不用BETWEEN 呢.
SELECT cust_id,order_num
FROM orders
WHERE Year(order_date) = 2005 AND Month(order_date)=9;
Year() 就是从order_date中返回年份
Month()就是从order_date中返回月份.
结果如下:
③ 数值处理函数
函数 | 说明 |
---|---|
Abs() | 返回一个数的绝对值 |
Cos() | 返回一个角度的余弦 |
Exp() | 返回一个数的指数值 |
Mod() | 返回除操作的余数 |
Pi() | 返回圆周率 |
Rand() | 返回一个随机数 |
Sin() | 返回一个角度的正弦 |
Sqrt() | 返回一个数的平分根 |
Tan() | 返回一个角度的正切 |