MySQL 基础学习笔记

1、关键字DISTINCT是作用在所有列上的而不仅仅是前置它的列。

2、DESC关键字:如果想在多个列中进行降序排列,必须对每个列指定DESC关键字。 如:

SELECT * FROM table t ORDER BY t.a DESC, t.b DESC, t.c DESC;

3、MySQL在执行匹配时不区分大小写。如WHERE t.name=”fuses”,可以找到fuses、Fuses、fUses等。

4、MySQL在搜索匹配(用LIKE和通配符搜索匹配)时,区分大小写。比如:LIKE ’jet%’ 不能匹配到 JetP、jEtPAAA等。

5、BETWEEN AND 是开区间。

6、SQL中,AND关键字的优先级比OR要高,所以会优先计算,要改变优先级,可以用小括号。

7、MySQL中的NOT : MySQL支持使用NOT对IN、BEWTEEN 和 EXSTS 字句取反,这与大多数其它DBMS允许使用NOT对各种条件取反有很大区别。

8、AVG()、COUNT()、MIN()、 MAX()忽略NULL行。

9、为在搜索子句中使用通配符,必须使用LIKE关键字。LIKE指示MySQL后面的搜索模式利用通配符匹配而不是直接相等匹配进行比较。

10、通配符 (1) % :匹配任何字符出现任意次数。注意%匹配不了NULL;即使使用:select * from user where password LIKE '%',也匹配不了NULL,这个可以语句会报错。 (2) _ (下划线):匹配一个字符(不能多也不能少)。

11、MySQL与正则表达式结合使用,使用关键字REGEXP,如:

扫描二维码关注公众号,回复: 947923 查看本文章
 select * from user where password REGEXP '0';

12、LIKE和REGEXP的区别: (1)LIKE匹配整个列; (2)REGEXP在列值内进行匹配; (3)LIKE匹配整个串而REGEXP匹配子串;

13、注意:MySQL 中的正则表达式匹配(自从3.23.4后)不区分大小写!!为了区分大小写,可以使用BINARY关键字,如WHERE p.a REGEXP BINARY ‘hiSaaS’;

14、多数正则表达式实现使用单个反斜杠(\)转义特殊字符,以便能使用这些字符本身。但MySQL中要求使用两个反斜杠(MySQL解析一个,正则表达式解析另外一个)。

15、正则中“^”有两种用途: (1)用在“[ ]”里面,表示对里面的集合的否定; (2)否则,用作定位符,表示串的开始处。

16、GROUP BY: (1)如果分组中有NULL值,则将NULL作为一个分组; (2)GROUP BY必须在WHERE之后,ORDER BY之前分组。

17、WHERE 和 HAVING的区别: (1)WHERE过滤行,HAVING过滤分组,所有的WHERE都可以由HAVING支持; (2)WHERE在数据分组前过滤,HAVING在数据分组后过滤。

18、SELECT子句的顺序: SELECT、 FROM、 WHERE、 GROUNP BY、 HAVING、 ORDER BY、 LIMIT

19、应该保证所有联结(如WHERE:a.id = b.id )都有WHERE子句,否则返回的是笛卡尔积的连接类型。

20、联结(如WHERE:a.id = b.id )的表越多,性能越低。

21、组合查询: (1)有两种两情况需要使用组合查询的:

  • 在单个查询中从不同的表返回类似结构的数据;
  • 对单个表执行多个查询,按单个查询返回数据; (2)UNION几乎总是完成与多个WHERE条件相同的工作。 (3)UNION是默认对总结果去重的,如果需要返回所有不去重的结果,可以使用UNION ALL。 (4)UNION的使用规则:
  • UNION必须由两条或者两条以上的SELECT语句组成,语句之间用关键字UNION分隔。
  • UNIION中的每个查询必须包含相同的列、表达式或者聚合函数,不过各个列不需要以相同的次序出列出。
  • 列数据必须兼容:类型不必完全相同,但必须是DBMS可以隐含的转换的类型(例如:不同的数值类型或 不同的日期类型)。
  • 用UNION组合查询时,只能用一条ORDER BY 对总结果排序(不能单独对某个SELECT语句排序),ORDRE BY必须出现在最后一条SELECT语句之后。

22、如何在使用AUTO_INCREMENT列时获得这个值?可使用last_insert_id()函数获得这个值,如 SELECT last_insert_id();

23、外键不能跨引擎。外键(用于强制实施引用完整性)不能跨引擎,即使用同一个引擎的表不能引用具有使用不同引擎的表的外键。

24、全文本搜索 引擎MyISAM支持全文本搜索,而InnoDB不支持。 (1)启动全文搜索支持,使用FULLTEXT:

