博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL常用查询
阅读量:7228 次
发布时间:2019-06-29

本文共 4160 字,大约阅读时间需要 13 分钟。

MySQL常用查询

一、实验简介

本节实验中我们将通过一个经销商数据库的实例来学习并实践多种常用的在数据库中查找记录的方法。

二、实验内容

在下面的例子中使用数据表shop来存储商人(经销商)的每件物品(物品号)对应的价格。假如每个商人对应的每个物品都有一个固定的价格,那么该表中的关键字就是物品商人

首先你需要启动服务器并连接到MySQL:

此处输入图片的描述

然后创建一个数据库TEST,并切换到该数据库:

此处输入图片的描述

再通过如下代码创建一个示例表:

mysql> CREATE TABLE shop (    -> article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,    -> dealer  CHAR(20) DEFAULT '' NOT NULL, -> price DOUBLE(16,2) DEFAULT '0.00' NOT NULL, -> PRIMARY KEY(article, dealer)); # 插入数据 mysql> INSERT INTO shop VALUES -> (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45), -> (3,'C',1.69),(3,'D',1.25),(4,'D',19.95);

此处输入图片的描述

执行以下语句查看表的内容:

mysql> SELECT * FROM shop;

此处输入图片的描述

1. 寻找列的最大值

使用MAX()函数计算物品号article的最大值:

mysql> SELECT MAX(article) as article FROM shop;

此处输入图片的描述

2. 查询某列最大值所在的行

# 显示price这一列最大值对应的行mysql> SELECT article, dealer, price    -> FROM   shop    -> WHERE  price=(SELECT MAX(price) FROM shop);

此处输入图片的描述

另外一个方法是对所有行进行价格的降序排序,然后使用MySQL特有的LIMIT子句显示其中一行(这里是指定第一行显示最高价格):

mysql> SELECT article, dealer, price    -> FROM shop    -> ORDER BY price DESC    -> LIMIT 1;

大家可以输入上述语句查询结果是否一样。

注:如果有多项物品的价格都是19.95(最贵的物品不止一个),那么LIMIT的显示结果也只会显示其中一个

3. 按组显示列的最大值

通过以下代码找出每项物品中对应出价最高价格

mysql> SELECT article, MAX(price) AS price    -> FROM shop    -> GROUP BY article;

此处输入图片的描述

4. 使用

通过使用用户变量找出价格最高或者最低的物品:

mysql> SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop;mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price;

此处输入图片的描述

思考其他的方式求出价格的最大值和最低值所对应的物品。

5. 使用

在MySQL中,表支持外键约束的检查。

在连接两个表的时候并不需要外键约束。对于除InnoDB表以外的表,可以使用REFERENCES tbl_name(col_name)语句定义将它的列设置为外键,但是该语句并没有实际的作用,只是作为备注来提醒你现在正在定义的列指向另外一个表的列。在执行该语句的时候需要注意以下几点:

  • MySQL并不会执行任何操作检查列col_name是否存在于表tbl_name中(它甚至不会检查tbl_name这个表是否真正存在)。
  • MySQL不执行表tbl_name中的操作,例如对你正定义的行的进行更改行为,致使ON DELETE或ON UPDATE语句在该行上不会生效(意思是如果你在REFERENCES子句中写入ON DELETE或ON UPDATE子句,将被忽略)。
  • 该句法可以创建一个列;但不创建任何索引或关键字。

你可以使用以上语句建立两个表并定义外键连接两个表中的列:

mysql> CREATE TABLE person (    -> id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,    -> name CHAR(60) NOT NULL,    -> PRIMARY KEY (id)    -> );mysql> CREATE TABLE shirt (    -> id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, -> style ENUM('t-shirt', 'polo', 'dress') NOT NULL, -> color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL, -> owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id), -> PRIMARY KEY (id) -> ); mysql> INSERT INTO person VALUES (NULL, 'Antonio Paz'); mysql> SELECT @last := LAST_INSERT_ID(); mysql> INSERT INTO shirt VALUES -> (NULL, 'polo', 'blue', @last), -> (NULL, 'dress', 'white', @last), -> (NULL, 't-shirt', 'blue', @last); mysql> INSERT INTO person VALUES (NULL, 'Lilliana Angelovska'); mysql> SELECT @last := LAST_INSERT_ID(); mysql> INSERT INTO shirt VALUES -> (NULL, 'dress', 'orange', @last), -> (NULL, 'polo', 'red', @last), -> (NULL, 'dress', 'blue', @last), -> (NULL, 't-shirt', 'white', @last);

