黄色的mysql_小黄的MySQL学习之路-02

在使用之前,需要先导入一个sql文件.

文件如下:

检索数据

① 准备工作

创建一个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

结果如下:

97ca34a189b467794bc710c901cc009b.png

④ 检索多个列

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制造的产品:

e85e2decea16ce1dafe2fd307c70c66b.png

④ 范围值检查

SELECT prod_price,prod_name

FROM products

WHERE prod_price BETWEEN 5 AND 10;

截图如下:

292a1f37759cada609cc8669f4ba2033.png

⑤ 空值检查

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的列

5c34a424fa0296329cc4c28698c654b5.png

② OR

就是或的意思,

注意AND 的优先级比OR高---搞不清,就使用()来.

SELECT prod_name,prod_price,prod_name

FROM products

WHERE vend_id=1003 or vend_id=1002;

找vend_id是1002或者1003的

结果如下:

e794eac42d98c943e9f95252a27259fc.png

③ 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的那个一样.

结果如下;

e794eac42d98c943e9f95252a27259fc.png

④ NOT

也就是非的意思

SELECT prod_name,prod_price,prod_name

FROM products

WHERE vend_id NOT IN(1002,1003);

就是找vend_id不是1002和1003的对象

结果如下;

0330584b7678216758463bd16f41b409.png

用通配符进行过滤

① Like操作符

② 通配符 '%' 和 '_'

%表示任何字符,出现任意次数

_ 表示任何字符出现单个次数

举两个例子:

SELECT prod_id,prod_name

FROM products

WHERE prod_name LIKE 'jet%';

结果如下:

06bbd91ffaad785f4ff52a38a4ec15cd.png

SELECT prod_id,prod_name

FROM products

WHERE prod_name LIKE '_ ton anvil';

结果如下:

8b895ac23594bdefbe6fcdb18501c0a1.png

用正则表达式进行搜索

① 基本字符匹配

SELECT prod_name

FROM products

WHERE prod_name REGEXP '1000'

ORDER BY prod_name;

REGEXP 后面跟的就是正则表达式

这条语句的作用就是 再producst表中,找prod_name 为1000 的

顺序按照prod_name

结果如下:

0521949c206a068cc903a5ea2e8c7731.png

② 使用OR匹配

SELECT prod_name

FROM products

WHERE prod_name REGEXP '1000|2000'

ORDER BY prod_name;

结果如下:

cc4a9a2a1d72af16f17697258439ed33.png

| 就相当于或的意思.

③ 匹配几个字符之一

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;

就是查找 '.'

结果如下:

4506676070d6426d8d87d79cb5c651a0.png

表 空白元字符(PS \ 和\ 之间没有空格)

元字符

说明

\ \ f

换页

\ \ n

换行

\ \ r

回车

\ \ t

制表

\ \ v

纵向制表

⑥ 匹配字符类

6452fd474725fca3b7a94ce4a13e7a8c.png

⑦ 匹配多个实例

b37ba80c3be40832d3fd159a739cd68a.png

下面是例子:

SELECT prod_name

FROM products

WHERE prod_name REGEXP '\\([0-9] sticks?\\)'

ORDER BY prod_name;

结果如下:

18c683516f08d3645a5ee20049792fe3.png

解释一下

\\( 就是 ( 的表示

\\) 就是 )的表示

然后结果就是这样的乐.

⑧ 定位符

442d58c65b3b090a57ec525ff81e84d6.png

举个例子:

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;

然后结果如下;

00618019959aac57ff615227ff97a18a.png

还有一个函数

可以删除数据右侧多余的空格

RTrim()函数

上面的语句还可以优化为.

SELECT Concat(RTrim(vend_name),' (',vend_country,')')

FROM vendors

ORDER BY vend_name;

a0f34fc5a3b21cc522f0e3cac075a2b9.png

还有别的函数

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;

912757ced37ee1f5e6450d60f91bd368.png

③ 执行算术运算

SELECT prod_id,quantity,item_price

FROM orderitems

WHERE order_num =20005;

dccd46023087cb78b6d75aaea941bfbf.png

如果我们要计算总物品的价格呢.

SELECT prod_id,quantity,item_price,

quantity*item_price AS expanded_price

FROM orderitems

WHERE order_num =20005;

fdb2ed7addda6dc00c940caa3b0936b8.png

使用函数

① 文本处理函数

常用的文本处理函数

函数

说明

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;

结果如下:

7cd2dc3f405ce3e94337f824f752ce99.png

然后就是上面的函数中有一个比较特殊的函数

Soundex函数

这个函数是根据串的音节来找相识的音节

下面是一个例子:

SELECT cust_name,cust_contact

FROM customers

WHERE Soundex(cust_contact)=Soundex('Y Lie');

结果如下:

ce32f3b0e31de1d0dadcb46ac17c5f1e.png

② 日期和时间处理函数

常见的日期和时间处理函数表

函数

说明

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';

3d770f0f249c51d48733c8948e855d07.png

那如果我们要查询2005年9月份的所有订单呢.

例子如下:

SELECT cust_id,order_num

FROM orders

WHERE Date(order_date) BETWEEN '2005-09-01' AND '2005-09-30';

9b68b4d7426e2eb8e8dd91d3d1b071fe.png

如果不用BETWEEN 呢.

SELECT cust_id,order_num

FROM orders

WHERE Year(order_date) = 2005 AND Month(order_date)=9;

Year() 就是从order_date中返回年份

Month()就是从order_date中返回月份.

结果如下:

9b68b4d7426e2eb8e8dd91d3d1b071fe.png

③ 数值处理函数

函数

说明

Abs()

返回一个数的绝对值

Cos()

返回一个角度的余弦

Exp()

返回一个数的指数值

Mod()

返回除操作的余数

Pi()

返回圆周率

Rand()

返回一个随机数

Sin()

返回一个角度的正弦

Sqrt()

返回一个数的平分根

Tan()

返回一个角度的正切

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值