https://www.cnblogs.com/chentianwei/p/8093748.html

mysql增加了大量语法,以前没有接触过。比如

create function

begin..end

力扣的题:https://leetcode-cn.com/problems/nth-highest-salary/solution/dui-chuan-ru-de-zhi-de-he-fa-xing-jin-xing-pan-dua/

limit的写法:

查看help select 发现,[LIMIT {[offset,] row_count | row_count OFFSET offset}] 有2种写法,前面的是简化版的。

⚠️被检索的第一个行其实是第0行。所以limit 1 offset 1表示返回第2行记录。

begin..end

mysql> mysql> help begin end
Name: 'BEGIN END'
Description:
Syntax:
[begin_label:] BEGIN
[statement_list]
END [end_label]

用于组合声明。可嵌套。

declare variable

mysql> help DECLARE VARIABLE
Name: 'DECLARE VARIABLE'
Description:
Syntax:
DECLARE var_name [, var_name] ... type [DEFAULT value]

声明本地变量。

default 子句,是提供默认值。如果不写,则值为null

例子:DECLARE P INT;

set

分配值给变量。

mysql> help set
Name: 'SET'
Description:
Syntax:
SET variable = expr [, variable = expr] ... variable: {
user_var_name
| param_name
| local_var_name
| {GLOBAL | @@GLOBAL.} system_var_name
| {PERSIST | @@PERSIST.} system_var_name
| {PERSIST_ONLY | @@PERSIST_ONLY.} system_var_name
| [SESSION | @@SESSION. | @@] system_var_name
}

通配符号和like操作符号

like操作符

expr LIKE pat [ESCAPE 'escape_char']
mysql> SELECT 'David!' LIKE 'David_';
-> 1
mysql> SELECT 'David!' LIKE '%D%v%';
-> 1

%, 匹配任意个数量的字符,包括0个。但不匹配null。

_,  匹配任意一个字符。

[] 通配符,代表一个字符集合,匹配字符集合内的一个字符。

此通配符可以用前缀字符^(脱字号)来否定。


函数

数据库管理系统dbms支持函数。

但每个语言的内建函数都有区别。

Mysql:

使用具体看help functions后列出的list,看string Functions。里面有所有的内建函数。

也可以看网页上的文档,help <item>信息的最后给出了url地址。

trim()函数 去掉左右的空格, 还有ltrim, rtrim。

substring(str, pos) 提取从pos位置开始的字符串。str是从1开始计算,和ruby, python不一样。

left(str, len):返回左边的len个字符。

length(str): 返回长度。

lower, upper, 改变大小写

soundex()函数:

(wiki)Soundex是一种语音算法,利用英文字的读音计算近似值,值由四个字符构成,第一个字符为英文字母,后三个为数字。在拼音文字中有时会有会念但不能拼出正确字的情形,可用Soundex做类似模糊匹配的效果。例如Knuth和Kant二个字符串,它们的Soundex值都是“K530”。

curdate()

abs(), cos(), sin(),

是否使用自定义函数,看需求。


聚合函数

count

count(*)对表中行的数据进行计算,包括null。

count(column)计算特点行,忽略null

mysql> SELECT student.student_name,COUNT(*)
FROM student,course
WHERE student.student_id=course.student_id
GROUP BY student_name;

组合聚合函数

这条select语句执行了4个聚合计算,返回4个值。

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;

分组group by

 select cust_id count(*) as orders from Orders group by cust_id having count(*) >= 2

使用 GROUP BY {col_name | expr | position}, 进行分组。

having类似where, 用于添加一些对分组后数据的筛选规则。

  • where的筛选是针对行的。所以不能用聚合函数。
  • having是配合group by进行分组的。可以用聚合函数。

⚠️:group by 分组后的数据如果需要再排序还要用 order by.

select 子句有固定的顺序:select from where group by having order by


MYsql支持多层嵌套查询。

但是:

  • 子查询语句只能查询单个列。
  • 使用子查询,对大数据的查询效能较低。

子查询的方式有2种:

  • 用于过滤,在where子句中使用。
  • 用于计算字段:
SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id = Customers.cust_id) AS orders
FROM Customers
ORDER BY cust_name;

orders是一个计算字段,本例子该计算字段中的子查询执行的次数是外部select查询得到的记录数。

⚠️注意:这种方法并不高效,其实可以使用连接表的方式代替。


连接表

表和表之间的关联使用主key,外key来连接的。把一堆数据根据其数据特性或类型及相关关系分为多个表格,并用key进行连接,是一种数据库的 设计模式,叫做关系型数据库。

