1.delete的时候是直接deletefrom tableName where ….注意 没有 *
2.联合主键:所有列的组合必须是唯一的,(但是单个列的值可以不唯一)
3.常用命令:
SHOW DATABASES(展示所有数据库;
USE databaseName(使用某一个数据库);
SHOW TABLES(获取一个数据库内的表);
SHOW CLOUMNS FROM tableName(展示某个表内的所有列)等同于DESCRIBE tableName
4.多条SQL语句必须以(;)分割,当心逗号(,)不要写多了
5.建议:SQL关键字是用大写列名和表名使用小写
6.直接select的数据,如果没有明确排序查询结果,则返回的数据的顺序没有特殊意义,只要返回的行是相同的数据就是正常的
7.数据的格式化是一个表示问题,而不是一个检索问题
8.DISTINCT关键字应用于所有列而不是前置他的列,例如SELECTDISTINCT vend_id,prod_price 除非制定的两个列都不同,否则所有行都将被检索出来。
9. LIMIT用法 注意 行标从0开始
SELECT prod_name FROM products LIMIT 0,1会检索到第一条
SELECT prod_name FROM products LIMIT 1 检索出的也是第一条
LIMIT 3,4 意思是从行4(行标是从0开始的)开始的4行
LIMIT n等价于 LIMIT 0,N
LIMIT 5,10; // 检索记录行 6-15
具体示例
Limit 0,1 等同于 limit 1 limit 0什么也查不到的
Limit 3,4 从第4行开始检索出4行
10.多个排序的时候
order by column,column2
仅仅多个行具有相同的column1值时候才会对cloumn2进行排序 如果cloumn1中所有的值都是唯一的,则不会按cloumn2进行排序
11.关于DESC SAC
默认排序是升序ASC(可以不写的)
SELECT * FROM products ORDER BY prod_price DESC,prod_name;
DESC只作用其前面的列,本例子中prod_price列指定了DESC ,pord_name列不指定,因此prod_price列可以降序排序,但是prod_name列(在每个价格内)仍然是升序排列
如果想要在多个列上进行降序排列,那么必须对每个列指定DESC关键字
12.ORDER BY顺序
ORDER BY在from后,limit在ORDER BY后。OREDRBY在WHERE后
13.WHERE条件中的不等于有2种写法<> !=
14.mysql在执行匹配时候默认不区分大小写 where prod_name=’fuses’会返回 prod_name为Fuses的列
15.WHERE条件种,’’单引号用来限定字符串,将值与串类型进行比较需要限定引号,用来与数值列进行比较的值不用引号
16.WHERE条件中注意 ISNULL IS NOT NULL的限定情况(NULL与字段包含0,空格字符串或者仅仅包含空格是不同的 NULL代表无值)
17.AND和OR同时使用优先级的问题
要注意应该使用圆括号明确的分组操作符
比如 WHERE vend_id=1002 OR vend_id=1003AND prod_price>=10;
和 WHERE (vend_id=1002 OR vend_id=1003) AND prod_price>=10;
是不一样的,因为AND优先级比较高
1. IN操作符与OR作用相同语法 IN(1002,1003,1004) NOT IN
优点:
清楚直观/计算次序容易管理 且 执行更快(相比于OR)/最大优点是IN可以包含其他SELECT语句(也就是子查询)
18.LIKE要和通配符配合使用,LIKE ‘jet%’ mysql根据配置是可以区分大小写的,如果区分的话,那么’jet%’将与 JetPack 1000不匹配
19.%通配符不能匹配NULL的,即WHERE prod_name LIKE ‘%’也不能匹配用值NULL作为产品名的行 _下划线总是匹配一个字符 不能多不能少
20.使用正则表达式进行匹配
SELECT * FROM tableName WHRER prod_nameREGEXP ‘.000’ . 点是正则表达式中的一个特殊字符,表示匹配任意一个字符,因此 1000和2000都是匹配且返回
21.LIKE和REGEXP区别
LIKE匹配整个列,如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不会返回(除非使用通配符)
举例:
不使用通配符 什么也不返回
使用通配符
REGEXP在列值内进行匹配,匹配的文本在列值内出现,REGEXP将会找到他
22.匹配的时候区分大小写用BINARY
如:WHERE prod_name REGEXP BINARY ‘JetPack .000’
具体正则匹配用法参见书中或者网上查找
23.正则表达式的自测,可以不适用数据库表,通过返回 0(没有匹配) 1 (匹配)来测试。
例如:SELECT ‘hello’ REGEXP ‘[0-9]’ 这个例子显然返回0(因为文本hello中没有数字)
24.拼接字段 Concat()比如Concat(vend_name,’ (’,vend_country,’)’);
25.常用字符串函数
Trim() Lttim() Rtrim()
Left() Right()
Length() Lower() Upper() SubString()
26.常用日期和时间处理函数
CurDate() CurTime() Now() 具体查看书籍
Datetime类型存储日期及时间值
条件查询中如果想要的是日期,那么请使用Date()
例如 WHERE Date(order_date) =‘2005-09-01’ 因为oreder_date使用的是datetime类型 年月日时分秒 Date()截取了当前日期的日期部分
如果想要检索2005年9月下的所有订单可以:
WHERE Year(order_date)=2005 AND Month(order_date)=9;
27.聚合函数
AVG() CONUT() SUM() MIN() MAX()
COUNT()关于NULL值,如果指定列名,那么该列为空的行将被忽略
如果用COUNT(*),那么NULL不忽略
AVG() MAX() MIN()函数忽略列值为NULL的行
28.分组函数
WHERE和HAVING区别:
29.子查询通常返回单个列并且与单个列匹配
30.表连结
INNER JOIN和WHERE等值连接(也成为内部连接)是相同的
31.自连接(用的比较少)
同一张表 用了两次
比如:
下面是子查询方案:
下面是自连接的方案:同一张表 用了两个别名
自连接有时候比子查询效能好 使用的时候两个要对比看
32.组合查询UNION
UNION中必须包含相同的列,表达式或聚集函数(不过各个列先后顺序无所谓);列数据类型必须兼容,类型不必完全相同,但必须是DBMS隐含地转换的类型(例如,不同的数值类型或者不同的日期类型)
33.UNION启动去除了重复的行,想要全部的可以用UNION ALL
UNION几乎总是完成与多个WHERE条件相同的工作
如果确实需要每个条件的匹配行全部出现(包括重复行),则必须使用UNION ALL而不是WHERE
UNION多个select后的ORDER BY是对所有的SELECT排序 而不仅仅是最后一个
34.18章以后内容不常用(属于扩展以及基础知识) 记录做在了书上
补充知识点:
DELETE不需要列名或者通配符,DELETE删除整行而不是整列,为了删除某个列的值,可以用UPDATE语句,(设置为NULL,如果表定义允许NULL值 不需要这个列直接DROP cloumn也是可以的)
例如:
UPDATE customers SET cust_email=NULLWHERE cust_id=10005;
DELETE的时候请务必先SELECT验证,保证它过滤的是正确的记录,并且加WHERE条件
如果想从表中删除所有行,可以使用TRUNCATE TABLE语句,TRUNCATE实际上是删除原来的表重新创建一张表,而不是逐行删除表中的数据
每个表只有一个自增的列,且必须被索引