mysql基本操作

启动MySQL服务器 net start MySQL80 或 mysqld --datadir="C:\ProgramData\MySQL\MySQL Server 8.0\Data"
停止MySQL服务器 net stop MySQL80

启动MySQL客户端 mysql -hlocalhost -uroot -p123456
quit 退出客户端

/*******************************************************************************************************/
数据库的操作:
展示所有数据库 SHOW DATABASES;

1.创建数据库
create database 数据库名;
2. create database if not exists 数据库名;
3. 切换数据库
a) use 数据库名;
b) 启动时直接切换数据库
mysql -h 主机名 -u 用户名 -p密码 数据库名;
4. 删除数据库 drop database 数据库名;

/*******************************************************************************************************/
表的操作:
1.展示当前数据库有哪些表
show tables;
SHOW TABLES FROM 数据库;
2. 创建表:
CREATE TABLE 表名 (
列名1 数据类型 [列的属性],
列名2 数据类型 [列的属性],
...
列名n 数据类型 [列的属性]
);
列名、数据类型、列的属性之间用空白字符分开就好,然后各个列的信息之间用逗号,分隔开。
比如:CREATE TABLE first_table (
first_column INT,
second_column VARCHAR(100)
);
3. 位建表语句添加注释
CREATE TABLE 表名(
各个列的信息...
) COMMENT '表的注释信息';
比如: CREATE TABLE first_table (
first_column INT,
second_column VARCHAR(100)
) COMMENT '第一个表';
4. 删除表
DROP TABLE 表1,表2,..., 表n;
5. 查看表结构
DESCRIBE 表名;
DESC 表名;
EXPLAIN 表名;
SHOW COLUMNS FROM 表名;
SHOW FIELDS FROM 表名;

SHOW CREATE TABLE 表名\G

6.修改表名
alter table 旧表名 rename to 新表名
rename table 旧表名1 to 新表名1,旧表名2 to 新表名2, .... 旧表名n to 新表名n;
7. 修改表名的时候指定数据库:
rename table 旧表名1 to 新数据库名.新表名1;
此时旧表名1就从当前数据库转移到新数据库中并重命名为新表名1
8. 增加列
ALTER TABLE 表名 ADD COLUMN 列名 数据类型 [列的属性];
9. 增加列到特定位置
a) 添加到第一列:
ALTER TABLE 表名 ADD COLUMN 列名 列的类型 [列的属性] FIRST;
b) 添加到指定列的后边:
ALTER TABLE 表名 ADD COLUMN 列名 列的类型 [列的属性] AFTER 指定列名;
10. 删除列
ALTER TABLE 表名 DROP COLUMN 列名;
11. 修改列信息
a) 方法一:
ALTER TABLE 表名 MODIFY 列名 新数据类型 [新属性];
注意:修改后的数据类型和属性一定要兼容表中现有的数据!
b) 方法二:
ALTER TABLE 表名 CHANGE 旧列名 新列名 新数据类型 [新属性];
12. 修改列排列位置
a) 将列设为表的第一列:
ALTER TABLE 表名 MODIFY 列名 列的类型 列的属性 FIRST;
b) 将列放到指定列的后边:
ALTER TABLE 表名 MODIFY 列名 列的类型 列的属性 AFTER 指定列名;
c) 一条语句中包含多个修改操作:
ALTER TABLE 表名 操作1, 操作2, ..., 操作n;

