mysql必知必会-Code

MySQL code解析 # Query入口 MySQL的代码比较messy,为了清楚理解MySQL的已有功能,本篇文章从MySQL的query层面进行分析,目的是理清MySQL的query处理流程和代码架构。本文基于MySQL5.7版本。 MySQL的入口代码的skeloton可以参见官方文档:https://dev.mysql.com/doc/internals/en/guided-tour-skeleto 阅读详情

emm

把书里的Code例程敲了一遍,做一个初步的学习,Mark一下

1)安装MySQL Server8.0

password: …

2)MySQL练习题

…

chap1-了解sql

DBMS:数据库管理系统

SQL : 数据库结构化查询语言

chap2-mysql简介

mySQL–客户端-服务器DBMS

MySQL–开放源代码

mySQL 执行速度很快

还有一种基于共享文件系统的DBMS;

chap3-使用MySql语句

基本指令

#创建数据库
create database crashcourse	;
#use
use crashcourse;
#show指令
show databases;
show tables;
show columns from customers;
describe == show columns from ...;
show status;
show create database;
show create table;
show errors;
show warnings;
# 查看详细介绍
help show;

chap4-检索数据

SELECT语句使用

SELECT prod_name
FROM products;

SELECT pro1 , pro2, pro3
FROM products
LIMIT 5,5;

SELECT *
FROM PRODUCTS;
//检索不同值
SELECT DISTINCT pro1,pro2
FROM products;

//完全限定的表名
SELECT products.pro1
FROM crashcourse.products;

chap5-排序检索数据

如果不排序,数据一般将以它在底层表中出现的顺序显示;

SELECT prod_name
FROM products
ORDER BY prod_name;

SELECT prod1 , prod2 , prod3
FROM products 
ORDER BY prod1 , prod2;

//指定排序方向  DESC:降序   ASC:升序
SELECT prod1 , prod2 , prod3
FROM products
ORDER BY prod1 DESC , prod2 , prod3 DESC;

//找出最昂贵物品
SELECT prod_price
FROM products
ORDER BY prod_price DESC
LIMIT 1;

chap6-过滤数据

WHERE子句的使用:

where子句操作符:

= 、 <> 、 != 、 < 、 > 、 <= >= BETWEEN

特殊的where子句: IS NULL , IS NOT NULL

MySQL执行匹配时默认不区分大小写

单引号用来限定字符串

# 相等测试
SELECT prod_name, prod_price
FROM products
WHERE prod_price = 2.0;

#检查单个值
SELECT prod_name , prod_price
FROM products
WHERE product_name = 'fuses';

SELECT prod_name, prod_price
FROM products
WHERE prod_price <= 10;

#不匹配检查
SELECT vend_id , prod_name
FROM products
WHERE vend_id <> 1003;

#范围检查
SELECT prod_name , prod_price
FROM products
WHERE prod_price BETWEEN 5 AND 10;	//包括5-10

#空值检查
SELECT prod_name
FROM products
WHERE prod_price IS NULL;

SELECT cust_id
FROM customers
WHERE cust_email IS NULL;

chap7-数据过滤

运算符: AND 、 OR 、 () 、 IN 、NOT

AND优先级高于OR

MySQL支持使用NOT对IN、BETWEEN、EXISTS子句进行取反

SELECT prod_id , prod_price , prod_name
FROM products
WHERE end_id = 1003 AND prod_price <= 10;

SELECT prod_name , prod_price
FROM products
WHERE vend_id = 1002 OR vend_id = 1003;

# AND 优先级高于OR
SELECT prod_name , prod_price
FROM products
WHERE (vend_id = 1002 OR vend_id = 1003) AND pord_price <= 10;

# IN
SELECT prod_name, prod_price
FROM products
WHERE vend_id IN (1002,1003)
ORDER BY prod_name;

# NOT
SELECT prod_name , prod_price
FROM products
WHERE vend_id NOT IN (1002,1003)
ORDER BY prod_name;

chap8-用通配符进行过滤

LIKE操作符,%,_通配符

% : 匹配0 , 1, 2个字符 , 任何字符出现任意次数

_ :匹配单个字符

通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长

SELECT prod_id , prod_name
FROM products
WHERE prod_name LIKE 'jet%';

SELECT prod_id , prod_name
FROM products
WHERE prod_name LIKE '%anvil%';

SELECT prod_id , prod_name
FROM products
WHERE prod_name LIKE '_ ton anvil';

注意:

  • 不要过度使用通配符,效率较低;
  • 不要在搜索模式的开始处使用通配符,速度较慢;
  • 仔细注意通配符的位置;

chap9-用正则表达式进行搜索

正则表达式用来匹配文本特殊的串(子串)

MySQL仅支持多数正则表达式实现的一个很小的子集

REGEXP : 正则表达式

. : 匹配任意一个字符

| : OR匹配,匹配任意一个字符

[] : [123] === [1|2|3] ,另一种or语句

- : 定义一个范围 , [0-9]

MySQL 为了匹配特殊字符,必须使用\\为前导, \\-表示查找- , \\. 表示查找 . ;(转义字符)

\\f 换页

\\n 换行

\\r 回车

\\t 制表

\\v 纵向制表

SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000'
ORDER BY prod_name;

SELECT prod_name
FROM products
WHERE prod_name REGEXP '.000'
ORDER BY prod_name;

#LIKE 匹配整个列
SELECT prod_name
FROM products
WHERE prod_name LIKE '1000'
ORDER BY prod_name;

SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000'
ORDER BY prod_name;

SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000|3000'
ORDER BY prod_name;

SELECT prod_name
FROM products
WHERE prod_name REGEXP '[123] Ton'
ORDER BY prod_name;

# 1 or 2 or 3 Ton
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1|2|3 Ton'
ORDER BY prod_name;

# 集合可以定义要匹配的一个或多个字符
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[0-5] Ton'
ORDER BY prod_name;

SELECT vend_name
FROM vendors
WHERE vend_name REGEXP '\\.'
ORDER BY vend_name;

MySQL 中可以使用预定义的字符集,称为字符类(character class)

[:alnum:]
[:alpha:]
[:blank:]
[:cntrl:]
[:digit:]
[:lower:]
[:print:]
[:punct:]
[:space:]
[:upper:]
[:xdigit:]

匹配多个实例:

*   :  0个或多个匹配
+   : 1个或多个匹配 ==  {1,}
?  : 0个或一个匹配 ==  {0,1}
{n} :  指定数目匹配
{n,} : 不少于指定数目匹配
{n,m} : 匹配数目范围
SELECT prod_name
FROM products
WHERE prod_name REGEXP '\\([0-9] sticks?\\)'

SELECT prod_name
FROM products
WHERE prod_name REGEXP '[[:digit:]]{4}'
ORDER BY prod_name;

SELECT prod_name
FROM products
WHERE prod_name REGEXP '[0-9][0-9][0-9][0-9]'
ORDER BY prod_name;

正则表达式匹配特定位置的文本:

^ : 文本的开始

$ : 文本的结束

[[:<:]] : 词的开始

[[:>:]] : 词的结尾

SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;

//简单的正则表达式测试(不使用数据库表)
SELECT 'hello' REGXEP '[0-9]';

chap10-创建计算字段

  1. 计算字段并不存在于数据库表中,计算字段是运行时在SELECT语句内创建的;
  2. 术语字段通常用在计算字段的连接上
  3. 一般来说,在数据库服务器上完成这些操作(转换和格式化)比在客户机中完成要快的多;
  4. 使用别名: AS 关键字;
  5. 使用计算字段进行算术计算;支持 + - * /