连接表:

  1. from子句中加上要连接的表的名字用逗号隔开,然后在where子句中用 key进行连接。⚠️这种连接,叫做内连接。
  2. 另一种是使用join..on关键字。包括inner join, left join. right join。后2者也叫外连接
select * from Vendors inner join Products on Vendors.vend_id = Products.vend_id

注意:⚠️可以进行多表连接。使用where。


组合查询 union

http://www.mysqltutorial.org/sql-union-mysql.aspx

SELECT ...
UNION [ALL | DISTINCT] SELECT ...
[UNION [ALL | DISTINCT] SELECT ...] UNION is used to combine the result from multiple SELECT statements
into a single result set. URL: https://dev.mysql.com/doc/refman/8.0/en/union.html

union把2个select语句的查询结果联合起来:

  • column的数量和顺序,所有的select声明必须一样。
  • column的数据类型,必须一样或兼容。

(⚠️以上两点注意,可以见链接的实例costumer表和employee表的union,最后返回的表的表头的列名使用第一个select声明的列的名字)

  • 一般用于较复杂的过滤条件,或从多个表中检索数据。
  • UNION默认使用 distinct,过滤掉重复的记录。
  • order by 只能出现在整个语句的最后,即只出现一次。

UNiON VS join

union是垂直连接行,join是水平连接行。


数据的操作insert, update, delete

insert

  • 插入完整的行 insert [into] 表名  values(字段值1,字段值2, ...)  ⚠️values的参数数量必须和表的列一一对应。
  • 插入行的一部分 insert [into] 表名(字段名,...) values(字段值1, 字段值2, ...)
  • 插入select的结果。
  • 还可以多行插入:insert [into] 表名(字段名,...) values(字段值1, 字段值2, ...), (字段值1, 字段值2, ...)

⚠️注意如果一个字段有限制:auto_increment,那么字段值可以输入0,null或default.

select * from 表名 into 外部文件|变量

update

update 表名 set 列名=value where 条件。

delete from 表名 where子句。

删除数据前,做表的完全备份。或者先查询要删除的数据,然后存入一个新的表。然后再在原表删除。最好是双人检查制度。

另外,最好配合使用transaction来进行删除操作。

这是物理删除,彻底从数据库删除数据。

还有一种是逻辑删除,并不真的删除一条记录,只是用一个字段的值表示一条记录不再被使用,以便未来会恢复这条数据。使用s数据类型bit


create view创建一个视图

视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

说白了就是保存一条select语句。类似于一个方法/函数。

优点:

  1. 提高了重用性,就像一个函数。
  2. 对数据库重构,却不影响程序的运行。
  3. 提高了安全性能,可以对不同的用户。无需把原表的权限给某个用户,只给这个用户查看视图的权限。
    • 这是因为视图只是一条语句。无法修改原表。
  4. 让数据更加清晰
  • 创建:create view 名字 as select语句
  • 查看视图: show tables;  select * from 视图名字;
  • 删除视图:   drop view 视图名字

管理事物处理

批量处理,发生意外恢复到处理前的状态。

特点:

  • 原子性(Atomicity)     一个事务就是一个最小单元,不可再分割,这个事务的内部要不就全部完成,要不就保持最初的状态。
  • 一致性(Consistency)  内部语句必须完全执行,如果中途出问题,就回退到最开始的状态。
  • 隔离性(Isolation)           一个事务提交前,其他用户不能修改事务正在处理的表,即事务锁定了当前操作的表。
  • 持久性(Durability)         事务被提交后,对数据库永久改变。

语法关键字:

  • transaction
  • rollback: 可以回退insert, update, delete。
  • commit
START TRANSACTION
[transaction_characteristic [, transaction_characteristic] ...] transaction_characteristic: {
WITH CONSISTENT SNAPSHOT
| READ WRITE
| READ ONLY
} BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET autocommit = {0 | 1} 这些声明提供对transaction的控制流程的支持: o START TRANSACTION or BEGIN start a new transaction. o COMMIT commits the current transaction, making its changes permanent. 永久改变 o ROLLBACK rolls back the current transaction, canceling its changes. 可以撤销之前的commit o SET autocommit disables or enables the default autocommit mode for
the current session.

开始事务:

start transaction或begin

提交:

commit

回滚:

rollback

⚠️:

1. Mysql有很多引擎,但只有innodb引擎支持事务处理。

2.Python操作数据库,默认开启transaction.

3.Python对数据库进行增删改的时候,需要手动commit。

4.使用终端操作数据库(也就是mysql的客户端)的时候,也默认开启事务。回车时自动commit。


储存过程(简介)stored procedure

http://www.mysqltutorial.org/mysql-stored-procedure-tutorial.aspx

Mysql5后的版本才支持。包括储存过程和储存函数