/*******************************************************************************************************/
列的属性

  1. 查看某个表里已经存储了哪些数据
    select * from 表名;
  2. 插入数据
    INSERT INTO 表名(列1, 列2, ...) VALUES(列1的值,列2的值, ...);
  3. 批量插入
    INSERT INTO 表名(列1,列2, ...) VAULES(列1的值,列2的值, ...), (列1的值,列2的值, ...), (列1的值,列2的值, ...), ...;
  4. 默认值
    insert插入记录时只指定部分的列,哪些没有被显式指定的列的值将被设置为NULL。我们可以在定义列的时候给该列增加一个DEFAULT属性:
    列名 列的类型 DEFAULT 默认值
    CREATE TABLE first_table (
    first_column INT,
    second_column VARCHAR(100) DEFAULT 'abc'
    );
  5. NOT NULL
    要求表中的某些列必须有值,不能存放NULL,可以这样定义:
    列名 列的类型 NOT NULL
    CREATE TABLE first_table (
    first_column INT NOT NULL,
    second_column VARCHAR(100) DEFAULT 'abc'
    );
  6. 候选键
    通过某个列或者某些列确定唯一的一条记录,称这些列为候选键。
    比如在学生信息表student_info中,可以通过学号确定一个唯一学生的信息,也可以通过身份证号来确定唯一的一条学生信息记录,
    所以学号和身份证号都可以作为学生信息表的候选键。
  7. 主键
    一个表可能有多个候选键,我们可以选择一个候选键作为表的主键。
    一个表最多只能有一个主键,主键的值不能重复,通过主键可以找到唯一的一条记录。
    a) 如果主键是单个列,可以直接在该列后面声明PRIMARY KEY:
    CREATE TABLE student_info (
    number INT PRIMARY KEY,
    name VARCHAR(5),
    sex ENUM('男', '女'),
    );
    b) 也可以把主键的声明单独提取出来:
    PRIMARY KEY (列名1, 列名2, ...)
    比如student_info的学号列声明为主键:
    CREATE TABLE student_info (
    number INT,
    name VARCHAR(5),
    PRIMARY KEY (number)
    );
    对于多个列的组合作为主键的情况,必须使用这种单独声明的形式:
    CREATE TABLE student_score (
    number INT,
    subject VARCHAR(30),
    score TINYINT,
    PRIMARY KEY (number, subject)
    );
  8. UNIQUE属性
    表明该列或者列组合的值是不允许重复的。
    列声明UNIQUE属性的方式有两种:
    a) 为单个列声明UNIQUE属性,可以直接在该列后填写UNIQUE或者UNIQUE KEY:
    CREATE TABLE student_info (
    number INT PRIMARY KEY,
    name VARCHAR(5),
    sex ENUM('男', '女'),
    id_number CHAR(18) UNIQUE,
    department VARCHAR(30),
    );
    b) 把UNIQUE属性的声明单独提取出来:
    UNIQUE [约束名称] (列名1, 列名2, ...) 或 UNIQUE KEY [约束名称] (列名1, 列名2, ...)
    把这个UNIQUE属性的声明放到列定义的后边就好了。
    一个表中可以为不同的列添加多个UNIQUE属性,也就是添加多个UNIQUE约束,每添加一个UNIQUE约束,我们就可以给它起个名,这也是上边的约束名称的含义。
    CREATE TABLE student_info (
    number INT PRIMARY KEY,
    name VARCHAR(5),
    sex ENUM('男', '女'),
    id_number CHAR(18),
    department VARCHAR(30),
    UNIQUE KEY uk_id_number (id_number)
    );
    8.主键和UNIQUE约束的区别
    a) 一张表中只能定义一个主键,却可以定义多个UNIQUE约束!
    b) 规定:主键列不允许存放NULL,而声明了UNIQUE属性的列可以存放NULL,而且NULL可以重复地出现在多条记录中!
  9. 外键
    插入到学生成绩表student_score中的number(学号)列中的值必须能在学生基本信息表student_info中的number列中找到,为了防止找不到的情况,mysql提供了外键约束:
    CONSTRAINT [外键名称] FOREIGN KEY(列1, 列2, ...) REFERENCES 父表名(父列1, 父列2, ...);
    如果A表中的某个列或者某些列依赖与B表中的某个列或者某些列,那么就称A表为子表,B表为父表。
    CREATE TABLE student_score (
    number INT,
    subject VARCHAR(30),
    score TINYINT,
    PRIMARY KEY (number, subject),
    CONSTRAINT FOREIGN KEY(number) REFERENCES student_info(number)
    );
    父表中被子表依赖的列或者列组合必须建立索引,如果该列或者列组合已经是主键或者有UNIQUE属性,那么它们也就被默认建立了索引。
  10. AUTO_INCREMENT属性: 自动增长
    一个表中的某个列的数据类型是整数类型或者浮点数类型,那么这个列可以设置AUTO_INCREMENT属性。新插入的记录在该列上的值就是当前该列的最大值加1后的值。
    定义:列名 列的类型 AUTO_INCREMENT
    CREATE TABLE first_table (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    first_column INT,
    second_column VARCHAR(100) DEFAULT 'abc'
    );
    注意:
    a) 一个表中最多有一个具有AUTO_INCREMENT属性的列。
    b) 具有AUTO_INCREMENT属性的列必须建立索引。
    c) 拥有AUTO_INCREMENT属性的列就不能再通过指定DEFAULT属性来指定默认值。
    d) 一般拥有AUTO_INCREMENT属性的列都是作为主键的属性,来自动生成唯一标识一条记录的主键值。
  11. 列的注释
    列末尾添加COMMENT语句来为列来添加注释
    CREATE TABLE first_table (
    id int UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键',
    first_column INT COMMENT '第一列',
    second_column VARCHAR(100) DEFAULT 'abc' COMMENT '第二列'
    ) COMMENT '第一个表';