Concat() : 用来拼接列,把多个串连接起来形成一个较长的串,需要指定一个或多个串,各个串之间用逗号隔开;

RTrim() : 去除值右边所有空格

LTrim() : 去除值左边所有空格

Trim() : 去掉串左右两边的空格

SELECT Concat(vend_name , ' (' , vend_country, ')')
FROM vendors
ORDER BY vend_name;

SELECT Concat(RTrim(vend_name) , ' (' , RTrim(vend_country) , ')')
FROM vendors
ORDER BY vend_name;

//AS  : 对计算字段取别名
SELECT Concat(RTrim(vend_name) , ' (' , RTrim(vend_country) , ')') AS vend_title
FROM vendors
ORDER BY vend_name;

SELECT prod_id , quantity, item_price
FROM orderitems
WHERE order_num = 20005;

SELECT prod_id,
	quantity,
	item_price,
	quantity * item_price AS expanded_price
FROM orderitems
WHERE order_num = 20005;

chap11-使用数据处理函数

  1. SQL支持使用函数来处理数据;
  2. SQL支持的函数类型: 处理文本串、在数值数据上进行算术操作、处理日期和时间值并从中提取特定成分、返回DBMS的特定信息;
  3. SOUNDEX : 一个将任何文本串转换为描述其语音表示的字母数字模式的算法
  4. 日期和时间采用相应的数据类型和特殊的格式存储,以便能够快速和有效地排序和过滤,并且节省物理存储空间;yyyy-mm-dd

日期和时间处理函数:

AddDate() AddTime() CurDate() CurTime() Date() DateDiff() Day() …

数值处理函数:

Abs() Cos() Exp() Mod() Pi() Rand() Sin() Sqrt() Tan() …

SELECT vend_name , Upper(vend_name) AS vend_name_upcase
FROM vendors
ORDER BY vend_name;

//寻找发音相似的匹配列值
 mysql> SELECT cust_name , cust_contact
    -> FROM customers
    -> WHERE Soundex(cust_contact) = Soundex('Y Lie');
    
mysql> SELECT cust_id , order_num
    -> FROM orders
    -> WHERE order_date = '2005-09-01';  
 //使用Date()函数
    mysql> SELECT cust_id , order_num
    -> FROM orders
    -> WHERE Date(order_date) = '2005-09-01';
 //匹配日期中的天数
 mysql> SELECT cust_id  , order_num
    -> FROM orders
    -> WHERE Date(order_date) BETWEEN '2005-09-01' AND '2005-09-30';
 //另一种写法
 mysql> SELECT cust_id, order_num
    -> FROM orders
    -> WHERE Year(order_date) = 2005 AND MONTH(order_date) = 9;

chap12-汇总数据

  1. 需要汇总数据而不是把它们实际检索出来,MySQL提供了专门的函数(聚集函数);

  2. MySQL 提供了5个聚集函数(运行在行组上,计算和返回单个值的函数);

  3. 这5个聚集函数都可以如下使用:
    - 对所有行执行计算(指定ALL参数或不指定(默认))
    - 只包含不同的值(指定DISTINCT参数)

  4. 聚集函数用来汇总数据,MySQL支持一系列的聚集函数;

// SQL聚集函数
AVG()    : 返回某列的平均值 ,,忽略NULL值的行
COUNT()  :  返回某列的行数
MAX()   :  某列的最大值
MIN()   :  某列的最小值
SUM()   :  某列值之和
mysql> SELECT AVG(prod_price) AS avg_price
    -> FROM products;
//确定特定行和列的平均值
mysql> SELECT AVG(prod_price) AS avg_price
    -> FROM products
    -> WHERE vend_id = 1003;

COUNT(*) :对表中行的数目进行计数,无论是空值(NULL)还是非空值

COUNT(column) : 对特定列中具有值的行进行计数

mysql> SELECT COUNT(*) AS num_cust
    -> FROM customers;

mysql> SELECT COUNT(cust_email) AS num_cust
    -> FROM customers;

MAX() : 返回指定列中的最大值 , 一般用来找出最大的数值或日期值 , 忽略空行

允许用来返回任意列中最大值,包括返回文本列中的最大值

mysql> SELECT MAX(prod_price) AS max_price
    -> FROM products;

MIN() : 返回指定列的最小值 , 忽略空行

mysql> SELECT MIN(prod_price) AS min_price
    -> FROM products;

SUM() : 返回指定列值的和

mysql> SELECT SUM(quantity) AS items_ordered
    -> FROM orderitems
    -> WHERE order_num = 20005;

mysql> SELECT SUM(quantity * item_price) AS total_price
    -> FROM orderitems
    -> WHERE order_num = 20005;

DISTINCT只能用于COUNT() , 不能用于COUNT(DISTINCT)

//平均值只考虑各个不同的价格
mysql> SELECT AVG(DISTINCT prod_price) AS avg_price
    -> FROM products
    -> WHERE vend_id = 1003;

组合聚集函数:

mysql> 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;

chap13-汇总数据

  1. SQL聚集函数可用来汇总数据;

  2. 数据分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算;

  3. GROUP BY子句指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集;

  4. GROUP BY子句的一些规定:

    • GROUP BY子句可以包含任意数目的列,能够对分组进行嵌套;
    • 如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总;
    • GROUP BY子句列出的每个列都必须是检索列或有效地表达式,不能使用聚集函数或别名;
    • 除聚集计算语句外,SELECT语句中的每个列 都必须在GROUP BY子句中给出;
    • 如果分组中有NULL值,NULL将作为一个分组返回;
    • GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前
  5. MySQL支持过滤分组,WHERE过滤指定的是行而不是分组 , WHERE没有分组的概念,HAVING子句类似WHERE子句,WHERE过滤行,而HAVING过滤分组;

  6. HAVING子句:过滤针对的是基于分组聚集值而不是特定行值;

  7. WHERE子句在分组前进行过滤,HAVING子句在分组后进行过滤;

  8. GROUP BY 和ORDER BY经常完成相同的工作,但它们并不完全一样:
    - ORDER BY : 排序产生的输出,任意列都可以使用;
    - GROUP BY: 分组行,但输出可能不是分组的顺序 , 只可能使用选择列或表达式列;
    - 如果需要对输出进行排序,一定要明确提供ORDER BY子句;

SELECT : 要返回的列或表达式

FROM : 从中检索数据的表

WHERE : 行级过滤

GROUP BY : 分组说明

HAVING : 组级过滤

ORDER BY : 输出排序顺序

LIMIT: 要检索的行数

mysql> SELECT vend_id , COUNT(*) AS num_prods
    -> FROM products
    -> GROUP BY vend_id;

//使用 WITH ROLLUP关键字
mysql> SELECT vend_id , COUNT(*) AS num_prods
    -> FROM products
    -> GROUP BY vend_id WITH ROLLUP;
    
//HAVING过滤分组
mysql> SELECT cust_id , COUNT(*) AS orders
    -> FROM orders
    -> GROUP BY cust_id
    -> HAVING COUNT(*) >= 2;
//同时使用WHERE和HAVING
mysql> SELECT vend_id , COUNT(*) AS num_prods
    -> FROM products
    -> WHERE prod_price >= 10
    -> GROUP BY vend_id
    -> HAVING COUNT(*) >= 2;

