mysql学习(对库的操作、对表的操作、对表中数据的操作)

430 阅读9分钟

1 启动mysql

通过服务开启:

启动 service mysqld start

停止 service mysqld stop

重启 service mysqld restart

2 连接数据库

mysql -u 用户名 -p密码

注意:-u和用户名之间可以用空格隔开,但是-p和密码必须连在一起。

-p与后面的字符串隔开,那么这个字符串就是数据库的名字了。

3 对库的操作

3.1 创建库

CREATE DATABASE [IF NOT EXISTS] 库名 CHARSET utf8

[]中的内容是可以选择的

IF NOT EXIST表示如果这个表不存在就建立这个表。

3.2 查看库

SHOW DATABASES

SHOW CREATE DATABASE 库名 查看建库时的详细信息

3.3 修改库

ALTER DATABASE [IF NOT EXISTS] 库名 [DEFAULT] CHARACTER SET 字符名

3.4 删除库

DROP DATABASE [IF EXISTS] 库名

4 对表的操作

4.1 增加表

CREATE TABLE 表名( 列名 类型 )

4.2 修改表

4.2.1:修改表名

RENAME TABLE old_table_name TO new_table_name;

旧表( old_table_name)必须存在,而新表( new_table_name)一定不存在。如果新表 new_table_name 确实存在,该语句将失败。

4.2.2:在表中添加列

ALTER TABLE 表名 ADD ( 列名 数据类型 );

4.2.3:modify

ALTER TABLE 表名 MODIFY 列名 数据类型 ;

modify不用来字段重命名,只能修改字段类型和约束; change用来字段重命名,不能修改字段类型和约束;

4.3:查看表

SHOW TABLES; 查看该库中所有表

SHOW CREATE TALBE 表名; 查看表的创建细节

DESC 表名; 查看表结构

4.4 删除表

ALTER TABLE表名 DROP(列名);

删除表中某一列。

5:对表中数据的操作

5.1 增加

INSERT INTO 表名 ( 列名..) VALUES (数据..);

5.2 修改

UPDATE 表名 SET 列名=值.. , 列名=值 WHERE=条件 ;

原始数据

修改后

5.3 删除

5.3.1:清楚某张表中所有字段

DELETE FROM 表名 WHERE=条件;

5.3.2:删除某一张表

TRUNCATE TABLE

drop ,truncate ,delete区别

1、drop (删除表):删除内容和定义,释放空间。简单来说就是把整个表去掉.以后要新增数据是不可能的,除非新增一个表。drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。

2、truncate (清空表中的数据):删除内容、释放空间但不删除定义(保留表的数据结构)。与drop不同的是,只是清空表数据而已。 注意:truncate 不能删除行数据,要删就要把表清空。

3、delete (删除表中的数据):delete 语句用于删除表中的行。delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。

truncate与不带where的delete :只删除数据,而不删除表的结构(定义)

5.4 检索数据

SELECT 列名 FROM 表名, WHERE 条件, GROUP BY 列名, HAVING BY, ORDER BY 列名

6 检索数据

6.1:检索单列数据

SELECT 列名 FROM 表名;

在表中检索SQL语句中所写列的数据。

6.2:检索多列数据

SELECT 列名1,列名2,... FROM 表名;

6.3:检索所有列

SELECT * FROM 表名;

61.4:过滤列中相同的值

SELECT DISTINCT 列名 FROM 表名;

DISTINCT 关键字,顾名思义,它指示数据库只返回不同的值.

DISTINCT 关键字作用于所有的列,不仅仅是跟在其后的那一列。除非指定的两列的数据完全相同,否则所有的行都会被检索出来。

所有数据:

检索的两列数据完全一样

检索的两列数据有不一样的

6.5:限制检索结果

比如只想要检索某几行的数据(在不同的数据库中SQL语句不同,这里是mysql)

  • 使用limit关键字

SELECT 列名 FROM 表名 LIMIT 4 OFFSET 5;

这条语句的意思是返回从第 6 行起的 4行数据。第一个数字指查询几行数据,第二个数字是开始的行数。这个语句的输出是第6-9行数据。

原始数据

查询后

注意: 第一个被检索的行是第 0 行,而不是第 1 行。因此, LIMIT 1 OFFSET1 会检索第 2 行,而不是第 1 行。

可以将表中的行想象成数组,第一行是从0开始标记

  • 也可以有其他的形式:
SELECT * FROM table LIMIT 5,10;   // 检索记录行 6-15
5是指从第六行开始查询,查询十条记录。
  • 为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
这条我查询师报错了,没查到原因,先记录下来。
  • 如果只给定一个参数,它表示返回最大的记录行数目,换句话说,LIMIT n 等价于 LIMIT 0,n。

SELECT * FROM table LIMIT 5; //检索前 5 个记录行

7 排序检索

使用 ORDER BY 子句。 ORDER BY 子句取一个或多个列的名字,据此对输出进行排序。在指定一条 ORDER BY 子句时,应该保证它是 SELECT 语句中最后一条子句。如果它不是最后的子句,将会出现错误消息。

7.1:按一列排序

SELECT * FROM 表名 ORDER BY 列名;

7.2:按多列排序

SELECT * FROM 表名 ORDER BY 列名1,列名2,...;

仅在多个行具有相同的列名1 值时才对产品按列名2进行排序。如果 列名1列中所有的值都是唯一的,则不会按列名2排序。

7.3:根据相对位置进行排序

SELECT 列名1,列名2,... FROM 表名 ORDER BY 1,2;

SELECT 清单中指定的是选择列的相对位置而不是列名。当根据不出现在 SELECT清单中的列进行排序时,不能采用这项技术。