/****************************************************************************************************************/
简单查询

  1. 查询单个列
    SELECT 列名 FROM 表名;
  2. 查询多个列
    SELECT 列名1, 列名2, ... 列名n FROM 表名;
  3. 查询所有列
    SELECT * FROM 表名;
  4. 查询结果去重
    a). 去除单列的重复结果
    SELECT DISTINCT 列名 FROM 表名;
    b). 去除多列的重复结果
    SELECT DISTINCT 列名1, 列名2, ... 列名n FROM 表名;
  5. 限制查询结果条数
    LIMIT [开始行,] 限制条数; --- 开始行默认从0开始
  6. 对查询结果排序
    a). 按照单个列的值进行排序
    ORDER BY 列名 [ASC|DESC] --- ASC:升序 DESC: 降序 默认值为ASC
    b). 按照多个列的值进行排序
    ORDER BY 列1 ASC|DESC, 列2 ASC|DESC ...

/****************************************************************************************************************/
带搜索条件的查询

  1. 简单搜索条件 WHERE
    SELECT * FROM student_info WHERE name = '范剑';

    操作符 示例 描述

    = a = b a等于b
    <>或者!= a <> b a不等于b
    < a < b a小于b
    <= a <= b a小于或等于b

      			a > b							a大于b
    

    = a >= b a大于或等于b
    BETWEEN a BETWEEN b AND c 满足 b <= a <= c
    NOT BETWEEN a NOT BETWEEN b AND c 不满足 b <= a <= c

    IN a IN (b1, b2, ...) a是b1, b2, ... 中的某一个
    NOT IN a NOT IN (b1, b2, ...) a不是b1, b2, ... 中的任意一个

    IS NULL a IS NULL a的值是NULL
    IS NOT NULL a IS NOT NULL a的值不是NULL

多个搜索条件的查询

  1. AND OR
    注意:AND操作符的优先级高于OR操作符

  2. 通配符
    操作符 示例 描述
    LIKE a LIKE b a匹配b
    NOT LIKE a NOT LIKE b a不匹配b

    a) %:代表任意一个字符串。0活N个
    b) _:代表任意一个字符。

/****************************************************************************************************************/
表达式和函数

表达式

  1. 算术操作符

    操作符 示例 描述
    / a / b 除法
    DIV a DIV b 除法,取商的整数部分
    % a % b 取余

  2. 比较操作符

    操作符 示例 描述
    = a = b a等于b
    <>或者!= a <> b a不等于b
    < a < b a小于b
    <= a <= b a小于或等于b

      				a > b							a大于b
    

    = a >= b a大于或等于b
    BETWEEN a BETWEEN b AND c 满足 b <= a <= c
    NOT BETWEEN a NOT BETWEEN b AND c 不满足 b <= a <= c
    IN a IN (b1, b2, ...) a是b1, b2, ... 中的某一个
    NOT IN a NOT IN (b1, b2, ...) a不是b1, b2, ... 中的任意一个
    IS NULL a IS NULL a的值是NULL
    IS NOT NULL a IS NOT NULL a的值不是NULL
    LIKE a LIKE b a匹配b
    NOT LIKE a NOT LIKE b a不匹配b

  3. 逻辑操作符

    操作符 示例 描述
    AND a AND b 只有a和b同时为真,表达式才为真
    OR a OR b 只要a或b有任意一个为真,表达式就为真
    XOR a XOR b a和b有且只有一个为真,表达式为真

  4. 表达式的使用
    SELECT number, subject, score + 100 AS score FROM student_score;