mysql> SELECT order_num , SUM(quantity * item_price) AS ordertotal
    -> FROM orderitems
    -> GROUP BY order_num
    -> HAVING SUM(quantity * item_price) >= 50;

mysql> SELECT order_num , SUM(quantity * item_price) AS ordertotal
    -> FROM orderitems
    -> GROUP BY order_num
    -> HAVING SUM(quantity * item_price) >= 50
    -> ORDER BY ordertotal;

chap14-使用子查询

  1. 查询(query):任何SQL语句都是查询,但此术语一般指SELECT语句;
  2. 子查询:嵌套在其他查询中的查询;
  3. 在SELECT语句中,子查询总是从内向外处理
  4. WHERE子句中使用子查询能够编写出功能很强并且很灵活的SQL语句,对于能嵌套的子查询的数目没有限制,不过在实际使用中,由于性能的限制,不能嵌套太多子查询;
  5. 作为计算字段使用子查询;
  6. 相关子查询:涉及到外部查询的子查询,任何时候只要列名可能有多义性,就必须使用这种语法;
  7. 子查询最常用于WHERE子句中的IN操作符,以及用来填充计算列;
mysql> SELECT order_num
    -> FROM orderitems
    -> WHERE prod_id = 'TNT2';
mysql> SELECT cust_id
    -> FROM orders
    -> WHERE order_num IN (20005, 20007);
//合并 子查询
mysql> SELECT cust_id
    -> FROM orders
    -> WHERE order_num IN (SELECT order_num
    ->                     FROM orderitems
    ->                     WHERE prod_id = 'TNT2');

//WHERE语句使用子查询
mysql> SELECT cust_name , cust_contact
    -> FROM customers
    -> WHERE cust_id IN (SELECT cust_id
    ->                   FROM orders
    ->                   WHERE order_num IN (SELECT order_num
    ->                                      FROM orderitems
    ->                                     WHERE prod_id = 'TNT2'));

mysql> SELECT COUNT(*) AS orders
    -> FROM orders
    -> WHERE cust_id = 10001;

//计算字段使用子查询
mysql> SELECT cust_name,
    -> cust_state,
    -> (SELECT COUNT(*)
    -> FROM orders
    -> WHERE orders.cust_id = customers.cust_id) AS orders
    -> FROM customers
    -> ORDER BY cust_name;

chap15-联结表

  1. 数据检索查询中使用联结(Join)表;
  2. 关系表的设计就是要保证把信息分解成多个表,一类数据一个表,各表通过某些常用的值(关系设计中的关系)互相关联;
  3. 外键:外键为某个表中的一列,它包含另一个表的主键值,定义了2个表之间的关系;
  4. 分解数据为多个表能够更有效地存储,更方便的处理,具有更强的可伸缩性;
  5. 联结是一种机制,用来在一条SELECT语句中关联表,因此称之为联结,使用特殊语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行;
  6. 在引用的列可能出现二义性时,必须使用完全限定列名;
  7. 在一条SELECT语句中联结几个表时,相应的关系是在运行中构造的;
  8. 笛卡尔积: 由没有联结条件的表关系返回的结果为笛卡尔积,有时又称为叉联结(cross join),检索出的行的数目将是第一个表中的行数乘以第二个表中的行数;
  9. 应该保证所有的联结都有WHERE子句,否则MySQL将返回比期望值多的多的数据;
  10. 等值联结:基于2个表之间的相等测试,有时又称为内部联结(INNER JOIN);
  11. 使用WHERE… AND子句可以联结多个表;
  12. MySQL在运行时关联指定的每个表以处理联结,这种处理可能是非常耗费资源的,因此,应该仔细,不要联结不必要的表,联结的表越多,性能下降的越厉害;
//FROM子句有2个表,WHERE子句进行联结
mysql> SELECT vend_name , prod_name , prod_price
    -> FROM vendors , products
    -> WHERE vendors.vend_id = products.vend_id
    -> ORDER BY vend_name , prod_name;

//笛卡尔积   联结表
mysql> SELECT vend_name, prod_name, prod_price
    -> FROM vendors, products
    -> ORDER BY vend_name , prod_name;

//INNER JOIN ON 语法
mysql> SELECT vend_name , prod_name , prod_price
    -> FROM vendors INNER JOIN products
    -> ON vendors.vend_id = products.vend_id;

mysql> SELECT prod_name ,vend_name , prod_price , quantity
    -> FROM orderitems , products , vendors
    -> WHERE products.vend_id = vendors.vend_id
    -> AND orderitems.prod_id = products.prod_id
    -> AND order_num = 20005;
    
//子查询写法
mysql> SELECT cust_name , cust_contact
    -> FROM customers
    -> WHERE cust_id IN (SELECT cust_id
    ->                   FROM orders
    ->                   WHERE order_num IN (SELECT order_num
    ->                                       FROM orderitems
    ->                                       WHERE prod_id = 'TNT2'));

//联结写法 : WHERE子句中前两个关联联结表,最后一个进行过滤
mysql> SELECT cust_name , cust_contact
    -> FROM customers , orders, orderitems
    -> WHERE customers.cust_id = orders.cust_id
    -> AND orders.order_num = orderitems.order_num
    -> AND prod_id = 'TNT2';

chap16-创建高级联结

  1. 别名除了用于列名和计算字段外,还可以给表名取别名;
  2. 表别名只在查询中使用,与列别名不一样,表别名不返回到客户机;
  3. 不同类型的联结:内部联结,自联结,自然联结和外部联结;
  4. 自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句
  5. 标准的联结返回所有数据,甚至相同的列出现多次,自然联结排除多次出现,使每个列只返回一次,自然联结通过使用SELECT *实现;
  6. 外部联结:许多联结将一个表中的行与另一个表中的行相关联,但有时会需要包含没有关联行的哪些行;外部联结使用OUTTER JOIN FROM ... ON..
  7. 在使用OUTER JOIN关键字时,必须使用LEFT或RIGHT指定包括其所有行的表,RIGHT是OUTER JOIN 右边的表,LEFT是OUTER JOIN左边的表
  8. 注意:
    - 注意使用的联结类型,一般使用内部联结;
    - 保证使用正确的联结条件;
    - 应该总是提供联结条件,否则会得出笛卡尔积;
    - 在一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型;
mysql> SELECT Concat(RTrim(vend_name), ' (' , RTrim(vend_country), ')') AS
    -> vend_title
    -> FROM vendors
    -> ORDER BY vend_name;

//使用表别名
mysql> SELECT cust_name , cust_contact
    -> FROM customers AS c , orders AS o , orderitems AS oi
    -> WHERE c.cust_id = o.cust_id
    -> AND oi.order_num = o.order_num
    -> AND prod_id = 'TNT2';

//自联结
// 子查询
mysql> SELECT prod_id , prod_name
    -> FROM products
    -> WHERE vend_id = (SELECT vend_id
    ->                  FROM products
    ->                  WHERE prod_id = 'DTNER');

mysql> SELECT p1.prod_id , p1.prod_name
    -> FROM products AS p1 , products AS p2
    -> WHERE p1.vend_id = p2.vend_id
    -> AND p2.prod_id = 'DTNER';
//自然联结
mysql> SELECT c.* , o.order_num , o.order_date,
    -> oi.prod_id , oi.quantity , oi.item_price
    -> FROM customers AS c , orders AS o , orderitems AS oi
    -> WHERE c.cust_id = o.cust_id
    -> AND oi.order_num = o.order_num
    -> AND prod_id = 'FB';

