1.创建表
CREATE TABLE Student (
id INT(11) NOT NULL AUTO_INCREMENT,PRIMARY KEY(id),
StuName VARCHAR(20) NOT NULL,
sex INT(11) NOT NULL,
StuClass VARCHAR(20) NOT NULL,
Grade INT(11) NOT NULL
)
2.删除表
DROP TABLE student;
3.添加表字段
ALTER TABLE student ADD Professional VARCHAR(20);
4。修改表字段类型
ALTER TABLE student MODIFY Professional VARCHAR(30) NOT NULL DEFAULT 0;
5.删除表字段
alter table student drop column Professional;
6.增加,删除,修改,查询 四种语句
INSERT INTO student (StuName,sex,StuClass,Grade)VALUES('xxx',1,'2014级',90);
DELETE FROM student WHERE id =2;
UPDATE student SET StuName ='xx' WHERE id =3;
SELECT * FROM student
7日期格式化函数
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');
8.字符串转换,截取函数(截取效率不高)
SELECT CONCAT(CAST(1 AS CHAR),'2')AS test;/*数字转字符*/
SELECT CONCAT(CONVERT(1 , CHAR),'3')AS test;
/*字符转数字*/
SELECT CAST('1' AS SIGNED) + 100 AS test;
SELECT CONVERT('1' , SIGNED) + 200 AS test;
/*字符串截取*/
SELECT SUBSTRING(student.`StuName`,2)FROM student WHERE StuName ='xxx';
/* 拆分字符串 */
SELECT SUBSTRING_INDEX(student.`Date`,'/',-1) FROM student WHERE StuName ='xxx';
9.求和函数和if函数
SELECT SUM(IF(sex = 1,1,0))AS '男生人数' FROM student;
if(true,执行 1,弱则 执行0)
10.嵌套查询
SELECT * FROM (SELECT * FROM student) AS newStudent;
11.join on 左链接,右链接,全连接
LEFT JOIN :关键字会从左表 (student) 那里返回所有的行,即使在右表 (stugrade) 中没有匹配的行
SELECT student.`StuName`,stugrade.`Course` FROM student LEFT JOIN stugrade ON student.`id` =stugrade.`Grade_id`;
RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行
SELECT student.`StuName`,stugrade.`Course` FROM student RIGHT JOIN stugrade ON student.`id` =stugrade.`Grade_id`;
FULL JOIN:只要其中某个表存在匹配,FULL JOIN 关键字就会返回行
SELECT student.`StuName`,stugrade.`Course` FROM student FULL JOIN stugrade ON student.`id` = stugrade.`Grade_id` ORDER BY student.`StuName`;
12.自增字段
auto_increment
13.索引
索引主要做3件事:过滤(filter),排序或分组(sort/group),覆盖(cover)。
目前我对于索引的理解,还不太明确,主要最后一个,以后会在写的
创建索引:
CREATE INDEX indexName ON student(StuName(15));
修改表结构
ALTER table student ADD INDEX indexName(StuName)
创建表的时候指定
CREATE TABLE student(
id INT NOT NULL,
StuName VARCHAR(16) NOT NULL,
INDEX [indexName] (StuName (length))
);
删除索引
DROP INDEX [indexName] ON Student;
唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
关键字UNIQUE
CREATE UNIQUE INDEX indexName ON student(StuName(15));
ALTER table student ADD UNIQUE INDEX indexName(StuName)
CREATE TABLE student(
id INT NOT NULL,
StuName VARCHAR(16) NOT NULL,
UNIQUE [indexName] (StuName (length))
);
转自:菜鸟教程
使用ALTER 命令添加和删除索引
有四种方式来添加数据表的索引:
- ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
- ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
- ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
- ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。
以下实例为在表中添加索引。
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
你还可以在 ALTER 命令中使用 DROP 子句来删除索引。尝试以下实例删除索引:
mysql> ALTER TABLE testalter_tbl DROP INDEX c;
13.索引最左侧原则:
简单说,就是索引字段的数据必须是有序的,才能实现这种类型的查找,才能利用到索引
SELECT * FROM student WHERE id=1;
SELECT * FROM student WHERE id=1 AND StuName='小红';
下面请看:
通过实例理解单列索引、多列索引以及最左前缀原则
实例:现在我们想查出满足以下条件的用户id:
SELECT `id` FROM student WHERE stuname`='Liu' AND `stuuname`='Zhiqun' AND `stuage`=26
因为我们不想扫描整表,故考虑用索引。
单列索引:
ALTER TABLE student ADD INDEX stuname (stuname);
将stuname 列建索引,这样就把范围限制在stuname ='Liu'的结果集1上,之后扫描结果集1,产生满足stuuname ='Zhiqun'的结果集2,再扫描结果集2,找到 stuage=26的结果集3,即最终结果。
由 于建立了stuname 列的索引,与执行表的完全扫描相比,效率提高了很多,但我们要求扫描的记录数量仍旧远远超过了实际所需 要的。虽然我们可以删除stuname 列上的索引,再创建stuuname 或者stuage列的索引,但是,不论在哪个列上创建索引搜索效率仍旧相似。
2.多列索引:
ALTER TABLE sutdent ADD INDEX stuname_stuuname_stuage (stuname,stuuname,stuage);
为了提高搜索效率,我们需要考虑运用多列索引,由于索引文件以B-Tree格式保存,所以我们不用扫描任何记录,即可得到最终结果。
注:在mysql中执行查询时,只能使用一个索引,如果我们在stuname,stuuname,stuage上分别建索引,执行查询时,只能使用一个索引,mysql会选择一个最严格(获得结果集记录数最少)的索引。
3.最左前缀:顾名思义,就是最左优先,上例中我们创建了stuname_stuuname_stuage 多列索引,相当于创建了(stuname)单列索引,(stuname,stuuname)组合索引以及(stuname,stuuname,stuage)组合索引。
在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。
stuname 使用最频繁