当前位置:   article > 正文

mysql常用操作语句(详细)_命令行退出mysql

命令行退出mysql

本文使用的 MySQL 版本:8.2.0

1.使用mysql

管理员权限下开启和关闭mysql服务

  1. net stop mysql
  2. net start mysql

cmd命令行进入mysql

mysql -uroot -p123456 //root用户名,123456密码,没密码则不输入

 cmd命令行退出mysql

exit // 或者 quit

创建数据库

  1. create database cAuth;
  2. // 更加规范的写法是关键词全大写, 以增强可读性
  3. CREATE DATABASE cAuth;

显示有哪些数据库

SHOW DATABASES;

进入某个数据库

USE cAuth;

创建表

  1. CREATE TABLE books(
  2. id int NOT NULL AUTO_INCREMENT,
  3. book_name varchar(50) NOT NULL,
  4. year int NOT NULL,
  5. introduction text NULL,
  6. PRIMARY KEY(id)
  7. );
  8. // 创建 books 表,
  9. // id 整型 不为空 自动递增
  10. // book_name 字符类型限制50字符 不为空
  11. // year 整型 不为空
  12. // introduction 文本类型 不为空
  13. // 主键为id

查看有那些表

SHOW TABLES;

查看某个表详情(或列信息)

  1. SHOW COLUMN FROM books;
  2. // 或者简写语法
  3. DESCRIBE books;
  4. // 或者
  5. DESC books;

2.select 查询

查询表的所有数据

SELECT * FROM books;

查询指定列数据

SELECT id,book_name FROM books;

列数据去重

  1. SELECT DISTINCT book_name FROM books;
  2. // 如果有两个重复的名称, 则只返回一条数据
  3. // DISTINCT 作用于所有指定的列, 而不是前置它的列, 只有指定的所有列数据都不同时才会过滤
  4. // 比如
  5. SELECT DISTINCT book_name,year FROM books;
  6. // 只有 book_name 和 year 都相同时才算重复数据

limit 限制返回数据数量

  1. SELECT * FROM books LIMIT 3; // 只返回 3 条数据
  2. // 等价于
  3. SELECT * FROM books LIMIT 0,3;
  4. // 等价于
  5. SELECT * FROM books LIMIT 3 OFFSET 0; // 表示从第1行开始返回3行数据
  6. // 返回下一个 3 条数据
  7. SELECT * FROM books LIMIT 3,3; // 代表从第4行开始返回3条数据
  8. // 第一个3代表开始位置, 第二个3代表行数

使用完全限定的表名

  1. SELECT books.book_name FROM books;
  2. // 除了列能限定外, 表名也可以限定
  3. SELECT books.book_name FROM cAuth.books;

3.数据排序

基础排序

  1. SELECT * FROM books ORDER BY year; // 默认升序排列
  2. // 除了按单列排序外, 也可以指定多列进行排序
  3. SELECT * FROM books ORDER BY year,book_name;
  4. // 这里会先按year进行排序, 只有year相同的, 其内部才会按book_name排序

指定排序方向

  1. // 升序
  2. SELECT * FROM books ORDER BY year ASC; // 默认就是升序, ASC 可不写
  3. // 降序
  4. SELECT * FROM books ORDER BY year DESC;
  5. // 多列字段
  6. SELECT * FROM books ORDER BY year DESC,book_name; // year降序,book_name升序

获取最大/最小值

  1. SELECT year FROM books ORDER BY year DESC LIMIT 1;
  2. // 返回最大year, 注意: LIMIT 子句应在 ORDER BY 之后

4.where 条件过滤

使用 where

  1. SELECT * FROM books WHERE book_name='book1';
  2. // 注意: mysql 在执行匹配时是不区分大小写的

where 子句操作符

操作符描述
=等于
<>不等于
!=不等于
<小于
<=小于等于
>大于
>=大于等于
BETWEEN

在指定的两个值之间

范围值查询

  1. SELECT * FROM books WHERE year BETWEEN 2020 AND 2022;
  2. // 返回year20202022的书籍, 包括开始值和结束值