//内部联结
mysql> SELECT customers.cust_id , orders.order_num
    -> FROM customers INNER JOIN orders
    -> ON customers.cust_id = orders.cust_id;

//外部联结
mysql> SELECT customers.cust_id , orders.order_num
    -> FROM customers LEFT OUTER JOIN orders
    -> ON customers.cust_id = orders.cust_id;
//外部联结 , RIGHT子句
mysql> SELECT customers.cust_id , orders.order_num
    -> FROM customers RIGHT OUTER JOIN orders
    -> ON orders.cust_id = customers.cust_id;

//GROUP BY子句按客户分组数据
mysql> SELECT customers.cust_name , customers.cust_id ,
    -> COUNT(orders.order_num) AS num_ord
    -> FROM customers INNER JOIN orders
    -> ON customers.cust_id = orders.cust_id
    -> GROUP BY customers.cust_id;

mysql> SELECT customers.cust_name ,
    -> customers.cust_id,
    -> COUNT(orders.order_num) AS num_ord
    -> FROM customers LEFT OUTER JOIN orders
    -> ON customers.cust_id = orders.cust_id
    -> GROUP BY customers.cust_id;

chap17-组合查询

  1. MySQL允许执行多个查询(多条SELECT语句), 并将结果作为单个查询结果集返回,这些组合查询通常称为并(UNION)或复合查询;

  2. 多数情况下, 组合查询与多条WHERE子句查询完成的工作相同;

  3. UNION的规则:
    - UNION必须由2条或2条以上的SELECT语句组成,语句之间使用UNION分隔;
    - UNION中的每个查询必须包含相同的列,表达式或聚集函数;
    - 列数据类型必须兼容,类型不必完全相同;

  4. UNION自动从查询结果集中去除重复的行, UNION ALL匹配所有的行;

  5. 在使用UNION时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后;

  6. 利用UNION,可以将多条查询的结果作为 一条组合查询返回,不管他们的结果中包含还是不包含重复;

//UNION:  组合查询
mysql> SELECT vend_id , prod_id , prod_price
    -> FROM products
    -> WHERE prod_price <= 5
    -> UNION
    -> SELECT vend_id , prod_id, prod_price
    -> FROM products
    -> WHERE vend_id IN (1001, 1002);

mysql> SELECT vend_id , prod_id , prod_price
    -> FROM products
    -> WHERE prod_price <= 5
    -> OR vend_id IN (1001,1002);
// UNION ALL 匹配所有行
mysql> SELECT vend_id , prod_id, prod_price
    -> FROM products
    -> WHERE prod_price <= 5
    -> UNION ALL
    -> SELECT vend_id, prod_id, prod_price
    -> FROM products
    -> WHERE vend_id IN (1001,1002);

//ORDER BY 子句进行排序
mysql> SELECT vend_id, prod_id , prod_price
    -> FROM products
    -> WHERE prod_price <= 5
    -> UNION
    -> SELECT vend_id , prod_id , prod_price
    -> FROM products
    -> WHERE vend_id IN (1001 , 1002)
    -> ORDER BY vend_id, prod_price;

chap18-全文本搜索

  1. MyISAM支持全文本搜索,InnoDB不支持全文本搜索;
  2. 使用LIKE能查找包含特殊值或部分值的行;
  3. 在使用全文本搜索时,MySQL不需要分别查看每个行,MySQL创建指定列中各词的一个索引,搜索可以针对这些词进行;
  4. 为了进行全文本搜索,必须索引被搜索的列;
  5. 全文本搜索会对结果进行排序,具有较高等级的行会优先返回;
  6. 查询扩展用来放宽所返回的全文本搜索结果的范围;关键字WITH QUERY EXPANSION;
  7. MySQL支持全文本搜素ode另外一种形式,称为布尔文本搜索,布尔文本搜索即使没有定义FULLTEXT索引,也可以使用它;关键字IN BOOLEAN MODE;
  8. 在布尔文本搜索中,不按等级值降序排序返回行;

注意事项:

  • 在索引全文本数据是,短词被忽略并且从索引中排除,短词指3个或3个以下字符的词;
  • MySQL带有一个内建的非用词列表,这些词在索引全文本数据时总是被忽略,该列表可覆盖;
  • 50%规则:**如果一个词出现在50%以上的行中,则它将作为一个非用词忽略,**该规则不适用于IN BOOLEAN MODE;
  • 如果表中行数少于3行,则全文本搜索不返回结果;
  • 忽略词中的单引号,don’t —> dont;
  • 不具有词分割符的语言不能恰当地返回全文本搜索结果;
  • 仅MyISAM数据库引擎支持全文本搜索;

SELECT 与Match()和Against()一起使用进行全文本搜索;

Match()指定被搜索的列;传递给Match()的值必须与FULLTEXT()定义中相同;

Against()指定要使用的搜索表达式;

布尔文本搜索可以使用全文本布尔操作符:

  • + : 包含
  • - : 排除
  • > :
  • <:
  • ()
  • ~
  • “”
CREATE TABLE productnotes
(
	note_id   int     NOT NULL AUTO_INCREMENT,
    prod_id    char(10)  NOT NULL , 
    note_date  datetime  NOT NULL , 
    note_text  text NULL,
    PRIMARY KEY(note_id),
    FULLTEXT(note_text)
)ENGINE=MyISAM;

//全文本搜索
mysql> SELECT note_text
    -> FROM productnotes
    -> WHERE Match(note_text) Against('rabbit');

mysql> SELECT note_text
    -> FROM productnotes
    -> WHERE note_text LIKE '%rabbit%';

//使用查询扩展
mysql> SELECT note_text
    -> FROM productnotes
    -> WHERE Match(note_text) Against('anvils' WITH QUERY EXPANSION);

//布尔文本搜索
mysql> SELECT note_text
    -> FROM productnotes
    -> WHERE Match(note_text) Against('heavy' IN BOOLEAN MODE);

//全文本布尔搜索(使用布尔操作符)
//2个词都必须包含
mysql> SELECT note_text
    -> FROM productnotes
    -> WHERE Match(note_text) Against('+rabbit +bait' IN BOOLEAN MODE);
//包含2个词中至少1个
mysql> SELECT note_text
    -> FROM productnotes
    -> WHERE Match(note_text) Against('rabit bait' IN BOOLEAN MODE);
//将"rabbit bait"看为1个词
mysql> SELECT note_text
    -> FROM productnotes
    -> WHERE Match(note_text) Against('"rabbit bait"' IN BOOLEAN MODE);

mysql> SELECT note_text
    -> FROM productnotes
    -> WHERE Match(note_text) Against('>rabbit <bait' IN BOOLEAN MODE);

mysql> SELECT note_text
    -> FROM productnotes
    -> WHERE Match(note_text) Against('+safe +(<combination)' IN BOOLEAN MODE);

chap19-插入数据

  1. INSERT用来向数据库表中插入或添加行;
  2. INSERT语句一般不产生输出;
  3. INSERT语句更安全的用法是在表名的括号里明确给出列名,VALUES中的值与之对应;;
  4. INSERT语句应该总是使用有列的列表,这样即使表结构发生了变化仍然能够正常起作用;
  5. INSERT语句如果给出列名,则必须对每个列出的列给出一个值,使用这种语法,可以省略不需要的列;
  6. INSERT语句插入多行,VALUES语句使用逗号进行分割;
  7. 可以用INSERT语句将一条SELECT语句查询的结果插入表中;

INSERT INTO …(…)

VALUES(

…),

VALUES(

…);

