学习MySQL:六:从表中检索信息+修改指定的一条记录的一个字段值+检索特定行列数据+ 检索每个唯一的+排序行

目录

一:目的

1、想:从表中检索信息

二、参考

1、MySQL 8 的学习——4从表中检索信息

1、MySQL解决读取TXT时候因为空格等问题无法读取的情况

三、操作

1、检索所有数据+修改指定的一条记录的一个字段值+查询是否更改成功,可以看到,生日更改了

2、检索特定行数据:

①检索特定行数据:特定出生日期:

②检索特定行数据:特定雌性狗:注意使用and 

①检索特定行数据:where限制范围,可以使用括号,前面的查询使用 AND 逻辑运算符。还有一个 OR 运算符

3、检索特定列数据

①检索特定列数据:只查看 name, birth

②检索特定列数据:要找出谁拥有宠物,请使用此查询

③检索特定列数据:要找出谁拥有宠物,上面的查询有重复的记录,要最小化输出,可以通过添加关键字 DISTINCT 检索每个唯一的输出记录

④检索特定列数据:显示列名字name、species、birth从pet数据库,并且从种类中选择dog、cat种类

4、排序行数据

①排序行数据:动物的生日,按日期排序,默认从小到大

②排序行数据:动物的生日,按日期排序,从大到小;默认排序顺序为升序,首先是最小值。要按反向(降序)顺序排序,请将DESC关键字添加到要排序 的列的名称

③排序行数据:您可以对多个列进行排序,并且可以按不同方向对不同列进行排序。例如,要按动物类型按升序排序,然后按动物类型中的出生日期按降序排序(最年轻的动物首先),请使用以下查询:上面的 DESC 关键字仅适用于紧邻其前面的列名(birth); 它不会影响species列排序顺序。

5、日期计算

①通过名字、现在时间,计算出年龄

②按名称对输出进行排序:

③计算death和 birth值之间的差值:

④找到和现在月份一样的名字、出生日期:

⑤计算以后几个月和现在时间月份相同的人:

⑥日期取余:找到1、2、3个月后同月份生日的人

6、使用NULL值

①概念: IS NULL和IS NOT NULL运算符

② =, <或 <>以测试NULL

③0或NULL 代表 false,除此之外的值代表 true。布尔运算的默认真值是1

7、模式匹配

① 要查找以字母 b 开头的 name:'b%'

②要查找以字母fy结尾的name:'%fy'

③要查找包含w的name:

④要找到包含五个字符的name:'五个下划线'

⑤模式匹配(使用扩展的正则表达式)

⑥因为REGEXP_LIKE再程序里面一直提示报错,因为直接跳过,为了演示扩展正则表达式的工作原理,先前显示  LIKE 的查询将在此处重写以供使用 REGEXP_LIKE()。

8、计数行

①COUNT(*)计算行数,因此计算动物的查询如下所示;

②COUNT()如果你想了解每位业主拥有多少宠物,你可以使用:述查询中使用GROUP BY 将每个记录根据owner进行分组

③查询每种动物的数量

④每性别的动物数量:

⑤每种物种和性别组合的动物数量:

⑥使用无需检索每个表COUNT().例如,以前的查询,只在狗和猫上执行时,如下所示:

⑦如果您想要每性别的动物数量只对已知性别的动物;

9、使用多个表

①CREATE TABLE EVENT:在pet数据库中再创建表格事件

②导入数据:与pet表一样,最简单的方法是通过创建包含以下信息的制表符分隔文本文件来加载初始记录。

③找到pet表和event表中正在litter事情的:暂时看不懂

④同种类动物配对:暂时看不懂

 



 

一:目的

1、想:从表中检索信息

 

二、参考

1、MySQL 8 的学习——4从表中检索信息

https://blog.csdn.net/zjy_android_blog/article/details/81609303

①总结:good:亲测有效,我的实测就是按照这个博客进行操作的

a、SELECT 语句用于从表中提取信息。声明的一般形式是:

SELECT what_to_select
FROM which_table
WHERE conditions_to_satisfy;
  1. what_to_select  表示想要看到的内容(可以是列名或者* ,* 代表所有列);
  2. which_table 表示要从哪一个表检索数据;
  3. where条件是可选的。如果存在,则 conditions_to_satisfy 指定行必须满足的一个或多个条件才有资格进行检索。

 

1、MySQL解决读取TXT时候因为空格等问题无法读取的情况

https://blog.csdn.net/qq_40544338/article/details/106321250

①总结:good:解决了MySQL加载txt时候,加载位置不对的问题。

 

三、操作

1、检索所有数据+修改指定的一条记录的一个字段值+查询是否更改成功,可以看到,生日更改了