空值查询

  1. SELECT * FROM books WHERE book_name IS NULL;
  2. // 返回名称为null的数据

and 与 or 与 in

  1. // and 所有条件都要满足
  2. SELECT * FROM books WHERE book_name='book1' AND year=2020;
  3. // or 至少满足条件之一
  4. SELECT * FROM books WHERE book_name='book1' OR year=2020;
  5. // and 的优先级高于 or, 查询时注意是否需要加括号
  6. SELECT * FROM books WHERE (year=2020 OR year=2021) AND book_name='book1';
  7. // 上面的语句用 in 改写, 其效果是等价的
  8. SELECT * FROM books WHERE year IN (2020,2021) AND book_name='book1';

not 操作符

  1. SELECT * FROM books WHERE year NOT IN (2020,2021); // 返回除2020,2021之外的数据
  2. // mysql 支持使用NOTINBETWEENEXISTS子句取反

5.通配符过滤

百分号(%)通配符

  1. // %通配符可以匹配0个、1个或多个字符
  2. // 返回以book开头的数据
  3. SELECT * FROM books WHERE book_name LIKE 'book%';
  4. // %通配符可以写在任意位置, 也可以多个使用, 以下语句代表包含 book 的数据
  5. SELECT * FROM books WHERE book_name LIKE '%book%';

下划线(_)通配符

  1. // _通配符与%通配符作用一样, 但只能匹配一个字符而不是多个, 也不是0
  2. // 返回以book开头且其后跟随任意一个字符的数据, 如 book1
  3. SELECT * FROM books WHERE book_name LIKE 'book_';

注意:不要过度使用通配符,若其他操作符能达到相同目的,则优先使用其他操作符。

6.正则表达式过滤

基本字符匹配

  1. // 匹配包含book的数据, 不区分大小写
  2. SELECT * FROM books WHERE book_name REGEXP 'book';
  3. // MySQL中正则表达式匹配(从版本3.23.4后)不区分大小写, 这里可以用BINARY进行区分
  4. SELECT * FROM books WHERE book_name REGEXP BINARY 'book1';
  5. // BINARY8.0.0版本后会报错
  6. // .匹配任意一个字符
  7. SELECT * FROM books WHERE book_name REGEXP 'book.';
  8. // 返回book开头且后面跟任意一个字符的数据

or匹配

SELECT * FROM books WHERE book_name REGEXP 'book1|book2';

匹配多个字符之一

  1. // 返回 book1,book2
  2. SELECT * FROM books WHERE book_name REGEXP 'book[12]';
  3. // 返回 不包括book1,book2
  4. SELECT * FROM books WHRER book_name REGEXP 'book[^12]';

匹配范围

  1. // [0-9]匹配任意数字, [a-z]匹配任意字符
  2. SELECT * FROM books WHERE book_name REGEXP 'book[0-9]';

匹配特殊字符

  1. // 匹配. 使用 \\ 进行转义
  2. SELECT * FROM books WHERE book_name REGEXP '\\.';

匹配多个实列

  1. // 返回 book 后跟12个数字的数据
  2. SELECT * FROM books WHERE book_name REGEXP 'book[0-9]{1,2}';

 定位符

  1. // 返回以book开始的数据
  2. SELECT * FROM books WHERE book_name REGEXP '^book';

 7.创建计算字段

拼接字段 Concat()

  1. // 将年份和书名拼接, 如: 《book1》--2020
  2. SELECT Concat('《',book_name,'》','--',year) FROM books;
  3. // 以上查询结果没得列名, 可以使用 AS 关键字声明别名
  4. SELECT Concat('《',book_name,'》','--',year) AS book_detail FROM books;

执行算数计算

  1. // 将数量和单价相乘得到每本书总价
  2. SELECT book_name,quantity*price AS total_price FROM books;
  3. // mysql 支持加减乘除

8.使用数据处理函数

