MySQL学习TASK1

安装错误

error 1045

ERROR 1045 (28000): Access denied for user ‘ODBC’@‘localhost’ (using password: YES)
由于之前下载过MySQL,在学习过程中初始化了数据库,导致密码忘记,进入数据库遭到了拒绝,故出现了1045错误,出错(using password: YES)的意思是输入密码错误,因为MySQL中允许无密码或匿名进入数据库,此时出错会显示(using password: NO)。

解决方法

  1. 管理员登陆系统,停止mysql服务:
C:\Users\Administrator> net stop MYSQL
  1. 进入命令行,来到mysql的安装目录,假设安装目录为 C:\MySQL\ , CMD进入命令行
  2. 运行下面语句
C:\Users\Administrator> cd C:\MySQL\bin
C:\MySQL\bin> mysqld-nt --skip-grant-tables

启动mysql,关闭权限的检查

  1. 运行
C:\MySQL\bin> mysqladmin -u root flush-privileges password "123456" 

此处重设root密码为123456

  1. 重新启动mysql服务

ORDER BY语句

  • ORDER BY子句允许使用FIELD()函数为列中的值定义自己的自定义排序顺序。
SELECT orderNumber, status
FROM orders
ORDER BY FIELD(status,'In Process','On Hold','Cancelled','Resolved','Disputed','Shipped');

GROUP BY语句

  1. GROUP BY子句通过列或表达式的值将一组行分组为一个小分组的汇总行记录。
  2. GROUP BY子句为每个分组返回一行。换句话说,它减少了结果集中的行数。
  3. 经常使用GROUP BY子句与聚合函数一起使用,如SUM,AVG,MAX,MIN和COUNT。SELECT子句中使用聚合函数来计算有关每个分组的信息。
  4. GROUP BY子句必须出现在FROM和WHERE子句之后。 在GROUP BY关键字之后是一个以逗号分隔的列或表达式的列表,这些是要用作为条件来对行进行分组。

GROUP BY使用

  • 将订单状态的值分组到子组中,则要使用GROUP BY子句并指定按status列来执行分组
SELECT status FROM orders
GROUP BY status;

SELECT DISTINCT status
FROM orders
ORDER BY status;

可以发现,上述两个语句运行的结果是一样的。

GROUP BY与聚合函数

  • COUNT聚合
SELECT status, COUNT(*) AS total_number
FROM orders
GROUP BY status;

结果如下图所示
在这里插入图片描述

  • 要按状态获取所有订单的总金额,可以使用orderdetails表连接orders表,并使用SUM函数计算总金额。
    在这里插入图片描述
SELECT status, SUM(quantityOrdered * priceEach) AS amount
FROM orders
         INNER JOIN
		 orderdetails USING (orderNumber)
GROUP BY status;

结果如下图所示
在这里插入图片描述

  • 按表达式对行进行分组,查询获取每年的总销售额,使用YEAR函数从订单日期(orderDate)中提取年份数据,只包括已发货(Shipped)状态的订单。
SELECT YEAR(orderDate) AS year,
       SUM(quantityOrdered * priceEach) AS total
FROM orders 
         INNER JOIN orderdetails USING (orderNumber)
WHERE status = 'Shipped'
GROUP BY YEAR(orderDate);

HAVING 语句

在SELECT语句中使用HAVING子句来指定一组行或聚合的过滤条件。HAVING子句通常与GROUP BY子句一起使用,以根据指定的条件过滤分组。如果省略GROUP BY子句,则HAVING子句的行为与WHERE子句类似。请注意,HAVING子句将过滤条件应用于每组分行,而WHERE子句将过滤条件应用于每个单独的行。

  • 查询订单的总销售额大于50000,并且包含超过600个项目
SELECT 
    orderNumber,
    SUM(quantityOrdered) AS itemsCount,
	SUM(quantityOrdered * priceEach) AS total
FROM
    orderdetails
GROUP BY orderNumber
HAVING total > 55000 AND itemsCount > 600;
  • 查找所有已发货(status=‘Shiped’)的订单和总销售额大于55000的订单,可以使用INNER JOIN子句将orders表与orderdetails表一起使用,并在status列和总金额(total)列上应用条件.
SELECT 
   a.orderNumber,
   status,
   SUM(priceEach * quantityOrdered) AS total 
FROM
   orderdetails a INNER JOIN orders b ON b.orderNumber = a.orderNumber
GROUP BY orderNumber, status
HAVING status = 'Shipped' AND total > 5000;

练习一

创建一个email表格

EMAIL:

IdEmail
1a@b.com
2c@d.com
3a@b.com

首先我直接创建表格

CREATE TABLE email (
Id INT NOT NULL PRIMARY KEY,
Email VARCHAR(255)
)

错误1046

出现错误error:1046 - No database selected,意思没有选中数据库,所以我又重新尝试在上述语句前添加以下语句新建数据库

CREATE DATABASE mysql_practice;
USE mysql_practice;
SHOW TABLES;
)

此时数据库为空
在这里插入图片描述

正确创建表格

CREATE TABLE email (
Id INT NOT NULL PRIMARY KEY,
Email VARCHAR(255)
)
INSERT INTO email VALUES('1', 'a@b.com');
INSERT INTO email VALUES('2', 'c@d.com');
INSERT INTO email VALUES('3', 'a@b.com');
SHOW TABLES;

可以得到下面表格,即表格创建成功
在这里插入图片描述

查找重复信息

如果表格中包含重复的信息,此时该如何查询呢?

SELECT Email 
FROM email 
GROUP BY Email 
HAVING count(Email)>1

结果如下图显示
在这里插入图片描述

练习二

创建World表格

CREATE TABLE World(
name VARCHAR(50) NOT NULL,
continent VARCHAR(50) NOT NULL,
area INT NOT NULL,
population INT NOT NULL,
gdp INT NOT NULL
);
INSERT INTO World
  VALUES('Afghanistan','Asia',652230,25500100,20343000);
INSERT INTO World 
  VALUES('Albania','Europe',28748,2831741,12960000);
INSERT INTO World 
  VALUES('Algeria','Africa',2381741,37100000,188681000);
INSERT INTO World
  VALUES('Andorra','Europe',468,78115,3712000);
INSERT INTO World
  VALUES('Angola','Africa',1246700,20609294,100990000)
SELECT* FROM World;

表格显示为下图
在这里插入图片描述

查找大国信息

如果一个国家的面积超过 300 万平方公里,或者人口超过 2500 万并且 gdp 超过 2000 万,那么这个国家就是大国家,输出表中所有大国家的名称、人口和面积。

SELECT 
     name,area,population,gdp 
FROM 
     World
WHERE
   area > 3000000 OR (population > 25000000 AND gdp > 20000000);

结果显示如下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值