①运行结果:

update pet set birth ='1911-12-12' where name='tom';
select *from pet where name='tom';

 

2、检索特定行数据:

检索特定行数据:特定出生日期:

a、你可以在任何列上指定条件,而不仅仅是 name。例如,如果您想知道1950-01-02年之后出生的动物:

select *from pet where  birth>='1950-01-02';

 

检索特定行数据:特定雌性狗:注意使用and 

a、使用and

b、数据、关键字大小写不重要

select *from pet where species='dog' and sex='f';

 

检索特定行数据:where限制范围,可以使用括号,前面的查询使用 AND 逻辑运算符。还有一个 OR 运算符

 select *from pet where (species='cat' and sex='F') or (species='dog'and sex='f');

 

3、检索特定列数据

检索特定列数据:只查看 name, birth

SELECT name,birth FROM pet;

 

②检索特定列数据:要找出谁拥有宠物,请使用此查询

SELECT owner FROM pet;

 

③检索特定列数据:要找出谁拥有宠物,上面的查询有重复的记录,要最小化输出,可以通过添加关键字 DISTINCT 检索每个唯一的输出记录

SELECT DISTINCT owner FROM pet;

a、因为之前的数据库内容太少了,我将内容增加了 

b、注意使用

  1.  fields terminated by '\t' :表示使用tab制表符作为字段分隔符;
  2.  lines terminated by'\r\n'  :表示使用回车换行符作为行分隔符
load data local infile "E:\\Test\\MySQLTest\\pet.txt"into table pet fields terminated by '\t'  lines terminated by '\r\n';

 

Fluffy	Harold	cat	f	1993-02-04	0000-00-00	
Claws	Gwen	cat	m	1994-03-17	0000-00-00	
Buffy	Harold	dog	f	1989-05-13	0000-00-00	
Fang	Benny	dog	m	1990-08-27	0000-00-00
Bowser	Diane	dog	m	1979-08-31	1995-07-29 
Chirpy	Gwen	bird	f	1998-09-11	0000-00-00 
Whistler	Gwen	bird	f	1997-12-09	0000-00-00 
Slim	Benny	snake	m	1996-04-29	0000-00-00 
Puffball	Diane	hamster	f	1999-03-30	NULL   

 

检索特定列数据:显示列名字name、species、birth从pet数据库,并且从种类中选择dog、cat种类

 SELECT name ,species,birth FROM pet WHERE species IN('dog','cat');

运行结果 

 

4、排序行数据

排序行数据:动物的生日,按日期排序,默认从小到大

SELECT name,birth FROM pet ORDER BY birth;

 

排序行数据:动物的生日,按日期排序,从大到小;默认排序顺序为升序,首先是最小值。要按反向(降序)顺序排序,请将DESC关键字添加到要排序 的列的名称

SELECT name,birth FROM pet ORDER BY birth DESC;

 

排序行数据:您可以对多个列进行排序,并且可以按不同方向对不同列进行排序。例如,要按动物类型按升序排序,然后按动物类型中的出生日期按降序排序(最年轻的动物首先),请使用以下查询:上面的 DESC 关键字仅适用于紧邻其前面的列名(birth); 它不会影响species列排序顺序。

 SELECT name,species,birth FROM pet ORDER BY species,birth DESC;

 

5、日期计算

①通过名字、现在时间,计算出年龄

 SELECT name,birth,CURDATE(),TIMESTAMPDIFF(year,birth,CURDATE())AS age FROM pet;

 

②按名称对输出进行排序:

a、AS作为别名

b、 ORDER BY NAME

SELECT name,birth,CURDATE(),TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age FROM pet ORDER BY NAME;

 

③计算death和 birth值之间的差值:

a、类似的查询可用于确定死亡动物的死亡年龄。可以通过检查death值 是否为NULL。然后,对于那些具有非NULL值的人,计算death和 birth值之间的差值:

b、此处查询使用death IS NOT NULL而不是death <> NULL因为 NULL是一个特殊值,无法使用通常的比较运算符进行比较。

 <> 代表不等于 ,<=> 代表等于

SELECT name,birth,death,TIMESTAMPDIFF(YEAR,birth,death)AS age FROM pet WHERE death IS NOT NULL ORDER BY age;

 

④找到和现在月份一样的名字、出生日期:

a、如果你想知道哪些动物下个月有生日怎么办?对于这种类型的计算,年和日是无关紧要的;您只想提取birth列的月份部分 。MySQL提供了用于提取日期的部分,如一些功能 YEAR(),MONTH()和 DAYOFMONTH()。 MONTH()可用于提取月份。

 SELECT name,birth,MONTH(birth) AS birthMOonth FROM pet WHERE MONTH(birth)<=>MONTH(CURDATE());

 