7.4:指定排序方向(升序还是降序)

默认的排序顺序是升序(从 A 到 Z)。还可以使用 ORDER BY 子句进行降序(从 Z 到 A)排序。为了进行降序排序,必须指定DESC 关键字

SELECT 列名1,列名2 FROM 表名 ORDER BU 列名1 DESC;

注意:如果想在多个列上进行降序排序,必须对每一列指定 DESC 关键字。

8 过滤数据

  • 检索所需数据需要指定搜索条件( search criteria),搜索条件也称为过滤条件( filter condition)。 在 SELECT 语句中,数据根据 WHERE 子句中指定的搜索条件进行过滤。WHERE 子句在表名( FROM 子句)之后给出, 。

  • 在同时使用 ORDER BY 和 WHERE 子句时,应该让 ORDER BY 位于WHERE 之后,否则将会产生错误 。

  • SQL 支持的所有条件操作符 如下:

  • 单引号用来限定字符串。如果将字符串类型的列进行比较,就需要限定引号。用来与数值列进行比较的值不用引号。

  • 空值检查。 确定值是否为 NULL,不能简单地检查是否= NULL。 SELECT 语句有一个特殊的 WHERE 子句,可用来检查具有 NULL 值的列。这个 WHERE 子句就是 IS NULL 子句 。

SELECT id 
FROM student 
WHERE name IS null;

9 高级过滤数据

学习如何组合 WHERE 子句以建立功能更强、更高级的搜索条件。以及如何使用 NOT 和 IN 操作符

9.1:组合WHERE语句

SQL 允许多个 WHERE 子句组合。即以 AND 子句或 OR 子句的方式使用。

  • AND 返回满足所有WHERE条件的 数据
  • OR 返回满足任意WHERE条件的数据

9.2:求值顺序

  • SQL优先处理 AND 操作符,然后处理 OR 操作符。

  • 使用圆括号对操作符进行明确分组 , 圆括号具有比 AND 或 OR 操作符更高的求值顺序

9.3:IN操作符

IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配。 IN 取一组由逗号分隔、括在圆括号中的合法值。

9.4:NOT操作符

NOT 操作的功能,是否定其后所跟的任何条件

10 汇总数据

10.1: 聚集函数

使用 SQL 聚集函数可以汇总数据。这样,就能够对行进行计数,计算和与平均数,不检索所有数据就获得最大值和最小值

  1. AVG()通过对表中行数计数并计算其列值之和,求得该列的平均值

    SELECT AVG(prod_price) 
    AS avg_price
    FROM Products;
    
  2. COUNT()函数进行计数。可利用 COUNT()确定表中行的数目符合特定条件的行的数目

    • 使用COUNT(*)表中行的数目进行计数,不管表列中包含的是空值( NULL)还是非空值。
    • 使用 COUNT(列名)对特定列中具有值的行进行计数, 忽略 NULL 值
  3. MAX()返回指定列中的最大值MAX()要求指定列名 , MAX()函数忽略列值为 NULL 的行。

  4. MIN()返回指定列的最小值MIN()要求指定列名 , MIN()函数忽略列值为 NULL 的行。

  5. SUM()用来返回指定列值的和(总计)。SUM()函数忽略列值为 NULL 的行。

10.2:组合聚集函数

SELECT 语句可根据需要包含多个聚集函数。

例如:

    SELECT COUNT(*) AS num_items,
    MIN(prod_price) AS price_min,
    MAX(prod_price) AS price_max,
    AVG(prod_price) AS price_avg
    FROM Products;

11 分组数据

11.1:为什么使用分组?

如果要返回每个供应商提供的产品数目,该怎么办?或者返回只提供一项产品的供应商的产品,或者返回提供 10 个以上产品的供应商的产品,怎么办? 这就是分组大显身手的时候了。使用分组可以将数据分为多个逻辑组对每个组进行聚集计算

11.2:使用GROUP BY进行分组。

输入▼
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;

输出▼
vend_id num_prods
------- ---------
BRS01      3
DLL01      4
FNG01      2

GROUP BY子句指示数据库按 vend_id排序并分组数据。

从输出中可以看到,供应商 BRS01 有 3 个产品,供应商 DLL01 有 4 个产品,而供应商 FNG01 有 2 个产品。

11.3:过滤分组

SQL 允许过滤分组,规定包括哪些分组,排除哪些分组

  • 使用HAVING进行分组过滤。

  • HAVING 非常类似于 WHERE。

  • 例如:

    输入▼
    SELECT cust_id, COUNT(*) AS orders
    FROM Orders
    GROUP BY cust_id
    HAVING COUNT(*) >= 2;
    
    输出▼
    cust_id    orders
    ---------- -----------
    1000000001   2
    

    它过滤 COUNT(*) >= 2(两个以上订单)的那些分组。

  • WHERE 在数据分组前进行过滤, HAVING 在数据分组后进行过滤。

11.4:SELECT子句的顺序

12 子查询

SQL 允许创建子查询( subquery),即嵌套在其他查询中的查询

12.1:使用子查询进行过滤

  • 在 SELECT 语句中,子查询总是从内向外处理

  • 作为子查询的 SELECT 语句只能查询单个列。企图检索多个列将返回 错误

12.2: 作为计算字段使用子查询

13 联结表

  • 创建联结表

    SELECT vend_name, prod_name, prod_price
    FROM Vendors, Products
    WHERE Vendors.vend_id = Products.vend_id;
    

    在引用的列可能出现歧义时,必须使用完全限定列名(用一个句点分隔表名和列名)。