这是一个很大的模块。我目前的理解就是,面向过程的编程方法。

Section 1. Stored procedure basics

  • 包括如何声明变量:使用declare关键字

Section 2. Conditional Statements

  • if和case声明

Section 3. Loops

Section 4. Error Handling

Section 5. Cursors

Section 6. Stored Functions

Section 7. Stored Program Security

执行存储过程:

EXECUTE stmt_name
[USING @var_name [, @var_name] ...]

创建存储过程

CREATE
[DEFINER = user]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type

out代表从procedure返回一个数据,而不是传递一个值给储存过程。

例子:

mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
-> BEGIN
-> SELECT COUNT(*) INTO param1 FROM t;
-> END//
Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> CALL simpleproc(@a);
Query OK, 0 rows affected (0.00 sec) mysql> SELECT @a;
+------+
| @a |
+------+
| 3 |
+------+
1 row in set (0.00 sec)

常用数据库命令

  • select version();   #显示版本
  • select now();       #显示当前系统时间
  • select database(); #显示当前数据库
  • show databases    #查看所有数据库名称。
  • use 数据库名字     #选中一个数据库

  • create database 名称
  • drop database 名称

show命令

SHOW has many forms that provide information about databases, tables, columns, or status information about the server.

例如:

show databases #显示所有的数据库

show create database 数据库名字   会显示创建数据库的详细信息。

show tables #显示当前数据库的所有的表。

show create table 表名

创建表格

mysql> create table student(id int unsigned primary key auto_increment not null,
-> name varchar(20) not null); mysql> show tables;+-----------------+
| Tables_in_test1 |
+-----------------+
| student |
+-----------------+

解释:

  • 数据类型int, unsigned无符号的,这里表示是正整数。
  • primary key  作为主键
  • auto_increment 自动增长, 只支持整数浮点类。
  • not null 不能为空。
  • 数据类型 varchar(m)
    • a variable-length string。m代表列的值的最大长度
  • 数据类型 char(m)
    • a fixed-length string。

var和varchar的区别再也储存和取回的方式,以及最大长度和是否空格补位:

  1. char(m), m确定了最大字符长度,如果实际字符长度小于m, 储存时会使用空格右边补位。但取出时,会移除头尾空格。0<=m<=255
  2. varchar(m),  m<=65535, 不会使用空格补位。

具体区别和2个例子见文档:https://dev.mysql.com/doc/refman/8.0/en/char.html

mysql> desc student
-> ;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL |
  • desc关键字,显示表格结构。

删除表格: drop table [库名(如果没进入数据库)] 表名

给现存表格添加字段: alter table 表名 add(col_name, col_definition, ...)

mysql> alter table student  add(age int unsigned,
-> high decimal(5,2),
-> gender enum('man', 'woman')
-> );

解释:

  1. 数据类型decimal(5,2)。 5代表有5个数字,2代表小数点后有2位。
  2. 数据类型 enum('value1', 'value2' ...)。 它是一个字符串对象, 枚举。

对现存表格的字段定义进行修改:alter table 表名 MODIFY col_name column_definition

mysql> alter table student modify gender enum('man', 'woman', 'middle', 'secret') default 'secret';
mysql> alter table student add(cls_id int unsigned);

解释:

  1. 使用modify关键字,重新编辑gender字段,⚠️必须全部重新编辑。
  2. 可以使用default关键字设置一个默认值。
  3. 使用desc student可以查看新的表结构。
  4. 使用show create table student显示,创建这个表的句法,可以直接复制后用到其他数据库建表。
  5. 也可以使用change关键字修改,只不过语法上它是为重起一个新的字段名而设计的:change 旧名 新名 新列定义

删除表的字段 :  alter table 表名字 drop 字段名字;


primary和foreign key

https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html

例子:

create table scores(
id int unsigned auto_increment primary key not null,
score int,
stuid int unsigned,
subid int unsigned,
foreign key(stuid) references students(id),
foreign key(subid) references subjects(id)
);

foreign key(本表的列名) references 关联表(其列名)

foreign key的简介

为2个表建立1对多的关系。

有foreign key的表对主表的增加数据和删除数据有了约束。具体键文档


isnull(exp);

cast(exp as type);

left(str, len)

这个网站,特别适合学习mysql,对于常用功能,比官网有更多的例子和更详细的解释,