//插入一行 : 该语句高度依赖表中列的定义次序 ,语法简单,但并不安全
mysql> INSERT INTO Customers
    -> VALUES(NULL,
    -> 'Pep E. Lapew',
    -> '100 Main Street',
    -> 'LOS Angles',
    -> 'CA',
    -> '90046',
    -> 'USA',
    -> NULL,
    -> NULL);
//更安全方法
mysql> INSERT INTO Customers(cust_name,
    -> cust_address,
    -> cust_city,
    -> cust_state,
    -> cust_zip,
    -> cust_country,
    -> cust_contact,
    -> cust_email)
    -> VALUES('Pep E. Lapew',
    -> '100 Main Street',
    -> 'Los Angeles',
    -> 'CA',
    -> '90046',
    -> 'USA',
    -> NULL,
    -> NULL);
//插入多行
mysql> INSERT INTO customers(cust_name,
    -> cust_address,
    -> cust_city,
    -> cust_state,
    -> cust_zip ,
    -> cust_country)
    -> VALUES(
    ->          'Pep E. Lapew',
    ->          '100 Main Street',
    ->          'Los Angeles',
    ->          'CA',
    ->          '90046',
    ->          'USA'
    -> ),
    -> VALUES(
    ->          'M. Martian',
    ->          '42 Galaxy Way',
    ->          'New York',
    ->          'NY',
    ->          '11213',
    ->          'USA'
    -> );

//INSERT SELECT语句 : 将SELECT 语句检索出的结果插入表customers中
INSERT INTO customers(cust_id,
                     cust_contact,
                     cust_email)
SELECT cust_id,
	   cust_contact,
	   cust_email
FROM custnew;
                    

chap20-更新和删除数据

  1. upadate delete使用: UPDATE 用来更新表中的数据,可更新表中特定行或所有行;
  2. UPDATE 如果没有WHERE过滤子句,将过滤表中的所有行;
  3. UPDATE IGNORE : 更新出错时仍强制更新;
  4. 使用DELETE语句从表中删除数据:可删除特定的行或表的所有行;
  5. DELETE不删除表本身;
  6. 使用强制实施引用完整性的数据库,MySQL不允许删除具有与其他表相关联的数据的行;
//UPDATE 表中数据
mysql> UPDATE customers
    -> SET cust_email = 'elmer@fudd.com'
    -> WHERE cust_id = 10005;
//更新多个列
mysql> UPDATE customers
    -> SET cust_name = 'The Fudds',
    ->    cust_email = 'elmer@fudd.com'
    -> WHERE cust_id = 10005;

//更新出错时仍强制更新
UPDATE IGNORE customers 
....
//删除特定行
mysql> DELETE FROM customers
    -> WHERE cust_id = 10006;

chap21-创建和操纵表

  1. CREATE TABLE必须给出下列信息:

    • 新表的名字;
    • 表列的名字和定义,用逗号隔开;
  2. MySQL 要求在创建新表时,指定的表名必须不存在,不能直接覆盖,必须对要覆盖的表进行手动删除;仅在表不存在时创建:CREATE TABLE ... IF NOT EXISTS

  3. NULL值: 没有值或缺值,允许NULL值的列也允许在插入行时不给出该列的值,不允许NULL值的列不接受该列没有值的行;

  4. 不要把NULL值和空串混淆,NULL值是没有值,不是空串;

  5. 主键值必须唯一,表中每一行都必须具有唯一的主键值,主键如果使用多个列,则这些列的组合必须唯一;

  6. AUTO_INCREMENT告诉MySQL,本列每当增加一行时自动增量,每次执行一个INSERT操作时,MySQL自动对该列增量,给该列赋予下一个可用的值,每个表只允许一个AUTO_INCREMENT列,而且它必须被索引(可通过成为主键);

  7. MySQL具有一个具体管理和处理数据的内部引擎,MySQL具有多种引擎,他们各自具有不同的功能和特性:

    • InnoDB : 可靠事务处理引擎
    • MEMORY : 数据存储在内存,速度快
    • MyISAM : 性能极高的引擎,支持全文本搜索,不支持事务处理
  8. 引擎类型可以混用,但是外键不能跨引擎;

  9. 更新表:ALTER TABLE , ALTER TABLE也可以用来定义外键;

SELECT last_insert_id() ; //返回最后一个AUTO_INCREMENT的索引值

DEFAULT : 可以指定表列的默认值;

删除表: DROP TABLE …

重命名表: RENAME TABLE … TO … ,

​ … TO … ;

//创建一个自己的数据库
CREATE DATABASE hello;
//创建一个Table
mysql> CREATE TABLE customers
    -> (
    -> cust_id    int    NOT NULL       AUTO_INCREMENT,
    -> cust_name   char(50)     NOT NULL,
    -> cust_address     char(50)        NULL,
    -> cust_city        char(50)        NULL,
    -> cust_state       char(5)         NULL,
    -> cust_zip         char(10)        NULL,
    -> cust_country     char(50)        NULL,
    -> cust_contact     char(50)        NULL,
    -> cust_email       char(255)       NULL,
    -> PRIMARY KEY(cust_id)
    -> )ENGINE=InnoDB;

//创建orders表
mysql> CREATE TABLE orders
    -> (
    -> order_num   int   NOT NULL AUTO_INCREMENT,
    -> order_date  datetime  NOT NULL,
    -> cust_id     int   NOT NULL,
    -> PRIMARY KEY(order_num)
    -> )ENGINE = InnoDB;

//创建vendors表
mysql> CREATE TABLE vendors
    -> (
    -> vend_id    int    NOT NULL    AUTO_INCREMENT,
    -> vend_name  char(50)   NOT NULL,
    -> vend_address char(50)  NULL,
    -> vend_city   char(50)   NULL,
    -> vend_state   char(50)  NULL,
    -> vend_zip     char(5)  NULL,
    -> vend_country  char(50) NULL,
    -> PRIMARY KEY(vend_id)
    -> )ENGINE = InnoDB;
//创建主键为多列的表
mysql> CREATE TABLE orderitems
    -> (
    -> order_num        int     NOT NULL,
    -> order_item       int     NOT NULL,
    -> prod_id          char(10)        NOT NULL,
    -> quantity         int     NOT NULL,
    -> item_price       decimal(8,2)    NOT NULL,
    -> PRIMARY KEY(order_num,order_item)
    -> )ENGINE = InnoDB;
//使用DEFAULT 
mysql> CREATE TABLE orderitems
    -> (
    ->  order_num       int     NOT NULL,
    -> order_item       int     NOT NULL,
    ->  prod_id         char(10) NOT NULL,
    -> quantity         int     NOT NULL DEFAULT 1,
    -> item_price       decimal(8,2) NOT NULL,
    -> PRIMARY KEY(order_num , order_item)
    -> )ENGINE = InnoDB;

//ALTER TABLE  :  更新表
mysql> ALTER TABLE vendors
    -> ADD vend_phone CHAR(20);
//查看表结构
DESCRIBE vendors;
//ALTER TABLE : 删除表的一列
mysql> ALTER TABLE vendors
    -> DROP COLUMN vend_phone;

//删除表
mysql> DROP table customers2;