文本处理函数

  1. // RTrim()处理右侧空格, LTrim()处理左侧空格, Trim()处理两侧空格
  2. SELECT Trim(book_name) FROM books;

日期和时间处理函数

  1. // 匹配日期
  2. SELECT * FROM books WHERE Date(create_date)='2020-10-10';
  3. // 查询2020-09月的数据
  4. SELECT * FROM books WHERE Date(create_date)
  5. BETWEEN '2020-09-01' AND '2020-09-30';
  6. // 或者
  7. SELECT * FROM books WHERE Year(create_date)='2020' AND Month(create_date)=9;

数值处理函数

9.数据汇总

聚集函数

  1. // 返回平均价格
  2. SELECT AVG(price) AS avg_price FROM books;
  3. // 返回平均价格, 过滤掉相同的价格再汇总进行平均
  4. SELECT AVG(DISTINCT price) AS avg_price FROM books;
  5. // 返回数据总条数
  6. SELECT COUNT(*) AS num_books FROM books;
  7. // 返回指定列的总条数, 会忽略 Null
  8. SELECT COUNT(book_name) AS num FROM books;

10.分组数据

创建分组

  1. // 查看每个作者有几本书
  2. SELECT author,COUNT(*) AS num_books FROM books GROUP BY author;

过滤分组

  1. // where 过滤行, having 过滤分组
  2. // having 支持所有 where 操作符
  3. // 返回有两本及以上书的作者数据
  4. SELECT author,COUNT(*) AS num_books FROM books
  5. GROUP BY author HAVING COUNT(*)>=2;
  6. // 返回2020年出版且作者出版了2本及以上的数据
  7. SELECT author,COUNT(*) AS num_books FROM books WHERE year=2020
  8. GROUP BY author HAVING COUNT(*)>=2;

分组与排序

  1. // 返回作者书籍的平均售价, 且按平均价格倒序排序
  2. SELECT author,AVG(price) AS avg_price FROM books
  3. GROUP BY author ORDER BY avg_price DESC;

select 子句顺序

  1. // 顺序如下
  2. SELECT
  3. FROM
  4. WHERE // 过滤行
  5. GROUP BY // 分组
  6. HAVING // 过滤组
  7. ORDER BY // 排序
  8. LIMIT

11.子查询

子查询,即嵌套在其他查询中的查询。

子查询过滤

  1. // 问题: 已知书籍名称, 查询购买此书籍的用户信息
  2. // 注: 书籍表(books), 用户表(users), 订单表(orders)。
  3. // 订单表中表中包含user_id和book_id
  4. // 问题可以通过以下3步进行拆分
  5. // 1.通过书籍名称查询书籍id, 查询结果为 1
  6. SELECT id FROM books WHERE book_name='book1';
  7. // 2.通过书籍id=1, 查询用户id, 查询结果为 1,3
  8. SELECT user_id FROM orders WHERE book_id IN(1);
  9. // 3.通过用户id=1,3, 查询用户详情
  10. SELECT * FROM users WHERE id IN(1,3);
  11. // 使用子查询
  12. SELECT * FROM users WHERE id IN(
  13. SELECT user_id FROM orders WHERE book_id IN(
  14. SELECT id FROM books WHERE book_name='book1'
  15. )
  16. );

作为计算字段使用子查询

  1. // 显示用户表中每个用户的订单总数
  2. SELECT name,
  3. (SELECT COUNT(*) FROM orders WHERE orders.user_id=users.id) AS orders_num
  4. FROM users;

12.联结表

内部联结或等值联结

  1. // 将出版商表(publishers)和书籍表(books)进行联结查询
  2. SELECT book_name,publisher_name FROM books,publishers
  3. WHERE books.publisher_id=publishers.id;
  4. // 以上联结为等值联结或内部联结, 可以用以下语法明确指定其类型, 其返回结果是相同的
  5. SELECT book_name,publisher_name FROM books INNER JOIN publishers
  6. ON books.publisher_id=publishers.id;