Mysql 语法豆知识的更多相关文章

  1. [置顶] Mysql存储过程入门知识

    Mysql存储过程入门知识 #1,查看数据库所有的存储过程名 #--这个语句被用来移除一个存储程序.不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程 #SELECT NAME FROM ...

  2. mysql 索引相关知识

    由where 1 =1 引发的思考 最近工作上被说了 说代码中不能用 where 1=1,当时觉得是应该可以用的,但是找不到什么理据, 而且mysql 语句优化这方面确实很薄弱   感觉自己mysql ...

  3. MYSQL 语法大全自己总结的

    mysql语法大全 --------数据链接---------------------数据库服务启动net start mysql --关闭服务net stop mysql --登录 -u,-p后面不 ...

  4. 学习mysql语法--基础篇(一)

      前  言  mysql  mysql语法--本篇学习都是通过使用Navicat Premium(数据库管理工具),连接mysql数据. 本篇学习主要有两个部分:    一.创建用户,创建数据库,给 ...

  5. 学习mysql语法--基础篇(二)

      前  言  mysql  mysql语法--本篇学习都是通过使用Navicat Premium(数据库管理工具),连接mysql数据. 本篇学习主要有两个部分: [SQL语句的组成]   DML ...

  6. mysql数据库相关知识

    什么是数据库?                数据库(Database)是按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库.(来自:百度) 什么是sql? 结构化查询语言(Struct ...

  7. mysql语法之case when then与列转行

    mysql语法中case when then与列转行的使用场景非常丰富. case语句类似java中条件分支语句的作用,可以类比java中的switch语句或者if语句来学习. 其语法如下: case ...

  8. 12月21日 简单理解Active Recore Callback, destroy_all和delete_all的区别。豆知识(alias),语言学习法(4核心)

    destroy_all and delete_all Destroy the records by instantiating each record and calling its #destroy ...

  9. 豆知识扩展:HTML<meta> tag

    豆知识: HTML<meta> tag Metadata 是关于数据的信息. The <meta> tag provides metadata关于网页.Metadat不会显示在 ...

随机推荐

  1. Codis的安装配置

    codis是分布式redis解决方案 centos系统下安装codis需要安装相关的依赖,将图中的依赖上传至centos系统中 依次进行安装: 一.go环境的安装配置 解压到install目录下: . ...

  2. win10系统不能ping通vmware虚假机解决办法

    在使用vmware安装虚拟机后,在虚拟机里面可以上网,但就是不能在宿主机通过远程连接工具连接 同时也不能ping通虚拟机 检查网络配置 查看网关 在宿主机打开 ip地址填写刚刚查看的网关,同时把子网掩 ...

  3. 获取Android手机日志

    方式一:使用USB连接 1.在手机上启用USB调试2.在终端输入adb devices 3.获取日志 只连接一个设备:1)清除已缓存日志:adb logcat -c2)获取日志并保存到本地:adb l ...

  4. 《Mysql 索引 - 概述》

    一:索引的目的 - 索引的出现其实就是为了提高数据查询的效率,就像书的目录一样. 二:InnoDB 索引模型 - InnoDB 采用 B+树 的数据结构进行存储. - 例如,我们建立一张表,分析他的数 ...

  5. WUSTOJ 1241: 到底是几月几日?(Java)

    1241: 到底是几月几日? 题目   输入年月日,输出当前日期是当年的第几天,输入年份和第几天,输出当前日期.更多内容点击标题. 说明   算是水题吧,仅提供代码做参考,不做分析.代码没用JDK自带 ...

  6. 面试经典算法:优先队列,最大堆,堆排序,左偏树Golang实现

    堆排序 使用优先队列-最小/最大堆可实现. 优先队列 优先队列是一种能完成以下任务的队列:插入一个数值,取出最小的数值(获取数值,并且删除).优先队列可以用二叉树来实现,我们称这种为二叉堆. 最小堆 ...

  7. MVC的12种ActionResult介绍以及应用示例【转】

    一.介绍 1.ViewResult 表示一个视图结果,它根据视图模板产生应答内容.对应得Controller方法为View. 2.PartialViewResult 表示一个部分视图结果,与ViewR ...

  8. Django 之一些request封装的常用功能

    一些常用的request对象属性 介绍 HTTP 应用的信息是通过 请求报文 和 响应报文 传递的,关于更多的相关知识,可以阅读<HTTP权威指南>获得. 其中 请求报文 由客户端发送,其 ...

  9. 重构与反思-<重构代码的7个阶段>有感

    https://coolshell.cn/articles/5201.html/comment-page-2#comment-1932554 过去半年基本上完整经历了这个文章的各个阶段,看完文章结合自 ...

  10. 关于微信小程序获取多个formId的实现方法

    在此之前,很多人使用过form和button的多层嵌套来实现点击一次获取多个formId的目的,如下图所示,点击一次“提交”,可以获取到多个formId 但是在今年3月份,这个投机取巧的方法(算是微信 ...