chap22-使用视图

  1. 视图是虚拟的表,视图只包含使用时动态检索数据的查询;视图不包含表中应该有的任何列或数据,它包含的是一个SQL查询;

  2. 视图的好处:

    • 重用SQL语句;
    • 简化复杂的SQL操作;
    • 使用表的组成部分而不是整个表;
    • 保护数据;
    • 更改数据格式和表示;
  3. 视图的一些限制:

    • 视图必须唯一命名;
    • 视图可以嵌套;
    • ORDER BY可以用在视图中,如果从该视图检索数据的SELECT也包含了ORDER BY,则视图中的ORDER BY将被覆盖;
    • 视图不能索引,也不能有关联的触发器或默认值;
    • 视图可以和表一起使用;
  4. 视图可以一次创建,多次使用;

  5. 视图的另一作用是重新格式化检索出的数据;

  6. 视图主要用于数据检索,是可以更新的,但是以下情况不能更新视图:

    • 分组
    • 联结
    • 子查询
    • 并
    • 聚集函数
    • DISTINCT
    • 导出列
  7. 视图是虚拟的表,不包含数据,而是检索数据的查询,对SELECT语句的层次封装;创建视图后可以像表一样查看视图

CREATE VIEW … AS … ;

//使用视图  VIEW 简化联结SQL 语句书写  productcustomers联结3个表
mysql> CREATE VIEW productcustomers AS
    -> SELECT cust_name, cust_contact, prod_id
    -> FROM customers , orders, orderitems
    -> WHERE customers.cust_id = orders.cust_id
    -> AND orderitems.order_num = orders.order_num;
mysql> SELECT cust_name, cust_contact
    -> FROM productcustomers
    -> WHERE prod_id = 'TNT2';

//用视图格式化数据
mysql> CREATE VIEW vendorlocations AS
    -> SELECT Concat(RTrim(vend_name) , ' (',RTrim(vend_country), ')')
    -> AS vend_title
    -> FROM vendors
    -> Order BY vend_name;
mysql> SELECT *
    -> FROM vendorlocations;

//用视图过滤数据
mysql> CREATE VIEW customeremaillist AS
    -> SELECT cust_id , cust_name, cust_email
    -> FROM customers
    -> WHERE cust_email IS NOT NULL;
mysql> SELECT *
    -> FROM customeremaillist;

//使用视图简化计算字段使用
mysql> CREATE VIEW orderitemsexpanded AS
    -> SELECT order_num,
    ->          prod_id,
    ->          quantity,
    ->          item_price,
    ->          quantity * item_price AS expanded_price
    -> FROM orderitems;
mysql> SELECT *
    -> FROM orderitemsexpanded
    -> WHERE order_num = 20005;

chap23-使用存储过程

  1. 存储过程: 为以后的使用而保存一条或多条MySQL语句的集合,可将其视为批文件;
  2. PROCEDURE可以使用变量:

执行存储过程:

CALL productpricing(@pricelow,

​ @pricehigh

​ @priceaverage);

DELIMITER // : 告诉命名行实用程序使用//作为新的语句分割结束符

IN : 传给存储过程

OUT : 从存储过程传出

INOUT : 对存储过程传入和传出

INTO : 指定变量保存位置

mysql> DELIMITER  //
mysql> CREATE PROCEDURE productpricing()
    -> BEGIN
    ->    SELECT   Avg(prod_price)  AS   priceaverage
    ->    FROM   products;
    -> END //
//使用  ;  作为分割符
DELIMITER ;
//调用
mysql> CALL productpricing();
//删除   注意存储过程后没加()
mysql> DROP PROCEDURE productpricing;

//创建带参数的存储过程 PROCEDURE
mysql> CREATE PROCEDURE productpricing(
    -> OUT      pl      DECIMAL(8,2),
    -> OUT      ph      DECIMAL(8,2),
    -> OUT      pa      DECIMAL(8,2)
    -> )
    -> BEGIN
    ->   SELECT Min(prod_price)
    ->   INTO pl
    ->   FROM products;
    ->   SELECT Max(prod_price)
    ->   INTO ph
    ->   FROM products;
    ->   SELECT AVG(prod_price)
    ->   INTO pa
    ->   FROM products;
    -> END \\

//创建存储过程
mysql> CREATE PROCEDURE ordertotal(
    ->  IN onumber  INT,
    ->  OUT ototal  DECIMAL(8,2)
    -> )
    -> BEGIN
    ->    SELECT  Sum(item_price * quantity)
    ->    FROM orderitems
    ->    WHERE order_num = onumber
    ->    INTO ototal;
    -> END //
//调用
mysql> CALL ordertotal(20005, @total) //
//查看变量值
mysql> SELECT @total //

mysql> CREATE PROCEDURE ordertotal(
    ->          IN   onumber INT,
    ->          IN   taxable BOOLEAN,
    ->          OUT  ototal  DECIMAL(8, 2)
    -> )COMMENT 'Obtain order total , optionally adding tax'
    -> BEGIN
    ->    -- Declare variable for total
    ->    DECLARE total DECIMAL(8,2);
    ->    DECLARE taxrate INT DEFAULT 6;
    ->
    ->    SELECT Sum(item_price * quantity)
    ->    FROM orderitems
    ->    WHERE order_num = onumber
    ->    INTO total;
    ->
    ->    IF taxable THEN
    ->          SELECT total + (total / 100 * taxrate) INTO total;
    ->    ENDIF;
    ->
    ->    SELECT total INTO ototal;
    -> END //

chap24-使用游标

  1. 游标是存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集;

  2. MySQL游标(Cursor)只能用于存储过程和函数;

  3. 游标使用:

    • 在能够使用游标前,必须声明它;
    • 一旦声明以后,必须打开游标以供使用;
    • 对于填有数据的游标,根据需要检索各行;
    • 在结束游标使用时,必须关闭游标;
  4. DECLARE 定义的局部变量必须定义在任意游标或句柄之前,句柄必须在游标之后定义;

DECLARE … CURSOR

FOR

OPEN …

FETCH …

CLOSE …

//更改终止结束符
DELIMITER //
//创建游标
mysql> CREATE PROCEDURE processorders()
    -> BEGIN
    ->   DECLARE ordernumbers CURSOR
    ->   FOR
    ->   SELECT order_num FROM orders;
    -> END //

mysql> CREATE PROCEDURE processorders()
    -> BEGIN
    ->  DECLARE ordernumbers CURSOR
    ->  FOR
    ->  SELECT order_num FROM orders;
    ->  OPEN ordernumbers;
    ->  CLOSE ordernumbers;
    -> END //

mysql> DROP PROCEDURE processorders //

//循环检索数据,从第一行到最后一行
mysql> CREATE PROCEDURE processorders()
    -> BEGIN
    ->  DECLARE done BOOLEAN DEFAULT 0 ;
    ->  DECLARE o INT;
    ->  DECLARE ordernumbers CURSOR
    ->  FOR
    ->  SELECT order_num FROM orders;
    ->  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
    ->  OPEN ordernumbers;
    ->  REPEAT
    ->          FETCH ordernumbers INTO o;
    ->  UNTIL done END REPEAT;
    ->  CLOSE ordernumbers;
    -> END //

mysql> CREATE PROCEDURE processorders()
    -> BEGIN
    ->   DECLARE done BOOLEAN DEFAULT 0;
    ->   DECLARE o INT;
    ->   DECLARE t DECIMAL(8,2);
    ->   DECLARE ordernumbers CURSOR
    ->   FOR
    ->   SELECT order_num FROM orders;
    ->   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done =1;
    ->   CREATE TABLE IF NOT EXISTS ordertotalS
    ->     (order_num INT , total DECIMAL(8,2));
    ->   OPEN ordernumbers;
    ->   REPEAT
    ->      FETCH ordernumbers INTO o;
    ->      CALL ordertotal(o , 1, t);
    ->      INSERT INTO ordertotals(order_num , total)
    ->      VALUES(o,t);
    ->   UNTIL done END REPEAT;
    ->   CLOSE ordernumbers;
    -> END //

