mysql 要完 知乎_必知必会 MySQL笔记(未完)

- 知乎对于md的支持还是比较差,由于原文我是记录在有道云笔记中所以图片有些模糊,希望能够对初学者有些帮助。

数据库引擎 Innob csv ....

==主键与外键== - 主键是一列或者一组列可以区分表中每个行 - 不更新主键中的值 - 主键列中的值不重复 - 不在主键列中使用可能会修改的值 - 外键在表中包含了某一个列表中的主键值

第八章使用通配符的技巧使用通配符前需要使用LIKE操作符

%通配符标识匹配相应文字如

SELECT prod_id,prod_name from products where prod_name LIKE 's%e';

%在两侧未匹配内部相应文字%anvil%%在后侧匹配以前面字母为开头 的句子jet% 3. ' _ '通配符表也表示匹配相应文字信息,**但是与前者的区别在于'_'通配符 只匹配一个字节:SELECT prod_id,prod_name from products where prod_name LIKE '_ ton anvil';

SELECT prod_id,prod_name from products where prod_name LIKE '%ton anvil';

两个通配符的区别%为全部适配‘_’只是适配前一个字节

第九章用正则表达式进行搜索REGEXP 作为正则表达式前的操作符使用与LIKE相同REGEXP 与LIKE的区别;LIKE操作符为匹配整个列中的值 而REGEXP为自动匹配整个列中含有相应部分的值 SELECT prod_name from products WHERE prod_name LIKE '1000'; 上面使用LIK匹配列中为‘1000’的值,但是结果为空。此时我们改变一下筛选内容 SELECT prod_name from products WHERE prod_name LIKE 'JetPack 1000';

REGEXP中实现匹配内容中含有'1000'的字符只需要 SELECT prod_name from products where prod_name regexp '1000';

OR 通配符查询列表中含有1000或2000的值 SELECT prod_name from products where prod_name regexp '1000|2000';

匹配几个字符之一使用形式为'[ ] + 'string'使用 SELECT prod_name FROM products where prod_name REGEXP '[123] Ton';

上面形式还可标识为[1|2|3] +'string'的形式使用 SELECT prod_name FROM products where prod_name REGEXP '[1|2|3] Ton';在[^123]通配符别变为否定语句,意为:匹配出123之外的情况 SELECT prod_name FROM products where prod_name REGEXP '[^123] Ton';

匹配范围上面获取[123] Ton的值可以将其修改为[1-3] Ton进行匹配 select prod_name from products where prod_name REGEXP '[0-3] Ton'; 但是当我们修改结果为[0-3]时,会发现0.5并不会匹配进来,原因是列中值并不含有0.5我们想要匹配的 .5 Ton 值并不含有0 如果想要匹配相应值需要将内容修改为[1-5]进行匹配,使用5进行匹配 select prod_name from products where prod_name REGEXP '[1-5] Ton';

匹配特殊字符如果想要匹配列表中的'.'值,需要使用\\进行匹配

==为了匹配反斜杠本身需要输入'\\\'==

空白元字符匹配字符类字符类匹配多个实例重复元字符?字符匹配一个或i这0个 例如:stick与sticks 使用stick?都可过滤出来,其中?进行s的匹配

==实例中使用了select prod_name from products where prod_name regexp '[[:digit:]]{4}' order by prod_name;语句其中在正则表达式进行筛选是使用了[[:digit:]]的表达方式这是对照上表中[:digit:]对照0-9范围如果将其中一个[]取消则会筛选错误,另外在[[:digit:]]{4}之间加空格也是错误点的表达,结果将不会出现任何匹配==

定位元字符定位元字符表巩固之前的知识点 OR通配符可以表示为[] 其中上面的匹配字符使用[]标记表示为所有情况,所以使用定位元字符表示以数字或标点.(其中标点.类特殊字符需要使用\.表示)可以得到相应正则表达式[:digit:\.],执行代码为:select prod_name from products where prod_name regexp '[:digit:\\.]' order by prod_name;如果想要查询以数字和标点开头的列表可以使用定位元字符^进行定位:select prod_name from products where prod_name regexp '^[[:digit:]\\.]' order by prod_name;