CREATE TABLE `productnotes` (
  `note_id` int(11) NOT NULL AUTO_INCREMENT,
  `prod_id` int(11) DEFAULT NULL,
  `note_date` datetime DEFAULT NULL,
  `note_text` text,
  PRIMARY KEY (`note_id`),
  FULLTEXT KEY `note_text` (`note_text`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

(2)可以在创建表时指定全文搜索(FULLTEXT),也可以在建好后稍后指定数据。不要在导入数据时使用FULLTEXT,因为更新索引需要花时间。 (3)全文搜索不区分大小写。 (4)使用方式:

SELECT
	note_text,
	MATCH (note_text) AGAINST ('rabbit') AS rank
FROM
	productnotes;

(5)查询扩展:利用查询扩展可以找出可能相关的结果,即使它们并不精确包括所查找的词,用法:

SELECT
	note_text,
	MATCH (note_text) AGAINST ('rabbit' WITH QUERY EXPANSION) AS rank
FROM
	productnotes;

(6)布尔文本搜索方式(更加细致的查找控制):

SELECT
	note_text,
	MATCH (note_text) AGAINST ('rabbit' IN BOOLEAN MODE) AS rank
FROM
	productnotes;

25、插入语句: (1)可以在INSERT INTO之间添加关键字LOW_PRIORITY,指示MySQL降低INSERT语句的优先级,以提高整体性能,如下:

INSERT  LOW_PRORITY INTO 

(2)INSERT SELECT 语句用法(插入检索出的数据):

INSERT INTO productnotes(prod_id) SELECT product.code FROM product;

26、更新语句: (1)在UPDATE语句中使用SELECT子查询:

UPDATE productnotes p, (SELECT product.num, product.id FROM product ) temp SET p.note_text=temp.num WHERE temp.id = p.prod_id;
  •  注意点:
  • 在mysql中更新时不能将更新的表作为查询的表。
  • update 时,更新的表不能在set和where中用于子查询;
  • update 时,可以对多个表进行更新(sqlserver不行);          如:update ta a,tb b set a.Bid=b.id ,b.Aid=a.id;  
  • update 后面可以做任意的查询,这个作用等同于from; (2)在用UPDATE语句更新多行,并且更新这些行的一行或者多行时出现一个错误,则整个UPDATE操作被取消(错误发生前更新的所有行被恢复到它们原来的值)。但如果使用了IGNORE关键字,即使发生错误,也可以继续更新,如下使用:
UPDATE IGNORE product SET ……

27、删除语句DELECT:

  • 删除行,但不删除表本身;
  • 更快的删除:TRUNCATE table:它实际上删除了原来的表,并重新创建一个表,而不是逐条删除,速度更快;

28、ALTER TABLE的一种常见用途是定义外键,如:

ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_products FOREIGN KEY( order_num ) REFERENCES orders(order_num);

29、视图的规则和限制 (1)与表一样,视图必须唯一命名(且不能与表名相同)。 (2)对于可以创建的视图数目没有限制。 (3)为了创建视图,必须具体足够的访问权限。 (4)视图可以嵌套,即可以利用从其它视图中检索数据的查询来构造一个视图。 (5)ORDER BY可以在视图中,但如果从该视图检索数据的SELECT语句中也含有ORDER BY,那么该视图中的ORDER BY将被覆盖。 (6)视图不能索引,也不能有关联的触发器或者默认值。 (7)视图可以和表一起使用。

30、存储过程

  • 优点: (1)通过把处理封装在容易使用的单元中,简化复杂的操作。 (2)由于不要求反复建立一系列处理步骤,保证了数据的完整性。 (3)简化对变动的管理。如果表名、列名或者业务逻辑有变化,只需要更改存储过程的代码。使用它的人不需要知道它的变化。 (4)提高性能。因为使用存储过程比使用单独的SQL语句要快。 (5)存在一些只能用在单个请求中的MySQL元素和特性,存储过程可以使用它们来编写功能更灵活的代码。
  • 缺点: (1)存储过程的编写比基本SQL语句复杂,编写存储过程需要更高的技能,更丰富的经验。 (2)创建存储过程需要安全访问权限。需要管理员授予权限。

31、不像大多的DBMS,MySQL游标只能用于存储过程(和函数)。

32、一个使用触发器后的实际例子:在插入数据后,返回刚插入数据的id。 触发器的写法例子:

CREATE TRIGGER neworder_tri ALTER INSERT ON orders FOR EACH ROW SELECT NEW.order_num;
33、MySQL是默认自动提交所有更改的,如果需要修改则使用:SET autocommit = 0;

34、校对在对用ORDER BY子句检索出来的数据排序时起重要的作用。如果你需要用与创建表时不同的校对顺序排序特定的SELECT语句,可以在SELECT语句自身中进行:

SELECT * FROM customers ORDER BY lastname, firstname COLLATE latin1_general_cs;

解释:latin1_general_cs是一种检验,其中COLLATE是使用校验的关键字。

35、COLLATE除了使用在SELECT里面,还可以用于GROUP BY、HAVING、聚集函数、别名等。

36、创建用户账户: CREAT USER ben IDENTIFIED BY ‘password’; 解释:IDENTIFIED BY ‘password’表示给用户一个口令。

37、官网资料:https://dev.mysql.com/doc/

猜你喜欢

转载自my.oschina.net/u/3696939/blog/1599797