自联结

  1. // 查询书籍 book1 对应出版商出版的所有书籍. 这里使用 AS 给表设置别名
  2. SELECT b2.book_name FROM books AS b1,books AS b2
  3. WHERE b1.publisher_id=b2.publisher_id
  4. AND b1.book_name='book1';

外部联结

  1. // 问题: 查询所有书籍的出版商信息, 没有出版商的返回null
  2. // 使用内部联结是没法返回书籍出版商为null的数据
  3. SELECT book_name,publisher_name FROM books INNER JOIN publishers
  4. ON books.publisher_id=publishers.id;
  5. // 使用外部联结则可以返回书籍出版商为null的数据
  6. SELECT book_name,publisher_name FROM books LEFT OUTER JOIN publishers
  7. ON books.publisher_id=publishers.id;
  8. // 使用OUTER JOIN语法时,必须使用RIGHTLEFT关键字指定包括其所有行的表
  9. // RIGHT指出的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表

带聚集函数的联结

  1. // 问题: 查询所有用户的订单数量
  2. SELECT username,COUNT(orders.id) AS order_num
  3. FROM users LEFT OUTER JOIN orders
  4. ON users.id=orders.user_id
  5. GROUP BY users.id;

13.组合查询(也称并查询或复合查询)

使用UNION

  1. // 问题: 返回价格小于10, 或者出版商id为2的书籍数据
  2. // 首先想到使用 whereor 进行条件查询
  3. SELECT * FROM books WHERE price<10 OR publisher_id=2;
  4. // 使用 UNION 关键字将两个查询语句组合, 其返回结果是相同的
  5. SELECT * FROM books WHERE price<10
  6. UNION
  7. SELECT * FROM books WHERE publisher_id=2;
  8. // UNION前一句语句单独执行会返回3条数据, 后一句语句会返回2条数据,
  9. // 最终返回了4条数据而不是5条数据, 是因为过滤了重复的行,
  10. // 使用UNION ALL可以取消过滤, 使其返回所有数据, 这是WHERE所子句不能实现的功能
  11. // 在这个简单例子中, 使用UNION比使用WHERE子句更为复杂, 但对于更复杂的过滤条件,
  12. // 或者从多个表(而不是单个表)中检索数据的情形,使用UNION可能会使处理更简单

UNION规则

  • UNION 必须由两条或两条以上的 SELECT语句组成,语句之间用关键字 UNION 分隔;
  • UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出);
  • 列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型(例如,不同的数值类型或不同的日期类型)

组合查询结果排序

  1. //UNION组合查询时,只能使用一条ORDER BY子句,
  2. // 它必须出现在最后一条SELECT语句之后
  3. SELECT * FROM books WHERE price<10
  4. UNION
  5. SELECT * FROM books WHERE publisher_id=2
  6. ORDER BY id DESC;

14.全文本搜索

启用全文搜索

  1. CREATE TABLE books(
  2. id int NOT NULL AUTO_INCREMENT,
  3. book_name varchar(50) NOT NULL,
  4. year int NOT NULL,
  5. introduction text NULL,
  6. PRIMARY KEY(id),
  7. FULLTEXT(introduction)
  8. );
  9. // 使用 FULLTEXT(introduction) 来设置索引

进行文本搜索

  1. SELECT * FROM books WHERE Match(introduction) Against('mysql');
  2. // Match()指定被搜索的列,Against()指定要使用的搜索表达式
  3. // 返回结果不区分大小写
  4. // 注: 不具有词分隔符(包括日语和汉语)的语言不能恰当地返回全文本搜索结果

15.插入数据

插入单行

  1. INSERT INTO users VALUES(null, 'Bob'); // 对应字段 id, username
  2. // 以上语句依赖特定的字段顺序, 并不安全, 更安全的写法如下
  3. INSERT INTO users(username) VALUES('Bob');
  4. // 这里可以省略不必要的字段, 比如id

插入多行

INSET INTO users(username) VALUES('Tom'),('Jerry');