函数
名称 调用示例 示例结果 描述
LEFT LEFT('abc123', 3) abc 给定字符串从左边取指定长度的子串
RIGHT RIGHT('abc123', 3) 123 给定字符串从右边取指定长度的子串
LENGTH LENGTH('abc') 3 给定字符串的长度
LOWER LOWER('ABC') abc 给定字符串的小写格式
UPPER UPPER('abc') ABC 给定字符串的大写格式
LTRIM LTRIM(' abc') abc 给定字符串左边空格去除后的格式
RTRIM RTRIM('abc ') abc 给定字符串右边空格去除后的格式
SUBSTRING SUBSTRING('abc123', 2, 3) bc1 给定字符串从指定位置截取指定长度的子串
CONCAT CONCAT('abc', '123', 'xyz') abc123xyz 将给定的各个字符串拼接成一个新字符串

名称					调用示例										示例结果				描述
NOW						NOW()											2019-08-16 17:10:43		返回当前日期和时间
CURDATE					CURDATE()										2019-08-16				返回当前日期
CURTIME					CURTIME()										17:10:43				返回当前时间
DATE					DATE('2019-08-16 17:10:43')						2019-08-16				将给定日期和时间值的日期提取出来
DATE_ADD				DATE_ADD('2019-08-16 17:10:43', INTERVAL 2 DAY)	2019-08-18 17:10:43		将给定的日期和时间值添加指定的时间间隔
DATE_SUB				DATE_SUB('2019-08-16 17:10:43', INTERVAL 2 DAY)	2019-08-14 17:10:43		将给定的日期和时间值减去指定的时间间隔
DATEDIFF				DATEDIFF('2019-08-16', '2019-08-17');			-1						返回两个日期之间的天数(负数代表前一个参数代表的日期比较小)
DATE_FORMAT				DATE_FORMAT(NOW(),'%m-%d-%Y')					08-16-2019				用给定的格式显示日期和时间

在使用DATE_FORMAT函数时需要注意, 通过一些所谓的格式符来自定义日期和时间的显示格式: SELECT DATE_FORMAT(NOW(),'%b %d %Y %h:%i %p');

格式符			描述
%b				简写的月份名称(Jan、Feb、...、Dec)
%D				带有英文后缀的月份中的日期(0th、1st、2nd、...、31st)
%d				数字格式的月份中的日期(00、01、02、...、31)
%f				微秒(000000-999999)
%H				二十四小时制的小时 (00-23)
%h				十二小时制的小时 (01-12)
%i				数值格式的分钟(00-59)
%M				月份名(January、February、...、December)
%m				数值形式的月份(00-12)
%p				上午或下午(AM代表上午、PM代表下午)
%S				秒(00-59)
%s				秒(00-59)
%W				星期名(Sunday、Monday、...、Saturday)
%w				周内第几天 (0=星期日、1=星期一、 6=星期六)
%Y				4位数字形式的年(例如2019)
%y				2位数字形式的年(例如19)

聚集函数
函数名 描述
COUNT 返回某列的行数
MAX 返回某列的最大值
MIN 返回某列的最小值
SUM 返回某列值之和
AVG 返回某列的平均值

mysql> SELECT COUNT(*) FROM student_info;
+----------+
| COUNT(*) |
+----------+
|        6 |
+----------+
1 row in set (0.00 sec)

mysql> SELECT SUM(score) FROM student_score;
+------------+
| SUM(score) |
+------------+
|        585 |
+------------+
1 row in set (0.01 sec)

/****************************************************************************************************************/
分组查询
SELECT [DISTINCT] 查询列表 FROM 表名 [WHERE 布尔表达式] [GROUP BY 分组列表 ] [HAVING 分组过滤条件] [ORDER BY 排序列表] [LIMIT 开始行, 限制条数]

