更新表====================================================
ADD COLUMN 给表增加新列
例子:key_middle后增加新列
>ALTER TABLE mysql_testdb.tablename0
>ADD COLUMN new_key char(10) NOT NULL DEFAULT 0 AFTER key_middle;
CHANGE COLUMN 修改表的名称或数据类型
例子:new_key重命名及重设类型
>ALTER TABLE mysql_testdb.tablename0
>CHANGE COLUMN new_key key2 char(1) NULL DEFAULT 2;
ALTER COLUMN 删除或修改指定默认值
例子:key2修改默认值
>ALTER TABLE mysql_testdb.tablename0
>ALTER COLUMN key2 SET DEFAULT 3;
MODIFY COLUMN 修改指定列数据类型
例子:key2修改类型
>ALTER TABLE mysql_testdb.tablename0
>MODIFY COLUMN key2 char(20) FIRST;
DROP COLUMN 删除
例子:删除key2列
>ALTER TABLE mysql_testdb.tablename0
>DROP COLUMN key2;
例子:删除表
>DROP TABLE mysql_testdb.tablename0;
RENAME TO 修改表名
例子:将tablename0改名为tablename2
>ALTER TABLE mysql_testdb.tablename0
>RENAME TO mysql_testdb.tablename2;
例子:多表改名
>RENAME TABLE tablename0 TO tablename2
>test_table TO tablename3;
AFTER index_key 新列放在index_key后位置
FIRST 新列为第一行
查看表=======================================
>SHOW TABLE tablename0;
或
>DESC mysql_testdb.tablename0;
索引=========================================
创建索引
通用项:
index_col_name : col_name[(length)][ASC|DESC]
col_name 索引列名
length 用前多少长度创建索引(有利于减小索引文件大小)
ASC|DESC 升序|降序(默认:升序)
UNIQUE 指定为唯一索引
index_name 索引名
tbl_name 索引表名
CONSTRAINT 别名
symbol
PRIMARY KEY 主键
AUTO_INCREMENT 自增
UNIQUE 唯一索引
FOREIGN 外键
(1)方法一,用于单独创建索引
CREATE [UNIQUE] INDEX index_name ON tbl_name (index_col_name,...)
例子:根据name前三个字符创建一个升序索引
>CREATE INDEX index_name ON mysql_testdb.tablename0(name(3) ASC);
建立成功后,查看索引
>SHOW INDEX FROM mysql_testdb.tablename0
(2)方法二,用于创建新表时候创建索引
创建该表索引
CREATE TABLE {INDEX|KEY} [index_name] (index_col_name,...)
创建主键索引
CREATE TABLE [CONSTRAINT[symbol]] PRIMARY KEY (index_col_name,...)
创建唯一索引
CREATE TABLE [CONSTRAINT[symbol]] UNIQUE [INDEX|KEY] [index_name] (index_col_name,...)
创建外键
CREATE TABLE [CONSTRAINT[symbol]] FOREIGN KEY [index_name] (index_col_name,...)
例子:id与book组成联合主键,count建立索引
>CREATE TABLE tablename4
>(
>id int NOT NULL AUTO_INCREMENT
>name char(20) NOT NULL
>age int(3) NULL
>book char(50) NULL
>count int(5) NULL
>PRIMARY KEY(id, book)
>INDEX index_tablename4_count(count);
>)
(3)方法三,修改表的同时创建索引
添加索引
ALTER TABLE ADD {INDEX|KEY} [index_name] (index_col_name,...)
添加主键
ALTER TABLE ADD [CONSTRAINT[symbol]] PRIMARY KEY (index_col_name,...)
添加唯一索引
ALTER TABLE ADD [CONSTRAINT[symbol]] UNIQUE [INDEX|KEY] [index_name] (index_col_name,...)
添加外键
ALTER TABLE ADD [CONSTRAINT[symbol]] FOREIGN KEY [index_name] (index_col_name,...)
例子:name添加非唯一索引
>ALTER TABLE tablename4
>ADD INDEX index_tablename4_name(name);
查看索引:
SHOW {INDEX|INDEXS|KEY} {FROM|IN} tablename [{FROM|IN} db_name] [WHERE expr]
删除索引:
DROP INDEX index_name on tablename
ALTER TABLE DROP {INDEX|PRIMARY KEY|FOREIGN KEY}
查询:
SELECT [ALL|DISINCT|DISTINCTROW] select_expr [,select_expr,...]
FROM tablename
[WHILE where_condition]
[GROUP BY {col_name|expr|position} [ASC|DESC],...[WITH ROLLUP]
[HAVING where_condition]
[ORDER BY {col_name|expr|position} [ASC|DESC]]
[LIMIT {[offset,] row_count|row_count OFFSET offset}]
SELECT 要返回的列 ALL|DISINCT|DISTINC TROW 是否返回结果集中的重复行
FROM 从中检索的数据表
WHERE 行级过滤
GROUP BY 分组说明
HAVING 组级过滤
ORDER BY 输出排序顺序
LIMIT 要检索的行数
select_expr 指定查询内容(可表示一个常量/变量/表达式)
单表查询:
例子:(1)查询tablename4中name,age,book信息
>SELECT name,age,book FROM mysql_testdb.tablename4;
(2)查询全部信息
>SELECT * FROM mysql_testdb.tablename4
(3)查询结果,判断并取别名
>SELECT name,
>CASE WHERE sex='M' THIN '男'
>ELSE '女'
>END AS 性别
>FROM mysql_testdb.tablename4;
(4)将查询结果计算
>SELECT name,sex,age+100 FROM mysql_testdb.tablename4;
多表查询:
交叉连接(笛卡儿积)
例子:得到tb1和tb2的数据
>SELECT * FROM tb1 CROSS JOIN tb2
或者 >SELECT * FROM tb1,tb2)
内链接
SELECT select_expr FROM tb1 INNER JOIN tb2 ON conditions;
conditions [tb1.]col_name [运算符] [tb2.]col_name
例子:查询每一个学生及选课信息(等值连接)
>SELECT * FROM tb_student INNER JOIN tb_score
>ON tb_student.studentID = tb_score.studentID;
外连接
左外连接(一对多):
LEFT OUTER JOIN 或者 LEFT JOIN
左边表为基表,右边为参数表
例子:获取表一关于表二的对应的详细数据
>SELECT * FROM tb1 LETF JOIN tb2 ON tb1.studentID = ON tb2.studentID
右外连接:
RIGHT OUTER JOIN 或者 RIGHT JOIN
右边为基表,左边为参数表
WHERE查询
(1)比较查询(<=>)
(2)判断查询(BETWEEN...AND 和 IN)
>SELECT * FROM mysql_testdb.tb1 WHERE id BETWEEN 100 AND 200; 返回id为100到200间的行
>SELECT * FROM mysql_testdb.tb1 WHERE id IN (101,156,234); 返回id为101,156,234的行
(3)判断空值(IS)
>SELECT * FROM mysql_testdb.tb1 WHERE age IS NULL; 返回所有age为空值的行
子表查询
例子:获取tb_student对应的tb_score成绩信息大于80分的学生
>SELECT studentID,studentNAME
>FROM tb_student
>WHERE studentID IN (SELECT studentID FROM tb_score WHERE score>80);
分组:
GROUP BY {col_name|expr|position}[ASC|DESC],...[WITH ROLLUP]
col_name 分组选择列,可多个列,逗号分隔
expr 分组表达式("COUNT(*)AS '人数'")
position 正整数,第几列意思
WITH ROLLUP 汇总作用
例子:(1)每个相同地址的男性人数,女性人数
>SELECT address,sex,COUNT(*)AS '人数' FROM mysql_testdb.tb1
>GROUP BY address,sex;
结果:
address sex 人数
北京 F 1
上海 M 4
武汉 F 1
武汉 M 2
(1)每个相同地址的男性人数,女性人数,地区总人数,总人数
>SELECT address,sex,COUNT(*)AS '人数' FROM mysql_testdb.tb1
>GROUP BY address,sex
>WITH ROLLUP;
结果:
address sex 人数
北京 F 1
北京 NULL 1
上海 M 4
上海 NULL 4
武汉 F 1
武汉 M 2
武汉 NULL 3(地区总人数)
NULL NULL 8(总人数)
HAVING where_condition 用于过滤组
例子:地区中少于3人的所有客户姓名及地址
>SELECT name,address FROM mysql_testdb.tb1
>GROUP BY address,name
>HAVING COUNT(*)<=3;
结果:
name address
小黄 北京
小白 武汉
小红 武汉
小绿 武汉
排序
ORDER BY {col_name|expr|position}[ASC|DESC],...
例子:
>SELECT name,sex FROM mysql_testdb.tb1
>ORDER BY name DESC ,address DESC;
(1)空值默认最小值(2)多个列时,从左到右排序
限制
LIMIT {[offset,]count|count OFFSET offset}
例子:从第5行开始的连续三位
(1)
>SELECT id,name FROM mysql_testdb.tb1
>ORDER BY id LIMIT 3 OFFSET 4;
(2)
>SELECT id,name FROM mysql_testdb.tb1
>ORDER BY id LIMIT 4,3;