chap25-使用触发器

  1. 用于某条语句在事件发生时自动执行,可以使用触发器,MySQL的触发器只响应以下语句:

    • DELETE;
    • INSERT;
    • UPDATE;
  2. 应该保证每个数据库的触发器名唯一;

  3. 使用CREATE TRIGGER 创建触发器

INSERT 插入语句可引用一个NEW的虚拟表;

DELETE触发器可以引用OLD的虚拟表;

UPDATE触发器可以引用OLD和NEW虚拟表;

//创建触发器
mysql> CREATE TRIGGER newproduct AFTER INSERT ON products
    -> FOR EACH ROW SELECT 'Product added' //
//删除触发器
DROP TRIGGER newproduct;

chap25-管理事务处理

  1. 事务处理保证成批的SQL操作要么完全执行,要么完全不执行;
  2. 事务处理:用来管理必须成批执行的MySQL操作,以保证数据库不包含不完整的操作结果;
  3. 一般的SQL语句是针对数据库表执行和编写的,提交操作是自动进行的,在事务处理块中,提交不会隐含地进行;

事务: TRANSACTION

回退:ROLLBACK

提交:COMMIT

保留单:SAVEPOINT

SELECT * FROM ordertotals;
START TRANSACTION;
DELETE FROM ordertotals;
SELECT * FROM ordertotals;
ROLLBACK;
SELECT * FROM ordertotals;

START TRANSACTION;
DELETE FROM orderitems WHERE order_num = 20010;
DELETE FROM orders WHERE order_num = 20010;
COMMIT;

//使用保留点
SAVEPOINT delete1;
ROLLBACK TO delete1;

//更改默认提交行为
SET autocommit = 0;

chap27-全球化和本地化

  1. 概念:
    • 字符集:字母和符号集合
    • 编码:某个字符集成员的内部表示
    • 校对:规定字符如何比较的指令
//查看支持字符集列表
SHOW CHARACTER SET;
//查看校对
SHOW COLLATION;
...

chap28-安全管理

  1. 获取用户列表:

    USE mysql;
    SELECT user FROM user;
    
  2. 创建用户账号:CREATE USER ben IDENTIFIED BY '123';

  3. 用户名重命名:RENAME USER ben TO bforta;

  4. 删除用户: DROP USER ben;

  5. 查看访问权限:SHOW GRANTS FOR bforta;

  6. 设置权限:GRANT SELECT ON crashcourse.* TO bforta;

  7. 更改口令(密码):SET PASSWORD FOR bforta = Password('12rrre');

chap29-数据库维护

…

chap30-改善性能

…

使用 Visual Studio Code(VS Code) 连接 Mysql 数据库 How to connect MySQL to VS Code 案例背景: 最近重拾SQL Cookbook - Anthony Molinaro,就想着配置个Mysql数据库,用VS Code作为编辑器练练手 1、准备工作 1.1 Visual Studio Code 下载安装 VS Code 官网下载链接 1.2 MySQL 8 下载 MySQL 社区版链接 对于自己使用的话,就下载MySQL的社区版,下载之后都基本默认安装... 阅读详情

相关推荐

EF Code First 连接Mysql

先前看了很多文章,尝试了很多次总是进行不下去,实在是鄙人太小白了,今天弄成功了,整理一下,以便日后查看,如有雷同,纯属我抄你。一. 下载插件MySQL-Connector-net-6.9.9 https://cdn.mysql.com//Downloads/Connector-Net/mysql-connector-net-6.9.10.msiMySQL for Visual Studio  ht...

jsyzlinchen的博客 2515

MySQL必知必会随书源码

【代码】MySQL必知必会随书源码。

见龙在田的博客 387

EFCore 去使用 Mysql 搭建 Code First

需要的包: 创建实体类 实现DbContext 注入DbContext到容器 添加MySql连接配置到配置文件 Code First 去做数据迁移 生成EF Core 迁移: dotnet ef migrations add InitialCreate 似乎出错了,对这个地方的连接配置有问题,我们修改它为 然后再看 ,它是成功了 接下来我们更新数据库: dotnet ef database up...

qq_27519673的博客 866

MySQL《必知必会》源码 一

SQL语句特性: ## SQL语句以 &amp;quot; ; '&amp;quot; 结尾 ## 不区分大小写和空格 ## 建议关键词全大写方便阅读 1. 登录相关 ## 登录MySQL mysql -u kuang -p (-h hostserver -P 3306) ## 退出 exit; 2. 使用MySQL相关 ## 显示所有数据库 SHOW DATABASES; ## 选择数据库 USE s...

gongyu3075的博客 1614

DB2数据库CODE码

DB2数据库CODE码,DB2 SQLCode.pdf

【数据清洗】数据清洗流程及经验

预处理阶段 预处理阶段主要做两件事情: 一是将数据导入处理工具。 二是看数据。包含两个部分:一是看元数据,包括字段解释、数据来源、代码表等等一切描述数据的信息;二是抽取一部分数据,对数据本身有一个直观的了解,并且初步发现一些问题,为之后的处理做准备。 第一步:缺失值清洗 四个步骤: 1、确定缺失值范围:对每个字段都计算其缺失值比例,然后按照缺失比例和字段重要性,分别制定策略。 2、去除不需要的...

JoJo93723的博客 6490

mysql code函数_MySQL函数

MySQL数据库中提供了很丰富的函数。MySQL函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数、格式化函数等。通过这些函数,可以简化用户的操作。例如,字符串连接函数可以很方便的将多个字符串连接在一起。一、数学函数ABS(X):返回X的绝对值。select ABS(-32);MOD(N,M)或%:返回N被M除的余数。select MOD(15,7);select ...

weixin_31040783的博客 582

宝塔面板全栈部署指南:Node后端+React前端与数据库配置实战

本文提供了一份详尽的宝塔面板全栈部署实战指南,涵盖Node.js后端、React前端与数据库的完整配置流程。文章深入解析了环境准备、数据库创建与导入、Node服务部署、PM2进程守护、React应用构建与托管,以及线上环境变量管理与安全配置等核心步骤,帮助开发者高效、稳定地将项目部署至生产环境。

weixin_29232121的博客 89

mysql基础