例1:根据成绩表分别统计出各门课的平均分
SELECT subject, AVG(score) FROM student_score GROUP BY subject;   // 只要我们在GROUP BY子句中添加上分组列就好了

例2:把分数低于60分的记录去掉之后再统计平均分
SELECT subject, AVG(score) FROM student_score WHERE score >= 60 GROUP BY subject;

例3:查询平均分大于73分的课程的平均分
SELECT subject, AVG(score) FROM student_score GROUP BY subject HAVING AVG(score) > 73;

例4:想按照各个学科的平均分从大到小降序排序
SELECT subject, AVG(score) AS avg_score FROM student_score GROUP BY subject ORDER BY avg_score DESC;

例5:对于student_info表来说,我们可以先按照department来进行分组,再按照major来继续分组,从而划分成更小的分组。
我们只需要在GROUP BY子句中把各个分组列依次写上,用逗号,分隔开就好了
SELECT department, major, COUNT(*) FROM student_info GROUP BY department, major;

***注意**例6:查看在student_score表的'母猪的产后护理'这门课的成绩中,有哪些超过了平均分的记录
mysql> SELECT * FROM student_score WHERE subject = '母猪的产后护理' AND score > AVG(score);
ERROR 1111 (HY000): Invalid use of group function
mysql>

聚集函数是用来对分组做数据统计的(如果没有GROUP BY语句那么意味着只有一个分组)。
而WHERE子句是以记录为单位来执行过滤操作的,在WHERE子句执行完成之后才会得到分组。
也就是说:***聚集函数不能放到WHERE子句中!!!***
正确写法在下一章节见。
	
注意:
	a). 如果分组列中含有NULL值,那么NULL也会作为一个独立的分组存在。
	b). 如果存在多个分组列,也就是嵌套分组,聚集函数将作用在最后的那个分组列上。
	c). 如果查询语句中存在WHERE子句和ORDER BY子句,那么GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。
	d). 非分组列不能单独出现在检索列表中(可以被放到聚集函数中)。
	e). GROUP BY子句后也可以跟随表达式(但不能是聚集函数)。
	f). WHERE子句在分组前进行过滤,作用于每一条记录,WHERE子句过滤掉的记录将不包括在分组中。而HAVING子句在数据分组后进行过滤,作用于整个分组。

/****************************************************************************************************************/
子查询:第二条查询语句的搜索条件是用到了第一条查询语句的查询结果。
小括号中的查询语句也被称为子查询或者内层查询,使用内层查询的结果作为搜索条件的操作数的查询称为外层查询。

  1. 标量子查询:子查询的结果只有一个值。

    SELECT * FROM student_score WHERE number = (SELECT number FROM student_info WHERE name = '杜琦燕');

  2. 列子查询:子查询语句的结果集中并不是一个单独的值,而是一个列,称之为列子查询。IN和NOT IN

    SELECT * FROM student_score WHERE number IN (SELECT number FROM student_info WHERE major = '计算机科学与工程');

  3. 行子查询: 子查询的结果集中最多只包含一条记录,而且这条记录中有超过一个列的数据。

  4. 表子查询: 查询结果集中包含多行多列

  5. EXISTS和NOT EXISTS子查询

    操作符 示例 描述
    EXISTS EXISTS (SELECT ...) 当子查询结果集不是空集时表达式为真
    NOT EXISTS NOT EXISTS (SELECT ...) 当子查询结果集是空集时表达式为真

    SELECT * FROM student_score WHERE EXISTS (SELECT * FROM student_info WHERE number = 20180108); // 其中子查询的意思是在student_info表中查找学号为20180108的学生信息,
    // 很显然并没有学号为20180108的学生,所以子查询的结果集是一个空集,于是EXISTS表达式的结果为FALSE,所以外层查询也就不查了,直接返回了一个Empty set

  6. 相关子查询: 在子查询的语句中引用到外层查询的值,这样的话子查询就不能当作一个独立的语句去执行,这种子查询被称为相关子查询

    例: 我们想查看一些学生的基本信息,但是前提是这些学生在student_score表中有成绩记录
    SELECT number, name, id_number, major FROM student_info WHERE EXISTS (SELECT * FROM student_score WHERE student_score.number = student_info.number);

  7. 对同一个表的子查询
    例: 查看在student_score表的'母猪的产后护理'这门课的成绩中,有哪些超过了平均分的记录
    错误写法: mysql> SELECT * FROM student_score WHERE subject = '母猪的产后护理' AND score > AVG(score);
    ERROR 1111 (HY000): Invalid use of group function
    mysql>
    聚集函数是用来对分组做数据统计的,如果没有GROUP BY语句那么意味着只有一个分组。WHERE子句是以记录为单位来执行过滤操作的,在WHERE子句执行完成之后才会得到分组。
    也就是说:聚集函数不能放到WHERE子句中!!!

    正确写法:SELECT * FROM student_score WHERE subject = '母猪的产后护理' AND score > (SELECT AVG(score) FROM student_score WHERE subject = '母猪的产后护理');