⑤计算以后几个月和现在时间月份相同的人:

  • 如果当前月份是12月,则会出现一个小的复杂情况。你不能只在月份数字(12)中添加一个并查找月份出生的动物 13,因为没有这样的月份。相反,你寻找1月(月1)出生
  • 您可以编写查询,以便无论当前月份是什么,它都可以工作,因此您不必使用特定月份的数字。 DATE_ADD()使您可以将时间间隔添加到给定日期。如果您将值添加一个月CURDATE(),然后使用,则提取月份部分MONTH(),结果将生成查找生日的月份:

 SELECT name,birth FROM pet WHERE MONTH(birth)=MONTH(DATE_ADD(CURDATE(),INTERVAL 3 MONTH));

 

 

⑥日期取余:找到1、2、3个月后同月份生日的人

a、MONTH()返回1和12之间的数字。并 MOD(something,12)在0和11之间返回一个数字。所以添加1,必须在MOD()之后

SELECT name,birth FROM pet WHERE MONTH(birth)=MOD(MONTH(CURDATE()),12)+3;

 

6、使用NULL值

①概念: IS NULLIS NOT NULL运算符

从概念上讲,NULL意味着 “ 缺失的未知值 ”,并且与其他值的处理方式略有不同。
要测试NULL,请使用 IS NULLIS NOT NULL运算符,如下所示:

SELECT 1 IS NULL ,1 IS NOT NULL;

 

=, <或 <>以测试NULL

你使用算术比较操作符,如 =, <或 <>以测试NULL。要自己演示,请尝试以下查询:

SELECT 1=NULL,1<>NULL,1<NULL,1>NULL;

 

0或NULL 代表 false,除此之外的值代表 true。布尔运算的默认真值是1

  1. 任何有 NULL 参与的算术比较的结果也是 NULL,因此你无法从此类比较中获得任何有意义的结果。 在MySQL中,0或NULL 代表 false,除此之外的值代表 true。布尔运算的默认真值是1。
  2. 上述结果显示,完全可以将零或空字符串插入到NOT NULL列中,因为这些实际上是 NOT NULL 的
 SELECT 0 IS NULL,0 IS NOT NULL,'' IS NULL,''IS NOT NULL;

 

7、模式匹配

SQL模式匹配使你可以使用 _ (下划线)匹配任何单个字符,并且 % (百分号)匹配任意数量的字符(包括零个字符)。在MySQL中,SQL模式默认情况下不区分大小写。这里显示了一些例子。使用SQL模式时不要使用 =<>,请改用LIKE或 NOT LIKE比较运算符。

① 要查找以字母 b 开头的 name:'b%'

SELECT *FROM pet WHERE name LIKE 'b%';

 

 

②要查找以字母fy结尾的name:'%fy'

 SELECT *FROM pet WHERE name LIKE '%fy';

 

 

③要查找包含w的name:

SELECT *FROM pet WHERE name LIKE '%w%';

 

④要找到包含五个字符的name:'五个下划线'

 SELECT *FROM pet WHERE name LIKE '_____';

 

⑤模式匹配(使用扩展的正则表达式)

MySQL提供的另一种模式匹配(使用扩展的正则表达式)。当你测试此类模式的匹配项时,请使用 REGEXP_LIKE()函数( REGEXP或 RLIKE 运算符,它们是REGEXP_LIKE()的同义词 )。

以下列表描述了扩展正则表达式的一些特征:

  • . 匹配任何单个字符。
  • 字符类[...]匹配括号内的任何单个字符。例如, [abc]匹配a, b或c。要代表一系列字符,请使用短划线。[a-z] 匹配任何字母(扩展正则查询不区分大小写),而[0-9] 匹配任何数字。
  • *匹配前面的事物的零个或多个实例。例如,x* 匹配任意数量的x字符, [0-9]*匹配任意数量的数字,并.*匹配任意数量的任何数字。
  • 如果正在测试的值有任何位置匹配正则中规则,则正则表达式模式匹配成功。(这与LIKE模式匹配不同,模式匹配仅在模式匹配整个值时才会成功。)
  • 使用^在pattern的开头或$在 pattern 的结尾,使得测试的值必须在开头或结尾匹配 pattern。
     

⑥因为REGEXP_LIKE再程序里面一直提示报错,因为直接跳过,为了演示扩展正则表达式的工作原理,先前显示  LIKE 的查询将在此处重写以供使用 REGEXP_LIKE()

 

8、计数行

①COUNT(*)计算行数,因此计算动物的查询如下所示;

 SELECT COUNT(*) FROM pet;

 

