建个表(User):
id
name
password
salt
head_url【用户头像】
CREATE TABLE `user`(
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(64) NOT NULL DEFAULT '',
`salt` VARCHAR(32) NOT NULL DEFAULT '',
`head_url` VARCHAR(256) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`))
ENGINE=INNODB DEFAULT CHARSET=utf8
(忘了加password):ALTER TABLE USER ADD `password` VARCHAR(128) NOT NULL DEFAULT ''
索引相关:
创建表时指定:
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
);
创建表后修改:
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 ,用于全文索引
删除索引:DROP INDEX index_name ON table_name;
强制使用某个索引:
无join
select *
from table_a
force index(idx_name)
where ......
有join
select *from table_a
force index(idx_name)
left join table_b
where ......
索引显示:SHOW INDEX FROM table_name;
SELECT相关:
COUNT({*|[distinct] } <列名>)
统计行的数量
AVG([distinct] <列名>)
求平均值
SUM([distinct] <列名>)
求累加和
MAX([distinct] <列名>)
求最大值
MIN([distinct] <列名>)
求最小值
WHERE相关:
>=、<=、!=、<>:比较值的大小
[NOT] BETWEEN...AND... :【不】在某个范围内
AND | OR | NOT:可以多个使用
IN | NOT IN:是否在某个集合中
LIKE | NOT LIKE:字符匹配,通配符只能在LIKE子句中使用
“_”:表示1个字符
“%”:表示多个字符
“[]”:表示某一范围的字符([0~9]:0~9之间的字符)
“[^]”:表示不在某一范围的字符([^0~9])
IS [NOT] NULL:是否为空值
分组查询:
GROUP BY:用于将表或视图中的数据的查询结果按某一列或多列的值进行分组,值相同的为一组
HAVING:*从分组中选择满足条件的分组,因此必须和GROUP BY配合使用
查询选修某门课人数超过2的课程:SELECT Class.`name` , COUNT(Student.`name`) AS `count` FROM class JOIN student ON Class.`id` = Student.`classId` GROUP BY class.`name` HAVING COUNT > 2
连接查询:
内连接:只显示符合ON条件的连接
SELECT * FROM Student INNER JOIN class ON Student.`classId` = class.`id`
左连接:显示符合条件的连接,以及左表中不符合条件的数据行(此时右边的数据行会以NULL的形式显示)
SELECT * FROM Student LEFT JOIN class ON Student.`classId` = class.`id`
右连接:显示符合条件的连接,以及右表中不符合条件的数据行(此时左边的数据行会以NULL的形式显示)
SELECT * FROM Student RIGHT JOIN class ON Student.`classId` = class.`id`
全连接:显示符合条件的数据行,以及左右表中不符合条件的数据行(不满足条件的均以NULL显示)
mysql数据库不支持full join,但是可以通过UNION ALL来进行模拟
SELECT * FROM Student LEFT JOIN class ON student.`classId` = class.`id`
UNION ALL
SELECT * FROM Student RIGHT JOIN class ON student.`classId` = class.`id`
交叉连接:相当于笛卡尔积,左表的数据和右表的数据一一匹配
SELECT * FROM Student CROSS JOIN class(开发中意义不大)
存在意义是为了保证数据完整性
自身连接:相互连接的表物理上为同一张表,通常情况下,为了对连接过程进行区别,要为这张表取两个别名以方便操作
SELECT f.`id`, f.name, s.name FROM class AS f, class AS s WHERE f.`pre` = s.`id`
注:表结构如下,pre表示选修当前课程需要提前选修的课程
注:查询后的结果
附:
order by xxx :(DESC降序,ASC升序)
UNION操作:将多个查询结果合并在一起,同时自动删除重复行,如果不想删除重复行,则用UNION ALL,默认按第一列的值进行排序
关于Having的作用: Having的使用例题