光看书没啥用,大家还是要多敲代码,实验楼进行巩固还是很不错的。
导入sql数据,语句需使用source。我在用source语句时,将绝对路径补全
路径中\在Windows中要改成/最好将关键字用大写输入,数据用小写输入
DESCRIBE可用来表示SHOW COLUMNS FROM
SQL语句中,所有的空格都被忽略了
有时很奇怪,两句语句明明一样但是就是错误,第二次能成功
LIMIT 4 OFFSET 3和LIMIT 3,4一个意思,从第三行开始取四行
按多个排序时,先跟在ORDER BY后面的是主要顺序,从主到次展开
DESC放在哪个列名后面,哪个就按降序排序,对其他列不造成任何影响
过滤数据中运用排序,那么WHERE应该在ORDER BY前面
<>和 !=都表示不等于;BETWEEN表示在指定的两个值之间
MYSQL在执行匹配时默认不区分大小写
WHERE后可以接逻辑判断句
AND 和 OR优先处理AND,所以会将部分语句当做一个条件,可以使用括号来隔开
搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示MySQL,后跟的搜索模式利用通配符匹配而不是
直接相等匹配进行比较。
通配符是用来匹配值的一部分的特殊字符百分号通配符:%表示任何字符出现任意字符,可以用来指示字符中的内容。XXX%,找出以XXX起头的词
而%XXX%表示可以在字符任意位置出现XXX。尾空格会干扰通配符匹配。NULL不能被匹配下划线通配符只匹配一个字符。
通配符搜索花费时间更长,确实需要通配符时,否则不要用在搜索模式的开始处。
正则表达式关键字是REGEXP.LIKE不能匹配在列值中的文本,而正则表达式可以
正则表达式中[123]表示[1|2|3]
MySQL中用\\表示转义,MySQL自己解释一个,正则表达式解释一个
^可以用来表示开头,也可用来表示否定
不用数据库表中SELECT用正则表达式将返回0或1
计算字段是运行时在SELECT语句内创建的。
如果指定列名,则DISTINCT只能用于COUNT()。DISTINCT不能用于COUNT(*),因此不允许使用COUNT(DISTINCT)
分组是在SELECT语句的GROUP BY子句中建立的。语法:
SELECT vend_id, COUNT(*) AS num FROM products GROUPS BY vend_id;
GROUP子句中不能使用别名
利用WHERE过滤指定的是行而不是分组,且WHERE没有分组的概念。
使用HAVING子句来进行过滤分组.即WHERE是分组前进行过滤的,而HAVING是在分组后过滤的
在联结表时,一般是将主键和外键作为匹配条件。联结可以用来实现过滤的功能
外键(foreign key)是将一个表中的主键作为表的列,这个列就是该列的外键 https://blog.csdn.net/bingqingsuimeng/article/details/51595560
自然连接,表示表中信息不存在重复内容;内部联结其实和用SELECT WHERE子句表示意思是一致的,且INNER JOIN 中用ON 的地方可以用WHERE来代替,最好还是用ON;
而外部联结与内部联结功能不同的是它可以显示出一个表中不存在的内容,即该内容可以用NULL表示,而内部联结不可以显示,并且外部联结中ON不能用WHERE代替;
左外联结和右外联结的区别在于在书写中参考的标准,如果是左外,将以左边的表作为标准,那么左边为null的就不会显示出来
GROUP BY 语句可以用来选择分类的标准,即当name为a的数量是多少之类的
需要组合查询(使用union)的情况:
1、在单个查询中从不同的表返回类似结构的数据
2、在单个表执行多个查询,按单个查询返回数据
组合查询和多个WHERE条件结果很多时候是一样的。但两者的性能不同
多条WHERE语句一般采用OR的形式连接
UNION ALL 可以返回所有的匹配行,不会将重复行取消,但是WHERE不能实现该功能.OR的速度要快于UNION,效率更高
MYISAM支持全文本搜索,而InnoDB不支持,而后者支持事务处理
不应该在导入数据时使用FULLTEXT语句,应该先导入所有数据,然后再修改表,定义FULLTEXT
传递给Match()的值必须与FULLTEXT()定义的一样,没有FULLTEXT就不能使用
WHERE使用全文本搜索返回以文本匹配的良好程度排序数据(例如第一句关键字在第二位,第二句关键字在第一位,那第二句会排在前面)
在SELECT中而不是WHERE子句中使用Match()和Against(),使得所有行都被返回,不仅仅是匹配到的行,且列中返回计算的等级值
查询扩展除了找到匹配词的语句外,还将匹配到与匹配度最高的句子之间相匹配的句子。表中行越多,查询扩展返回结果越好
布尔方式的全文本搜索即使没有FULLTEXT索引也能使用,但查找缓慢,可以查找不含某个制定信息的文本
在布尔方式中,不按等级值降序排序返回,即排列而不排序
MySQL规定一条百分之50规则,如果一个词出现在百分之50以上的行中,则它将作为一个非用词忽略。该规则不用于IN BOOLEAN MODE
如果表中的行数少于3行,则全文本搜索不返回结果(如果每个词要么不出现,要么至少出现在百分之50的行中)
INSERT语句要求制定表名和被插入到新行中的值,INSERT语句一般没有输出。
数据库经常会被多个用户访问,INSERT操作会很耗时。如果数据检索是最重要的,可以通过在INSERT INTO 中间插入关键字LOW_PRIORITY指示MySQL降低INSERT语句的优先级
通过使用一个INSERT INTO和VALUES完成多行插入。
更新数据用UPDATE 表名 SET 列=数据 WHERE,可以将值赋予null进行删除,也可以用DELETE语句进行删除
DELETE是用来删除行用的。使用DELETE语句,如果不用WHERE,将会删除所有的行,UPDATE也一样。DELETE FROM 表名 WHERE xxx
要删除所有的行用TRUNCATE TABLE,速度更快,其实质是删除一个表然后重新创建一个表
增加行和删除行用 INSERT INTO 和 DELETE
创建新表时,指定表名必须不存在,否则将出错。如果要覆盖已有表,必须手动先删除该表,再重建该表。
如果仅想在一个表不存在时创建它,可在表名后给出IF NOT EXISTS
不允许NULL值的列不接受该列没有值的行。每个表列要么是null列,要么是not null列,这是在创建时定义规定的。即当规定为null输入行必须为null
如果主键使用单个列,那它的值必须唯一,如果使用多个列,则这些列的组合值必须唯一。主键不允许使用null值列。
每个表只允许一个AUTO_INCREMENT列,且它必须被索引。只要能保证值是唯一的,那么AUTO_INCREMENT的值可以被覆盖。
可以通过使用SELECT last_insert_id()来返回最后一个AUTO_INCREMENT的值,在其他表插入关联数据会用到。
如果在插入行时没有给出值,MySQL允许指定此时使用的默认值。该值用列定义中的DEFAULT关键字指定。
MySQL不允许使用函数作为默认值,它只支持常量。使用默认值而不是null值。
MySQL具有多种引擎。创建时一般语句是这样的 CREATE TABLE 表名(……)ENGINE=InnoDB;如果省略ENGINE=这句,使用的是默认引擎
常用引擎:InnoDB:可靠的事务处理引擎,不支持全文本搜索; MEMORY:功能上等同于MyISAM,数据存储在内存中,速度很快; MyISAM:性能极高的引擎,支持全文本搜索,但不支持事务处理
外键不能跨引擎,即使用一个引擎的表不能引用具有使用不同引擎的外键。
更新表的定义可以使用ALTER TABLE,即更改表的结构。eg: ALTER TABLE vendors ADD vend_phone CHAR(20);(要明确数据类型)
删除列的做法是在表名后加 DROP COLUMN 列名
增加列和删除列用 ALTER TABLE 中的 ADD 和 DROP COLUMN
ALTER TABLE的一种常见用途是定义外键 ALTER TABLE orderitems ADD CONSTRAINT foo FOREIGN KEY (order_num)REFERENCES orders (order_num) 其中order_num为列,属性,orders为表
删除表用DROP TABLE语句
重命名表语法: RENAME TABLE XXX TO YYY; 将xxx命名为yyy
视图是虚拟的表,只包含使用时动态检索数据的查询。视图仅是用来查看存储在别处的数据的一种设施。视图本身不包含数据,返回的数据是从其他表中检索出来的。在添加或更改这些表中的数据时,视图将返回改变过的数据
CREATE VIEW创建视图,SHOW CREATE VIEW viewname查看创建的视图,DROP VIEW viewname删除视图,更新视图可以先用DROP再用CREATE,也可以直接使用CREATE OR REPLACE VIEW.
视图数据更新视情况而定。通常是可以更新的(INSERT,UPDATE,DELETE),对视图更新即对基表进行更新等操作。
在有以下操作,视图将不会更新:分组(使用GROUP BY 和HAVING);联结;子查询;并;聚集函数(MIN(),MAX(),SUM()等);DISTINCT;导出列
一般将视图应用于检索(select语句),而不用于更新
存储过程简单来说,就是为以后的使用保存的一条或多条MySQL语句的集合
创建存储过程一直失败不知道为什么,使用delimiter失败
MySQL不能通过一个参数返回多个行和列。如果要返回多个,就需要多个参数
23、24章没细看
触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句:DELETE;INSERT;UPDATE.
只有表才支持触发器,视图不支持触发器。触发器按每个表每个事件每次的定义,每个表每个事件每次只允许一个触发器。因此每个表最多支持六个触发器(INSERT,UPDATE,DELETE的之前和之后)
CREATE TRIGGER neworder AFTER INSERT ON orders
FOR EACH ROW SELECT NEW.order_num;
这两句返回的是错误不允许触发器返回结果集,为什么啊
在INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行;DELETE触发器代码内可以引用OLD虚拟表,访问被删除的行;
在UPDATE触发器内,可引用名为OLD的虚拟表访问更新前的值,引用名为NEW的虚拟表访问新更新的值。
OLD中的值全部都是只读,不能更新。
创建触发器可能需要特殊的安全访问权限,但触发器的执行是自动的
25章部分代码没敲
事务处理用来维护数据库的完整性,管理成批执行的MySQL操作,以保证数据库不包含不完整的操作结果。利用事务处理可以保证一组操作不会中途停止,要么作为整体执行,要么完全不执行(发生错误就回退)
ROLLBACK只能在一个事物处理内使用(在执行一条START TRANSACTION命令之后)。不能回退CREATE或DROP操作,不能回退SELECT.
当COMMIT或ROLLBACK语句执行后,事务会自动关闭
保留点应该设置越多越好,事务处理完成后保留点自动释放
MySQL服务器的安全基础是,用户应该对他们需要的数据具有适当的访问权