插入检索出的数据

  1. INSERT INTO users(username) SELECT username FROM users2;
  2. // 这里的列名不一定要相同, 只要值是对应的就行

16.更新和删除数据

更新数据

  1. UPDATE users SET username='Dell',age=18 WHERE id=8;
  2. // 若不加 where 子句将修改所有行

删除数据

  1. DELETE FROM users WHERE id=8;
  2. // 若不加 where 子句将删除所有行

17.创建和操作表

创建表

  1. CREATE TABLE books(
  2. id int NOT NULL AUTO_INCREMENT,
  3. book_name varchar(50) NOT NULL,
  4. year int NOT NULL,
  5. quantity int NOT NULL DEFAULT 100,
  6. introduction text NULL,
  7. PRIMARY KEY(id)
  8. ) ENGINE=InnoDB;
  9. // AUTO_INCREMENT 代表自动增加, 每个表只能有一个字段可以设置 AUTO_INCREMENT
  10. // DEFAULT 设置默认值
  11. // PRIMARY KEY 定义主键, 主键不能为 NULL 其是唯一值。主键可以定义多个
  12. // ENGINE 设置引擎类型

更新表

  1. // 添加 age 列
  2. ALTER TABLE users
  3. ADD age int;
  4. // 删除 age 列
  5. ALTER TABLE users
  6. DROP COLUMN age;
  7. // 定义外键, 给 orders 表的 user_id 字段定义一个名为 fk_orders_users 的外键,
  8. // 其引用 users 表的 id 字段
  9. ALTER TABLE orders
  10. ADD CONSTRAINT fk_orders_users
  11. FOREIGN KEY(user_id) REFERENCES users(id);

删除表

DROP TABLE test;

重命名表

  1. // 将 test 重命名为 test2;
  2. RENAME TABLE test TO test2;

18.视图

视图概念

  1. // 视图是虚拟的表, 不存储数据
  2. // 一个联结查询
  3. SELECT order_number,username,book_name
  4. FROM orders,users,books
  5. WHERE orders.user_id=users.id AND orders.book_id=books.id;
  6. // 如果将以上查询包装成虚拟的表 ordersdetail, 则可以简化查询为
  7. SELECT * FROM ordersdetail;
  8. // 视图的一大作用就是简化复杂的 sql,
  9. // 视图名称不能与其他视图和表重名

使用视图

  1. // 使用 CREATE VIEW 创建视图;
  2. // 使用 SHOW CREATE VIEW viewname 查看创建视图的语句;
  3. // 使用 DROP VIEW viewname 删除视图;
  4. // 使用 CREATE OR REPLACE VIEW 更新视图。
  5. // 创建视图
  6. CREATE VIEW ordersdetail AS
  7. SELECT order_number,username,book_name
  8. FROM orders,users,books
  9. WHERE orders.user_id=users.id AND orders.book_id=books.id;
  10. // 使用视图
  11. SELECT * FROM ordersdetail;

19.存储过程

使用存储过程

  1. // 存储过程为一条或多条语句的集合
  2. // 创建存储过程
  3. // 创建一个名为 booksPriceAvg 的存储过程, BEGIN END 之间为存储过程体
  4. CREATE PROCEDURE booksPriceAvg()
  5. BEGIN
  6. SELECT AVG(price) AS price_avg FROM books;
  7. END;
  8. // 使用存储过程
  9. CALL booksPriceAvg();
  10. // 删除存储过程, 存储过程不存在将报错
  11. DROP PROCEDURE booksPriceAvg;
  12. // 删除存储过程且不报错
  13. DROP PROCEDURE IF EXISTS booksPriceAvg;