/****************************************************************************************************************/
连接查询:在一个查询语句结果集中展示多个表的信息的方式。
SELECT * FROM table1, table2;

  1. 内连接: 驱动表中的记录在被驱动表中找不到匹配的记录,该记录不会加入到最后的结果集。

  2. 外连接: 驱动表中的记录即使在被驱动表中没有匹配的记录,也仍然需要加入到结果集。

  3. 过滤条件语句:
    a) WHERE ———— 凡是不符合WHERE过滤条件的记录都不会被加入最后的结果集。
    b) on ———— 外连接中,若无法找到匹配ON过滤条件的记录,该记录仍然会被加入到结果集中,对应的被驱动表记录的各个字段使用NULL值填充。
    内连接中的WHERE子句和ON子句是等价的。
    一般情况下,我们都把只涉及单表的过滤条件放到WHERE子句中,把涉及两表的过滤条件都放到ON子句中。

  4. 左外连接: SELECT * FROM t1 LEFT [OUTER] JOIN t2 ON 连接条件 [WHERE 普通过滤条件];

  5. 右外连接: SELECT * FROM t1 RIGHT [OUTER] JOIN t2 ON 连接条件 [WHERE 普通过滤条件];

  6. 内连接1: SELECT * FROM t1 [INNER | CROSS] JOIN t2 [ON 连接条件] [WHERE 普通过滤条件];
    内连接2: SELECT * FROM t1, t2 [ON 连接条件] [WHERE 普通过滤条件];

     例:
     mysql> SELECT * FROM t1;
     +------+------+
     | m1   | n1   |
     +------+------+
     |    1 | a    |
     |    2 | b    |
     |    3 | c    |
     +------+------+
     3 rows in set (0.00 sec)
    
     mysql> SELECT * FROM t2;
     +------+------+
     | m2   | n2   |
     +------+------+
     |    2 | b    |
     |    3 | c    |
     |    4 | d    |
     +------+------+
     3 rows in set (0.00 sec)
    
     mysql> SELECT * FROM t1 INNER JOIN t2 ON t1.m1 = t2.m2;
     +------+------+------+------+
     | m1   | n1   | m2   | n2   |
     +------+------+------+------+
     |    2 | b    |    2 | b    |
     |    3 | c    |    3 | c    |
     +------+------+------+------+
     2 rows in set (0.00 sec)
    
     mysql> SELECT * FROM t1 LEFT JOIN t2 ON t1.m1 = t2.m2;
     +------+------+------+------+
     | m1   | n1   | m2   | n2   |
     +------+------+------+------+
     |    2 | b    |    2 | b    |
     |    3 | c    |    3 | c    |
     |    1 | a    | NULL | NULL |
     +------+------+------+------+
     3 rows in set (0.00 sec)
    
     mysql> SELECT * FROM t1 RIGHT JOIN t2 ON t1.m1 = t2.m2;
     +------+------+------+------+
     | m1   | n1   | m2   | n2   |
     +------+------+------+------+
     |    2 | b    |    2 | b    |
     |    3 | c    |    3 | c    |
     | NULL | NULL |    4 | d    |
     +------+------+------+------+
     3 rows in set (0.00 sec)
    
  7. 表的别名
    seletc * from t1 as tb1 inner join t2 as tb2 where tb1.number = tb2.number;

  8. 自连接: 对同一个表进行连接
    不允许FROM子句中出现相同的表名,自连接需要使用表的别名。
    SELECT * FROM t1 AS table1, t1 AS table2;