尝试查询personshirt这两个的内容

按照以上方式建立表,并使用语句SHOW CREATE TABLE或者DESCRIBE查看输出结果,你会发现REFERENCES子句并不会出现在结果中:

SHOW CREATE TABLE shirt\G

看看你的输出结果吧~

6. 使用两个关键字进行搜索

充分利用OR连接两个关键字(AND也是一样的道理)

# 这里面的test_table可以是任何一个表,关键词也是类似SELECT field1_index, field2_index FROM test_tableWHERE field1_index = '1' OR  field2_index = '1'

还可以使用UNION将两个表里面的关键字一起使用进行搜索

SELECT field1_index, field2_index    FROM test_table WHERE field1_index = '1'    UNION SELECT field1_index, field2_index FROM test_table WHERE field2_index = '1';

7. 计算每月的访问量

下面使用BIT_COUNT函数计算每个月中某用户访问网页的天数:

CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL, day INT(2) UNSIGNED ZEROFILL); INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2), (2000,2,23),(2000,2,23);

上述建立的表中有用户访问网页的年月日,可以使用以下语句查询每个月的访问天数:

SELECT year,month,BIT_COUNT(BIT_OR(1<

8. 使用AUTO_INCREMENT语句

在定义列属性的时候添加AUTO_INCREMENT语句可以使得每条记录都能被唯一标识:

CREATE TABLE animals (     id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (id) ); INSERT INTO animals (name) VALUES ('dog'),('cat'),('penguin'), ('lax'),('whale'),('ostrich'); SELECT * FROM animals;

查看以上语句的返回结果,你会发现id是自动生成的。

要想AUTO_INCREMENT语句生成的起始值不是1,可以通过CREATE TABLEALTER TABLE来设置该值,如下所示:

mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;

更多关于AUTO_INCREMENT语句的学习:

  • 如何为列指定AUTO_INCREMENT属性:和。
  • 找出含有最新的AUTO_INCREMENT值的行:。

三、作业

尝试建立一个图书馆数据库,任由发挥,但必须包含基本信息:图书信息,借书人的信息,出版社信息。并运用这一节课学到的索引知识对数据库进行索引,把你的思想和步骤写入实验报告,在实验课环境下建立系统并索引,记得截图哦。

转载地址:http://fxpfm.baihongyu.com/

你可能感兴趣的文章
about
查看>>
O-Bomb(数位dp)
查看>>
hdu5032 点和查询分别按极角排序 离线做+树状数组
查看>>
hdu1428 递归形式dp(记忆化搜素):A能到B的条件是A到目的地最短路大于B到目的地最短路...
查看>>
实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(三)...
查看>>
关于VC++6.0 MFC项目运行所需的动态链接库
查看>>
由system.currentTimeMillis() 获得当前的时间
查看>>
复习日记-Linux项目发布
查看>>
The 'Microsoft Jet OLEDB 4.0 Provider' is not registered on the local machine
查看>>
Java 基础源码 switch语句判断指定月份属于一年中的哪个季度
查看>>
12px以下字体显示问题
查看>>
小程序滚动条 无法滚动BUG 解决方案
查看>>
cs108 04 oop design
查看>>
win7 打开方式不能添加程序
查看>>
EasyUI-panel 内嵌页面上的js无法被执行
查看>>
pycharm运行input输入字符串报错 NameError: name 'xxx' is not defined
查看>>
微信小程序rpx单位
查看>>
Javascript读写CSS属性
查看>>
58.com qiyi
查看>>
ORACLE批量导入图片到BLOB字段
查看>>