2、在表已经建立好的情况下来指明自动增长列的起始值,使用这条代码的时候需要勾选主键,勾选自增 ALTER TABLE 表名 AUTO_INCREMENT=1000;
3、控制自动增长列每次增加的数值。设置所有表的自增 SET auto_increment_increment=20;
6、创建和删除索引
首先:先假设有一张表,表的数据有10W条数据,其中有一条数据是nickname=’css’,如果要拿这条数据的话需要些的sql是 SELECT * FROM award WHERE nickname = ‘css’ 一般情况下,在没有建立索引的时候,mysql需要扫描全表及扫描10W条数据找这条数据,如果我在nickname上建立索引,那么mysql只需要扫描一行数据及为我们找到这条nickname=’css’的数据,这样性能提升了很多
一、单列索引 1、普通索引,这个是最基本的索引 其sql格式是 CREATE INDEX IndexName ON `TableName`(`字段名`(length)) 或者 ALTER TABLE TableName ADD INDEX IndexName(`字段名`(length))
第一种方式 : CREATE INDEX 索引名 ON 表名(字段名); 第二种方式: ALTER TABLE award ADD INDEX account_Index(`account`);
2、唯一索引,与普通索引类似,但是不同的是唯一索引要求所有的类的值是唯一的,这一点和主键索引一样.但是他允许有空值 第一种方式 : CREATE UNIQUE INDEX 索引名 ON 表名(字段名); 第二种方式: ALTER TABLE 表名 ADD UNIQUE INDEX 自己取的索引名 (字段名);
3、主键索引,不允许有空值,(在B+TREE中的InnoDB引擎中,主键索引起到了至关重要的地位) 主键索引建立的规则是 int优于varchar,一般在建表的时候创建, 最好是与表的其他字段不相关的列或者是业务不相关的列.一般会设为 int 而且是 AUTO_INCREMENT自增类型的
ALTER TABLE 表名 ADD PRIMARY KEY (字段名) ;
二、组合索引 一个表中含有多个单列索引不代表是组合索引,通俗一点讲 组合索引是:包含多个字段但是只有索引名称 其sql格式是 CREATE INDEX IndexName On `TableName`(`字段名`(length),`字段名`(length),...);
CREATE INDEX 取的索引名 ON 表名(字段名1, 字段名2, 字段名3); #如果你建立了 组合索引(索引名) 那么他实际包含的是3个索引 (字段名1) (字段名1, 字段名2, )(字段名1, 字段名2, 字段名3) 三、全文索引 文本字段上(text)如果建立的是普通索引,那么只有对文本的字段内容前面的字符进行索引,其字符大小根据索引建立索引时申明的大小来规定。如果文本中出现多个一样的字符,而且需要查找的话,那么其条件只能是 where column lick '%xxxx%' 这样做会让索引失效,这个时候全文索引就起到了作用了 ALTER TABLE tablename ADD FULLTEXT(column1, column2) 有了全文索引,就可以用SELECT查询命令去检索那些包含着一个或多个给定单词的数据记录了。 例: ALTER TABLE award ADD FULLTEXT(aty_id, nickname);# 产品名 价格
四、Mysql全文搜索match against的用法 SELECT * FROM tablename WHERE MATCH(aty_id, nickname) AGAINST(‘xxx′, ‘sss′, ‘ddd′); # 这条命令将把column1和column2字段里有xxx、sss和ddd的数据记录全部查询出来。
6.2 索引的删除
1 2 3 4 5 6
第一种方式: DROP INDEX 之前创建索引取的索引名 ON 表名; 第二种方式: ALTER TABLE 表名 DROP INDEX 索引名; 例:删除表award的主键索引 ALTER TABLE award DROP PRIMARY KEY ;
三、把一个已经存在的表以及表中的数据插入到一个新表中。(新表的意思是在数据库中原来是不存在的)(通俗的是指表的备份) 1、在复制表的结构的同时复制表中的数据 CREATE TABLE 新表名 SELECT * FROM 旧表名;
2、只要复制表中的结构不要表中的数据。 CREATE TABLE 新表名 SELECT * FROM student WHERE 1=2; CREATE TABLE 新表名 LIKE 旧表名;
3、复制表中满足条件的数据与结构 CREATE TABLE 新表名 SELECT * FROM student WHERE 条件;
二、更新(修改)数据(update)
1 2 3 4 5 6 7 8 9 10
1、更新部分数据语法: UPDATE 表名 SET 字段名1=值1(,字段名2=值2,...字段名n=值n )WHERE 条件表达式; 如果表中有多条记录都满足where子句条件表达式,满足条件的记录都会发生改变
2、更新所有数据语法: UPDATE 表名 SET 字段名1=值1(,字段名2=值2,...字段名n=值n) ()表示根据实际情况可以只改一个值还是多个值 3、追加值:(如本来是水浒传,用CONCAT后就变成水浒传abc) UPDATE student SET 字段名1=CONCAT(字段名1,'abc') WHERE 条件表达式;
1、查询所有字段 SELECT 字段名1,字段名2,...字段名n FROM 表名;(表内所有字段) SELECT * FROM 表名; 注意:在数据库查询中尽量减少使用*号。因为代码的可读性不够,执行效率低。 一般在测试或者字段名比较少的情况下使用。
2、查询指定字段 SELECT 字段名1,字段名2,...字段名n FROM 表名;(表内部分字段)
3、按条件查询 SELECT * FROM 表名 WHERE 条件表达式; 注意: where 条件表达式可以使用关系运算符(>,<,=,!=,<>...)
4、带in关键字查询(判断某个字段的值是否在指定集合中,满足条件的记录将被查询出来) SELECT 字段名1,字段名2,...字段名n FROM 表名;(表内部分字段) WHERE 字段名 IN (元素1,元素2); SELECT 字段名1,字段名2,...字段名n FROM 表名;(表内部分字段) WHERE 字段名 NOT IN (元素1,元素2); 加not,表示值不是元素1,元素2的记录
5、带and( &&)关键字查询(满足两个条件为真) SELECT 字段名1,字段名2,...字段名n FROM 表名 WHERE 表达式1 AND(&&) 表达式2... AND 表达式n;
6、带 or (||)关键字查询 (满足一个条件为真) SELECT 字段名1,字段名2,...字段名n FROM 表名 WHERE 表达式1 OR(||) 表达式2... OR 表达式n; 注意:如果and和or关键字一起用,and优先级高于or,先算and表达式,再运算or表达式
7、带 between... and...关键字查询(值是否在指定范围内,一般使用在数字与日期范围时候) SELECT 字段名1,字段名2,...字段名n FROM 表名 WHERE 字段名 BETWEEN 起始值 AND 结束值; SELECT 字段名1,字段名2,...字段名n FROM 表名 WHERE 字段名 NOT BETWEEN 起始值 AND 结束值;(不在这个范围)
8、空值(is null )查询(空值不同于0,也不同于空字符串) SELECT 字段名1,字段名2,...字段名n FROM 表名 WHERE 字段名 IS NULL ; SELECT 字段名1,字段名2,...字段名n FROM 表名 WHERE 字段名 IS NOT NULL ;(不为空)
9、带 distinct 关键字查询(过滤记录中重复的值,null也算值) select distinct 需要去重的字段名 from 表名; select distinct 需要去重的字段名1,字段名2,...字段名n from 表名;(指定的多个字段的值都相同,才会被认为是重复记录)
10、带 like RLIKE 关键字查询(对字符串进行模糊查询,需要使用通配符%,_符合正则定律) SELECT * FROM titles WHERE title LIKE '生%'; -- 以什么开头 SELECT * FROM titles WHERE title LIKE '%术'; -- 以什么结尾 SELECT * FROM titles WHERE title LIKE '%科%'; -- 包含
SELECT * FROM titles WHERE title LIKE '历_'; -- 一个下划线代表一个占位符,表示以历开头的两个字 SELECT * FROM titles WHERE title LIKE '百___';-- 多个下划线代表多个占位符,以百开头的三个字
SELECT * FROM titles WHERE title RLIKE '^历'; #shift + 6 以什么开头 SELECT * FROM titles WHERE title RLIKE '书$'; #shift + 4 以什么结尾 SELECT * FROM titles WHERE title RLIKE '美' ; #包含美的字
1、聚合函数:对一组值进行统计,并返回唯一值 count()统计记录的条数,null值不会忽略: SELECT COUNT(*) FROM 表名; 在使用聚合函数时,如果记录中有NULL则聚合函数会自动过滤它。 SUM()求和函数:SELECT SUM (字段名) FROM 表名 AVG()求平均值:SELECT AVG(字段名) FROM 表名 MAX()求最大值:SELECT MAX(字段名) FROM 表名 MIN()求最小值:SELECT MIN(字段名) FROM 表名
2、对查询结果排序 order by ( ASC升序 DESC降序) SELECT 字段名1,字段名2,...字段名n FROM 表名 ORDER BY 字段名1 (ASC/DESC),字段名2(ASC/DESC); 如果 order by 字段名后不写任何,默认升序排列,写了DESC就按降序排列。注意:null可以被认为是最小值,也会参与排序。
3、分组查询 group by (按某个字段或某个值分组,字段中的值相同的为一组,一般和聚合函数一起使用) SELECT 字段名1或函数,字段名2,...字段名n FROM 表名 GROUP BY 字段名1,字段名2,...字段名n (HAVING 条件表达式) 注意 group by 和 having关键字一起使用,不是 where
4、分页查询 limit SELECT 字段名1,字段名2,...字段名n FROM 表名 LIMIT (偏移量)返回记录的条数 例:SELECT * FROM student2 grade LIMIT 4 #查询表中前4条记录 SELECT * FROM student2 grade DESC LIMIT 4,4; #查询greade字段值在表中第5位到第8位的学生(从高到低)
CASE(字段) WHEN 表达式 THEN 结果 (WHEN 表达式 THEN 结果)…ELSE 结果 END
相当于针对范围判断的时候类似于if…else if…else if…else…
1 2 3 4 5 6 7 8 9
例:SELECT TYPE,CASE(TYPE) WHEN 'business' THEN '商业书籍' WHEN 'mod_cook' THEN '烹调书籍' WHEN 'popular_comp' THEN '电脑书籍' WHEN 'psychology' THEN '物理书籍' WHEN 'trad_cook' THEN '交通书籍' WHEN 'UNDECIDED' THEN '绘图书籍' ELSE '其他书籍' END AS '书籍类型123' FROM titles;
四、为表和字段取别名 AS
1 2 3 4 5 6 7 8 9 10
给表取别名: SELECT * FROM 表名 (AS) 别名; #AS可以省略不写 给字段取别名 SELECT 字段名 (AS) '别名' FROM 表名 ; 取好别名后,查询所有这个表的数据 SELECT * FROM 表名 别名;
通过别名点出字段名,例如: SELECT t.`advance`,t.`notes`,t.`price`,t.`pub_id`,t.`title`,t.`type` FROM titles t; 注意需要先把 select 及from后面的表名,别命写出来以后才可以点出字段名,不然你用.是出不来选择的字段名