/****************************************************************************************************************/
组合查询

  1. 涉及单表的组合查询
    例1:or
    SELECT m1 FROM t1 WHERE m1 < 2 OR m1 > 2;

    例2:UNION
    SELECT m1 FROM t1 WHERE m1 < 2 UNION SELECT m1 FROM t1 WHERE m1 > 2;

    例3:UNION连接起来的各个查询语句有多个表达式也是可以的,只要数量相同就可以了
    SELECT m1, n1 FROM t1 WHERE m1 < 2 UNION SELECT m1, n1 FROM t1 WHERE m1 > 2;

  2. 涉及不同表的组合查询
    mysql> SELECT m1, n1 FROM t1 WHERE m1 < 2 UNION SELECT m2, n2 FROM t2 WHERE m2 > 2;
    +------+------+
    | m1 | n1 |
    +------+------+
    | 1 | a |
    | 3 | c |
    | 4 | d |
    +------+------+

  3. 使用UNION来合并多个查询的记录会默认过滤掉重复的记录。

/****************************************************************************************************************/
数据的插入、删除和更新

  1. 插入数据
    a) 插入完整记录
    insert into 表名 values(列1的值,列2的值, ..., 列n的值);

     例:INSERT INTO first_table VALUES(1, 'aaa');
    

    b) 指定记录的插入顺序
    insert into 表名(列2名, 列1名) values(列2的值, 列1的值);
    例:INSERT INTO first_table(first_column, second_column) VALUES (3, 'ccc');

    c) 批量插入记录
    INSERT INTO 表名(列名1, 列名2, ...) VALUES(列1的值, 列2的值), (列1的值, 列2的值), ...;

    d) 将查询的结果集插入表中
    INSERT INTO 表2(列a, 列b) select 表1的列1, 表2的列2 from 表1 [where查询语句)];

    e) INSERT IGNORE
    对于主键或UNIQUE约束的列,如果待插入的值与已有的记录重复,则忽略此次操作。

     例:INSERT IGNORE INTO first_table(first_column, second_column) VALUES(1, '哇哈哈');
    

    d) INSERT ... ON DUPLICATE KEY UPDATE ...
    对于主键或UNIQUE约束的列,如果待插入的值与已有的记录重复,则使用VALUES(列名)来引用待插入记录中对应列的值。

     例:INSERT INTO first_table (first_column, second_column) VALUES(2, '红牛'), (3, '橙汁儿') ON DUPLICATE KEY UPDATE second_column = VALUES(second_column);
     此例中VALUES(second_column)分别对应‘红牛’和‘橙汁儿’。
    
  2. 删除数据
    a) DELETE FROM 表名 [WHERE 表达式];
    例:DELETE FROM first_table WHERE first_column > 4;

    b) DELETE FROM 表名 ORDER BY 列名 [ASC|DESC] LIMIT 具体的数字。
    使用LIMIT子句来限制想要删除掉的记录数量,使用ORDER BY子句来指定符合条件的记录的删除顺序
    例:DELETE FROM first_table ORDER BY first_column DESC LIMIT 1;

  3. 更新数据
    a) UPDATE 表名 SET 列1=值1, 列2=值2, ..., 列n=值n [WHERE 布尔表达式];
    例:UPDATE first_table SET first_column = 5, second_column = '乳娃娃' WHERE first_column IS NULL;

    b) UPDATE 表名 SET 列1=值1, 列2=值2, ..., ORDER BY 列名 [ASC|DESC] LIMIT 具体的数字。
    例: UPDATE first_table SET second_column='爽歪歪' ORDER BY first_column DESC LIMIT 1;

node连接mysql时需要重新校验登录密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpassword';

posted @ 2021-11-14 18:12  webLion200  阅读(3)  评论(0编辑  收藏  举报