MySQL基础语句

312 阅读6分钟

这是第二次打卡作业了,这一次的主要内容是基础的SQL语句,但是有个概念我们要搞清楚,就是什么是SQL、什么是MySQL。以下的语句都是基于MySQL。

什么是SQL

SQL是Structured Query Language的缩写,中文叫做结构化查询语言,是专门用来操作数据库的。

什么是MySQL

MySQL是一款数据库软件,当然,站在语言的角度也是一门语言,是遵循SQL的一些准则便携的语言实例。SQL是标准,而MySQL是具体的实现。

SELECT FROM查询语句

基础用法

SElECT查询语句可以说会是数据库中使用最多的语句了。他可以查询数据表中的内容。如果你想要从数据库中查询某个信息,你最少需要提供两个信息。

  • 想要查询的字段名(域名)
  • 想要查询的表名
    SELECT name 
    FROM student

上面的这条语句就是从student表中检索一个字段名为name的列。这是最简单的用法,SELECT语句还有很多子语句,我们会在下面介绍。当然,你也可以查询多个列,就像下面这个样子,字段名的中间使用逗号隔开就好。当然,你也可以使用*号,来返回所有的列。

    SELECT id,
           name,
           sex
    FROM student

去重语句

我们使用上面的查询语句会有一个很重要的问题,就是他会将所有的查询结果返回给我们,但是也许我们只是想要不同的那一部分。这时,我们可以使用DISTINCT关键字,将它放在相应的字段名前即可

    SELECT  DISTINCT id,
    FROM products

这样的话就会将不同的id帮你检索出来,还有一个很重要的问题,便是如果DISTINCT后面跟了多个字段名,那么这两个字段都会起作用,也就是说除非两行的这两个字段是一模一样的,否则就会被检索出来。

限制结果

有些时候我们期望检索从某个位置开始,返回这之后匹配到的指定数量的数据,这时便是限制结果起作用的时候了。

    SELECT name 
    FROM products 
    LIMIT 5;

上面的语句便是告诉数据库只返回检索到的5个数据,limit子语句还有一个关键字,允许告诉数据库从距离起始位置多少个数量的地方开始检索数据

    SELECT name 
    FROM products 
    LIMIT 5 OFFSET 5 

上面的语句就是告诉数据库从便宜起始位置5个数量的地方开始检索,并且检索的数据量不超过5个。也可以使用简写的方式,LIMIT 5,5;

WHERE筛选语句

上面我们已经看了基本的SELECT语句了,但是上面的无法满足我们更多的需求,我们使用数据库查询数据更多的时候是需要提供一些条件的,这时我们便需要用到WHERE子语句。例如我们从学生表中查询学号为10的学生名

    SELECT name
    FROM student
    WHERE id = 10;

最下面的WHERE语句后面跟的是条件,当然我们也可以复合,使用AND、OR操作符(可以想象成编程语言的&&、||操作符)

AND
    SELECT name
    FROM student
    WHERE age < 18 AND sex = female;

上面的查询语句表示要查询年龄小于18岁,并且性别为男性的学生。

OR

    SELECT name
    FROM student
    WHERE age < 18 OR age >20;

上面的查询语句表示要查询年龄小于18岁,或者年龄大于20岁的学生。

BETWEEN AND

使用BETWEEN AND操作符可以将某个条件限定在一定范围之内,我们可以将上面的查询在18到20岁年龄区间的改为使用BETWEEN AND查询

    SELECT name
    FROM student
    WHERE age BETWEEN 18 AND 20;

还有一些简答的单个操作符就不再一一介绍了,具体可以去查相关文档

ORDER BY排序语句

当我们有了我们想要数据,我们还是不满足,返回来一大堆数据,毫无顺序可言,这怎么看,这是ORDER BY排序语句就登场了。ORDER BY可以按照升降序排列。默认是升序,想要使用降序时可以使用DESC关键字

    SELECT name 
    FROM products 
    ORDER BY name;

这样的话就会按照name字段的字典顺序排列,如果想要变为降序,只需在ORDER BY的语句后面添加DESC。

    SELECT name 
    FROM products 
    ORDER BY name DESC;

还有可以按照多个列排序

    SELECT id, price, name 
    FROM products
    ORDER BY price, name;

上面的例子就是按照多个列排序,这里问题是只有第一个排序条件相同时第二个才会起作用。

GROUP BY子句与HAVING子句

GROUP BY子句

我们直接看一个例子

    SELECT id, COUNT(*) AS count 
    FROM products
    GROUP BY id;
    
    --结果
    
    id    count 
    BRS01   3
    DLL01   4
    FNG01   2

上面的例子返回的结果有两个列,其中第一列为id,第二列为第一列id的数量,其实是GROUP BY帮我们根据id分了组,然后再每个组各自计算的数量。有个一个需要注意的地方,GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前

HAVING子句

依然是来看例子

    SELECT id, COUNT(*) AS count 
    FROM orders
    GROUP BY id
    HAVING COUNT(*) >= 2;

上面的语句基本与上一个例子相同,只是最后一行多了HAVING子句,表示查询分组之后的数据中数量大于2的分组

函数

函数有日期处理函数、熟知处理函数、字符处理函数、聚合函数,我们就来看看应该是使用最多的的聚合函数的用法吧

聚合函数

上面是聚合函数的类型,他们使用起来很简单,只要在查询时,将我们的数据字段使用函数包裹起来就好。

    --平均值函数
    SELECT AVG(price) AS avg_price 
    FROM products;
    
    --总数函数
    SELECT COUNT(*) AS cust 
    FROM products;
    
    --最大值函数
    SELECT MAX(price) AS max_price
    FROM products;
    
    --最小值函数
    SELECT MIN(price) AS min_price
    FROM products;
    
    -- 求和函数
    SELECT SUM(quantity) AS items_ordered 
    FROM orderItems
    WHERE order_num = 20005;

作业

作业一

第一步:创建数据表&插入数据

CREATE DATABASE test;
USE test;
CREATE TABLE if NOT EXISTS 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');

第二步:查询数据

    SELECT Email 
	FROM email 
	GROUP BY Email
	HAVING COUNT(*) >=2;

结果图:

作业二

第一步:创建数据表&插入数据

CREATE TABLE if not exists 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 name,population,area
	FROM World
	WHERE area >= 3000000 
	OR (population >= 25000000 AND gdp >= 20000000);

结果图: