MySQL 学习
安装错误
error 1045
ERROR 1045 (28000): Access denied for user ‘ODBC’@‘localhost’ (using password: YES)
由于之前下载过MySQL,在学习过程中初始化了数据库,导致密码忘记,进入数据库遭到了拒绝,故出现了1045错误,出错(using password: YES)的意思是输入密码错误,因为MySQL中允许无密码或匿名进入数据库,此时出错会显示(using password: NO)。
解决方法
- 管理员登陆系统,停止mysql服务:
C:\Users\Administrator> net stop MYSQL
- 进入命令行,来到mysql的安装目录,假设安装目录为 C:\MySQL\ , CMD进入命令行
- 运行下面语句
C:\Users\Administrator> cd C:\MySQL\bin
C:\MySQL\bin> mysqld-nt --skip-grant-tables
启动mysql,关闭权限的检查
- 运行
C:\MySQL\bin> mysqladmin -u root flush-privileges password "123456"
此处重设root密码为123456
- 重新启动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语句
- GROUP BY子句通过列或表达式的值将一组行分组为一个小分组的汇总行记录。
- GROUP BY子句为每个分组返回一行。换句话说,它减少了结果集中的行数。
- 经常使用GROUP BY子句与聚合函数一起使用,如SUM,AVG,MAX,MIN和COUNT。SELECT子句中使用聚合函数来计算有关每个分组的信息。
- 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:
Id | |
---|---|
1 | a@b.com |
2 | c@d.com |
3 | a@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);
结果显示如下