创建(Concatenate)计算字段拼接字段关键字Contact() select concat(vend_name,'(',vend_country,')') from vendors order by vend_name; 连接字符使用,进行连接.

RTrim() 去除右侧空格 LTrim() 去除左侧空格 Trim()去除两侧空格

使用别名(导出列) 关键词 AS 将上面代码进行改动通过AS 关键词赋予别名select concat(vend_name,'(',vend_country,')') AS vend_title from vendors order by vend_name;执行算术计算使用别名expanded_price表示计算出的价格,代码: select prod_id,quantity,item_price,quantity*item_price AS expanded_price from orderitems where order_num = 20005;

- 常规计算方式为: + - * /

使用数据处理函数文本函数

RTrim()

Upper() select vend_name Upper(vend_name) as vend_name_upcase from vendors order by vend_name;

常用文本处理函数soundex函数soundex是将任何文本转换为描述其语音表示的字母数字模式的算法。soundex考虑了类似的发音字符和字节,使得能对串进行发音比较而不是字母比较。select cust_name,cust_contact from customers where soundex(cust_contact) = soundex('Y Lie');

时间处理函数

select cust_id,order_num from orders where order_date = '2005-09-01';

常用数值处理函数

第十二章 汇总数据聚集函数聚集函数表格‘*’取整列的值

聚集不同值AVG(DISTINCT prod_price) as avg_price

组合聚集函数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 BYselect vend_id ,count(*) as num_prods from products group by vend_id;

过滤分组 关键词 HAVINGHAVING 与 WHERE的区别在于HAVING过滤分组 WHERE过滤行

列出具有两个顾客并且顾客在过去一段时间消费数量为10以上的名单

select vend_id,count(*) as num_prods from products where prod_price >= 10 group by vend_id having count(*) >=2; having关键词后可以使用别名num_prods与count(*)效果相同。

分组与排序order by 关键词 与having一起使用

select vend_id,count(*) as num_prods from products where prod_price >= 10 group by vend_id having count(*) >=2 order by num_prods desc;

- select子句顺序

graph LR

select-->from

from-->where

where-->gruopby

groupby-->having

having-->orderby

orderby-->limitLIMIT 关键词为要检索的行数 select vend_id from vendors;

where 过滤语句

select vend_id from vendors limit 1,3;

第十四章 使用子查询可以理解为嵌套查询 代码:

select cust_name,cust_state,

(select count(orders.cust_id)

from orders

where orders.cust_id = customers.cust_id) as orders

from customers

order by cust_name;

通过查询orders列表中客户的ID串联两个列表获得customers信息以及orders中的客户相应订单数量

第十五章 联结表select vend_name,prod_name,prod_price from vendors , products where vendors.vend_id = products.vend_id order by vend_name,prod_name;

是指在有必要的情况下将信息存储在两个数据库中,其中使用一条两个列表都含有的列作为连接

能适应不断增加的工作量而不失败。设计良好的数据库或应用程序称之为==可伸缩性好==

内部联结 关键词 INNER JOIN -- ON select vend_name,prod_name,prod_price from vendors inner join products on vendors.vend_id = products.vend_id; 在上面示例中使用inner join关键里连接products并且将过滤条件传递到on关键词后面,完成了和本章第一个示例中一样的查询条件。

基于两个表之间的相等测试,这种联结成为等值联结也被称为内部联结

联结多个表 代码见第一个示例,表示多个列表将通过等值连接,比如示例中的id信息作为联结关键词。

第十六章 创建高级联结对列使用别名 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';

不同的联结类型自联结 通过查询自己表内与之相同的关键词进行检索 select prod_id,prod_name from products as p1,products as p2 where p1.vend_id = p2,vend_id and p2.vend_id = 'DTNTR'; 为了避免由于引用同一个列表而出现的二义性,所以可以将列表进行命名

自然联结 重点为通配符‘*’ 理解为:由于多个列表采用vend_id进行联结所以在多个列表进行组合时希望每一个列表都是唯一的,所以我们将会采用对其中一个数据列表采用全部显示,而其他列表的列值则需要准确列举。 select c.*,o.order_num,o.order_num,oi.prod_id,oi.quantity,oi.item_price where c.cust_id = o.cust_id and oi.order_num = o.order_num and prod_id = 'FB'; 上面例子表示了++自然联结++三个表的值并且使得显示的列表显示唯一值。