小数部分为.5或更大的值向上取整为下一个整数,如果为正或向下 下一个整数如果为负数 (换句话说,它是从零开始舍去的。在ORDER BY或GROUP BY子句中使用带有RAND()值的列可能会产生意外结果,因为对于任一子句,RAND()表达式可以针对同一行进行多次评估,每次都返回不同的结果。如果没有匹配的结果值,则返回结果为ELSE后的结果,如果没有ELSE 部分,则返回值为 NULL。返回X的反余弦值,即余弦值为X的值。答:C((1,a),(2,a),(3,a),(1,b),(2,b),(3,b))

ywc 1263

WebVTT中的文本轨道(Text Tracks,TT)到底是什么鬼?

WebVTT,全称是The Web Video Text Tracks Format,意思是网络视频文本轨道格式。那么到底什么是文本轨道(Text Tracks)呢?这篇文章希望一探究竟。

码农1479的博客 1985

FoundationPose复现及Realsense应用

FoundationPose是一个统一的基础模型,用于6D对象姿态估计和跟踪,支持基于模型和无模型的设置。在测试时可以立即应用于未见过的新对象,无需微调,只要给出其CAD模型,或者捕获少量RGBD参考图像。得益于统一框架,下游姿态估计模块在两种3D模型设置中都是相同的,当没有CAD模型时,使用神经隐式表示进行高效的新视角合成。通过大规模合成训练,辅以大型语言模型(LLM)、一种基于transformer的新架构和对比学习公式,实现了强大的泛化能力。

m0_56661101的博客 1万+

MySQL必知必会

MySQLMySQL必知必会数据检索排序 MySQL必知必会 数据检索 LIMIT使用,第一个参数为开始位置,第二个参数为要检索的行数,例如 SELECT * FROMcityLIMIT 1,1 where子句中,and的优先级高于or like 通配符 - 只匹配单个字符 %配置多个字符 使用正则表达式 REGEXP 正则 搜索两个串之一, 匹配 | 例如SELECT * FROMcityWHERE CountryCode REGEXP 'ABW|AFG'; 排序 order by

yyn次元的专栏 352

倍福CX9020(WINCE 7)控制器使用方法和操作

CX9020系列是倍福控制器中较为经济的,操作系统为Windows Embedded Compact 7(简称WINCE7或WINEC7),相对高端控制器(WINES7以上系统),操作系统古老而简洁,上位机软件的编写困难很多,本文是笔者在使用过程中摸索的流程,旨在为CX9020系列的新用户提供参考,也可供其他CE系统的控制器参考。本文中大部分截图采用倍福中国的培训文档,这是由于笔者是在流程走通后再写这篇文章,不想再恢复出厂设置走一遍截图。因笔者在写这篇文章时使用倍福控制器经验并不丰富,难免有纰漏,请读者批评

weixin_41883890的博客 4286

使用 VS Code 连接 MySQL 数据库

使用VS Code连接数据库、导入导出数据

二哈喇子! 8万+

基于RK3568的YOLOv11模型端侧推理优化与部署实战指南

在AI边缘计算领域,瑞芯微RK3568芯片凭借其强大的NPU算力和丰富的接口资源,成为了众多开发者的首选平台。然而,瑞芯微官方文档虽然提供了YOLO11预训练模型的部署方案,但对于需要自定义数据集训练的开发者来说,从模型训练到板端部署的完整流程却缺乏详细指导。本文将带你走完从环境搭建、数据准备、模型训练到最终板端部署的完整技术路线,并分享实际开发中遇到的各种坑点和解决方案。让我们一起探索如何在RK3568平台上实现30FPS稳定推理的YOLO11目标检测应用!

m0_64661770的博客 115

【FPGA教程案例49】控制案例1——基于FPGA的PID控制器verilog实现

PID控制器产生于1915年,PID控制律的概念最早是由LYAPIMOV提出的,到目前为止,PID控制器以及改进的PID控制器在工业控制领域里最为常见。PID控制器(比例-积分-微分控制器),由比例单元 P、积分单元 I 和微分单元 D 组成。通过Kp,Ki和Kd三个参数的设定。PID控制器主要适用于基本线性和动态特性不随时间变化的系统。图1为PID控制器的基本结构框图。PID控制器以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。...

FPGA/MATLAB学习教程/源码/项目合作开发 4527

使用Visual Studio Code 通过 Java 连接 MySQL 数据库

Visual Studio Code中通过Java连接MySQL数据库的步骤

djxinqing的博客 2645

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Windows Claude Code配置MySQL MCP插件

本文记录了在Windows 11系统下为Claude Code配置MySQL MCP插件的实践过程。作者尝试了三款插件:database-server、mysql_mcp_server和mcp-server-mysql,详细说明了各插件的安装配置步骤及测试方法。重点展示了如何通过npm安装、环境变量配置及项目隔离管理来实现AI对MySQL数据库的查询操作,并提供了Windows平台特有的路径处理方案。文中指出不同插件在SQL语句限制和操作权限控制方面的差异。

YuArai的博客 6759

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Claude Code 接入 MySQL

本文介绍了如何通过MySQL MCP Server让AI模型直接连接数据库,提升开发效率。在测试环境下,开发者无需反复向AI解释表结构和接口,只需安装并配置MCP服务即可。具体步骤包括:1)通过npm安装MySQL MCP;2)启动服务并添加到Claude Code;3)验证连接状态。配置过程中需要注意设置数据库连接参数和操作权限,建议采用项目级配置而非全局配置。该方案能显著减少开发沟通成本,使AI可直接读取数据库辅助编码和SQL优化。

蔡定努 5062

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

web开发环境配置 | VS Code+Maven+Tomcat+mysql

这篇博客主要是写一个web项目需要的基本配置,以及如何在VS Code将各种软件功能集成在一起。

Leonadoice的博客 4982

如何优雅的在VS Code里面使用MySql

vscode配置mysql前言vs code介绍vs code下载以及语言配置开始配置mysql一,下载插件二,连接数据库三,MySQL在vs code中的使用插件卸载 前言 如果你是一个小白的话(本人亦是初学),这个编译器和这个插件都能帮到你,跟着配置没什么大问题。如果不是小白的话,也请不要绕道,请帮忙斧正。另外,使用MySQL不止vs code能配置,pycharm,VS之类的都可以。 vs code介绍 Visual Studio Code(简称“VS Code” )是Microsoft在2015年4

qq_56630261的博客 2万+

使用VS Code的MySQL扩展管理数据库

我将在本文告诉你如何用VS Code的扩展程序管理MySQL数据库,包括连接到MySQL、新建数据库和表、修改字段定义、简单的查询方法以及导入导出。 在许多情况下,我们需要随时查看数据库的记录来确保程序是否正确执行。也有许多工具提供了可视化的界面来帮助我们实现这些功能,例如phpMyAdmin(需要安装PHP和Web服务器)、Navicat(强大的SQL管理工具,但需要商业授权),也有一些免费的工具可以使用,如Workbench、Sequel Pro、HeidiSQL等等。当然你也可以直接使用mysq.

wdjnb的博客 1510

c code first mysql_VS Code First使用Mysql数据库详解

最近电脑出毛病了,自己装显卡驱动给装死了开不了机,自己研究了两天也没解决,只有去修电脑的找专业人员,说起来惭愧,虽然自己是搞计算机的可电脑自己重装系统都还搞不定。重装系统又清理灰尘花了50大洋,现在用着感觉开机都快了好多。关于VS使用Mysql数据库原本上周就打算写一博客,一直拖到现在。一、Mysql的安装首先肯定是安装VS,这都不必再说的。其次是下载Mysql,网址http://dev.mysq...

weixin_42516710的博客 312

在Visual Studio Code中设置MySQL源码调试环境

以上步骤涵盖了在VS Code中设置MySQL源码调试环境的主要过程,是一个相对高级的任务,旨在为希望建立强大开发和调试环境的开发者提供指引。在VS Code中,你需要安装C/C++扩展(例如Microsoft的C/C++ for Visual Studio Code),以获得源码索引、智能提示和调试功能。完成上述配置后,在VS Code中打开你需要调试的MySQL源文件,打上断点,然后从运行和调试侧边栏选择"Debug MySQL"配置,点击绿色的播放按钮启动调试。命令配置编译选项,并编译源码。

rit8432499的博客 518
上一篇: 什么是差分数组?(转载)
下一篇: 字符串KMP算法理解
hellohake
博客等级 码龄10年 4543粉丝 108原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值