②COUNT()如果你想了解每位业主拥有多少宠物,你可以使用:述查询中使用GROUP BY 将每个记录根据owner进行分组

 SELECT owner,COUNT(*)FROM pet GROUP BY owner;

 

③查询每种动物的数量

SELECT species,COUNT(*) FROM pet GROUP BY species;

 

 

④每性别的动物数量:

 SELECT sex,COUNT(*) FROM pet GROUP BY sex;

 

⑤每种物种和性别组合的动物数量:

 

SELECT species ,sex,COUNT(*) FROM pet GROUP BY species,sex;

 

⑥使用无需检索每个表COUNT().例如,以前的查询,只在狗和猫上执行时,如下所示:

 SELECT species,sex,COUNT(*) FROM pet WHERE species IN ('cat','dog')GROUP BY species,sex;

 

⑦如果您想要每性别的动物数量只对已知性别的动物;

SELECT species,sex,COUNT(*)FROM pet WHERE sex IS NOT NULL GROUP BY species,sex;

 

9、使用多个表

 

该pet表记录了你拥有的宠物。如果你想记录有关它们的其他信息,例如生活中的事件,例如兽医的访问或者出生时,您需要另一个 表。这个表应该是什么样的?它需要包含以下信息:

宠物名称,以便您了解每个事件所属的动物。

日期,以便您知道事件发生的时间。

描述事件的字段。

如果您希望能够对事件进行分类,则为事件类型字段。

鉴于这些注意事项,event 表的CREATE TABLE语句可能如下所示:

①CREATE TABLE EVENT:在pet数据库中再创建表格事件

CREATE TABLE EVENT(name varchar(20),date date,type varchar(20),remark varchar(255));

 

 DESCRIBE EVENT;

 

②导入数据:与pet表一样,最简单的方法是通过创建包含以下信息的制表符分隔文本文件来加载初始记录。

 LOAD DATA LOCAL INFILE 'E:\\Test\\MySQLTest\\event.txt'INTO TABLE EVENT FIELDS TERMINATED BY '\t'  LINES TERMINATED BY '\r\n';


 

Fluffy	1995-05-15	litter	4 kittens, 3 female, 1 male
Buffy	1993-06-23	litter	5 puppies, 2 female, 3 male
Buffy	1994-06-19	litter	3 puppies, 3 female
Chirpy	1999-03-21	vet	needed beak straightened
Slim	1997-08-03	vet	broken rib
Bowser	1991-10-12	kennel
Fang	1991-10-12	kennel
Fang	1998-08-28	birthday	Gave him a new chew toy
Claws	1998-03-17	birthday	Gave him a new flea collar
Whistler	1998-12-09	birthday	First birthday

 

③找到pet表和event表中正在litter事情的:暂时看不懂

假设你想要找出每只宠物的窝的年龄。我们之前看到过如何计算两个日期的年龄。收养的 litter的日期在event 表中,但要计算她在该日期的年龄,您需要她的出生日期,该日期存储在 pet 表中。这意味着查询需要两个表:

 SELECT pet.name,TIMESTAMPDIFF(year,birth,date)AS age,remark FROM pet INNER JOIN EVENT ON pet.name=event.name WHERE event.type='litter';

有关此查询的注意事项有以下几点:

  • 该FROM子句连接两个表,因为查询需要从两个表中提取信息。
  • 组合(连接)来自多个表的信息时,需要指定一个表中的记录如何与另一个表中的记录匹配。这很容易,因为它们都有一个name列。该查询使用ON子句根据值匹配两个表中的记录name。
  • 该查询使用 INNER JOIN来组合表。当且仅当两个表都满足ON子句中指定的条件时,INNER JOIN允许来自任一表的行出现在结果中。在此示例中,ON子句指定pet表中的name列必须与event表中的name列匹配。如果name出现在一个表中但不出现在另一个表中,则该行不会出现在结果中,因为ON子句中的条件失败。
  • 由于name列出现在两个表中,因此你必须具体说明引用该name列时的表。这是通过将表名添加到列名称来完成的。

 

④同种类动物配对:暂时看不懂

  • 如果要将表中的记录与同一表中的其他记录进行比较,有时将表连接到自身会很有用。例如,要在您的宠物中找到繁殖对,您可以pet自己加入表格,以生成类似物种的男性和女性候选对:
  • 在此查询中,我们为表名指定别名以引用列,并保持每个列引用与表关联的表的实例。
 SELECT p1.name,p1.sex,p2.name,p2.sex,p1.species FROM pet AS p1 INNER JOIN pet AS p2 ON p1.species=p2.species AND p1.sex ='f' AND p2.sex='m';

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章