使用参数

  1. CREATE PROCEDURE booksPrice(
  2. OUT pMin DECIMAL(10,2),
  3. OUT pMax DECIMAL(10,2),
  4. OUT pAvg DECIMAL(10,2)
  5. )
  6. BEGIN
  7. SELECT MIN(price) INTO pMin FROM books;
  8. SELECT MAX(price) INTO pMax FROM books;
  9. SELECT AVG(price) INTO pAvg FROM books;
  10. END;
  11. // 这里 OUT 关键字指出相应的参数从存储过程中返回的值,
  12. // OUT(从存储过程中传出), IN(传递给存储过程),INOUT(对存储过程传入传出)
  13. // DECIMAL(10,2) 代表数值长度10位, 2位小数。这里根据 price 字段来定义的
  14. // INTO 指定保存到相应变量
  15. // 使用3个变量调用存储过程
  16. CALL booksPrice(@priceMin,@priceMax,@priceAvg);
  17. // 变量用@定义. 变量为内存中的特定位置, 用来存储临时数据
  18. // 查询变量值
  19. SELECT @priceMin,@priceMax,@priceAvg;
  20. // ----- 使用 IN 参数 -----
  21. CREATE PROCEDURE booksSum(
  22. IN bookId INT,
  23. OUT bookSumPrice DECIMAL(10,2)
  24. )
  25. BEGIN
  26. --注释
  27. SELECT SUM(price*quantity) FROM books
  28. WHERE id=bookId INTO bookSumPrice;
  29. END;
  30. CALL booksSum(1,@bookSumPrice);
  31. SELECT @bookSumPrice;

20.游标

使用游标

// 游标只能用于存储过程

21.触发器 

基础概念

  1. // 以下语句支持触发器
  2. DELETE;
  3. INSERT;
  4. UPDATE;

创建触发器

  1. // 问: 创建一个触发器, 添加一行书籍信息时返回添加行的id
  2. // 创建一个名为 addbook 的触发器, 在 books 表插入数据之后执行,
  3. // FOR EACH ROW 对每个插入行都执行之后的语句
  4. // NEW 为虚拟表, 可以访问被插入的行(对应的 OLD 虚拟表, 可以访问被删除的行)
  5. // 将 id 保存到变量 lastInsertId 中
  6. CREATE TRIGGER addbook AFTER INSERT ON books
  7. FOR EACH ROW SELECT NEW.id INTO @lastInsertId;
  8. // 插入数据
  9. INSERT INTO books(book_name,`year`,price,quantity)
  10. VALUES('哈哈cccdd',2020,12,100);
  11. // 拿取新增行的id
  12. SELECT @lastInsertId;

删除触发器

DROP TRIGGER addbook;

22.事务处理

基础概念

  1. // 事务处理是一种机制,用来管理必须成批执行的MySQL操作,
  2. // 以保证数据库不包含不完整的操作结果。

相关术语:

  • 事务(transaction,指一组SQL语句;
  • 回退(rollback,指撤销指定SQL语句;
  • 提交(commit,指将未存储的SQL语句结果写入数据库表;
  • 保留点(savepoint,指事务处理中设置的临时占位符,可以对它回退。

使用回退

  1. SELECT * FROM test;
  2. START TRANSACTION;
  3. DELETE FROM test;
  4. SELECT * FROM test;
  5. ROLLBACK;
  6. SELECT * FROM test;
  7. // ROLLBACK 可以回退 START TRANSACTION 之后的语句
  8. // 可以回退的语句包括 INSERTUPDATEDELETE

使用提交

  1. START TRANSACTION;
  2. DELETE FROM users WHERE id=10;
  3. DELETE FROM books WHERE id=9;
  4. COMMIT;
  5. // 只有两条删除语句都成功执行时, 才能提交
  6. // 如果第一条执行成功, 第二条执行失败, 则都不会删除

使用保留点

  1. // 在复杂的事务中, 可能需要部分回退, 这时需要用到保留点
  2. START TRANSACTION;
  3. DELETE FROM users WHERE id=9;
  4. SAVEPOINT delete1;
  5. DELETE FROM books WHERE id=8;
  6. ROLLBACK TO SAVEPOINT delete1;
  7. COMMIT;
  8. // 第二条删除语句将会回退

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/487077
推荐阅读
相关标签
  

闽ICP备14008679号