可以看到联结了三个列表新的列表中不含有相同的值外部联结 关键词 RIGHT/LEFT OUTER -- ON select customers.cust_id,orders.order_num,orders.cust_id as o_id from customers left outer join orders on customers.cust_id = orders.cust_id;使用关键词right\left表达联结方向,如果是right则表示右边的表格的所有行匹配左侧的值如果为left则相反

通过查询进行比较两个的区别可以发现区别

Right

Left 我们可以发现由于是left所以使用customer列表中所有行匹配右侧order列表的行数。及以左侧为准匹配右侧

通过上下两个数据库内容可以发现order中并没有id为10002的顾客所以显示null如果是使用right关键词则可以发现左侧customer并没有获得10002的值,因为customer列表中没有'10002'id的顾客。使用inner join函数进行内部联结发现效果与right一致,是因为内部联结本质上等同于等值连接,列表内部id=10002数据没有,所以按照相等的筛选规则将不会出现10002 相关行 - 使用聚集函数联结

select customers.cust_name,customers.cust_id,count(orders.order_num) num_ord from customers inner join orders on customers.cust_id = orders.cust_id group by customers.cust_id;

第十七章 组合查询关键词 UNION应用场景必须大于两个select查询语句

查询的列名称必须一致并且内部函数可以进行隐形转换 select prod_name,prod_price ..... union select prod_name,prod_price .....

UNION ALL union函数将会进行重复性检索将相同的行进行归并,如果想要显示所有的行需要使用 UNION ALL函数

order by 函数用于联结式结束之后

第十八章 全文本搜索 ==Innob搜索引擎不支持全文本搜索MyISAM支持==启用全文本搜索需要在创建数据表格时对相应索引列增加FULLTEXT

关键词 match() against() select note_text from productnotes where match(note_text)against('anvils' );

关键词使用查询拓展 with query expansion 根据查询搜索会将与前面单词有关联的语句全部找出 ``` select note_text from productnotes where match(note_text)against('anvils' with query expansion);

- 关键词布尔文本搜索

in boolean mode select note_text from productnotes where match(note_text)against('anvils' in boolean mode);

全文本布尔操作符 布尔操作符

select note_text from productnotes where match(note_text) against('+rabbit+bait' in boolean mode); against('-reop*' in boolean mode); against('>rabbit

第十九章 插入数据关键词 INSERT 使用方式 insert into 数据表名()

可以使用LOW_PRIORITY降低插入数据擦偶哦在的优先级,适用于与select等语句冲突的时候

插入多行数据可以使用 insert into customers() values().();

插入检索出的数据 insert into customers()select()from newcustomers;

列表加入安装书写顺序加入,别名与列名对插入数据没有影响

第二十章 删除和更新数据数据库没有撤销(undo)按钮

删除数据

关键词DELETE

delete from customers where cust_id = '10005';

更新数据关键词 UPDATE update customers set cust_eamil = '*****@**.com' where cust_id = '10005';

如果行中值允许为null,那么删除一些数据时可以采用set cust_email = null;的办法删除值

第二十一章 创建和操纵表

关键词 CREAT TABLE 创建表 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(5) NULL ,

vend_zip char(10) NULL ,

vend_country char(50) NULL ,

PRIMARY KEY (vend_id)

) ENGINE=InnoDB;需要将列名进行定义且列名称不能重复,需要在创建时指定主键(primary key) engine为指定相应搜索引擎

AUTO_INCREMENT列表没增加一个数据自动生成一个自动增量

可以使用select last_insert_id()查询

NULL在创建列表时需要制定相应行数据是否能为空NULL/NOT NULL

关键词 ALERT TABLE 更新表 ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_orders FOREIGN KEY (order_num) REFERENCES orders (order_num);

关键词 DROP TABLE 永久删除该表(删除整个表而不是内容) drop table customer02;

关键词 RENAME TABLE TO 重命名表格 rename table customers02 to customers03; 如果对多个表格进行重命名操作,之间使用','进行分割

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值