Mysql基础

数据库命令后要加;
数据库对大小写不敏感

退出mysql:exit
第一部分:库
初始进入:mysql -u root
如果有密码要用:mysql -u root -p
设置密码:mysqladmin -u root password xxx
进入:mysql -u root -p
输入密码
创建数据库:create database xxx default charset utf8 collate utf8_general_ci;
查看数据库:show databases;

查看数据库编码格式:show variables like ‘character%’;
修改数据库编码:默认创建的数据库默认不支持中文字符,如果我们需要它支持中文字符,则将它的编码设置为utf8格式.
mysql> ALTER DATABASE testDB CHARACTER SET UTF8;

使用数据库:use xxx;
查看当前使用数据库:select database();
删除数据库:drop database xxx;

第二部分:表
创建表 :create table 表名
(字段名1 数据类型,
字段名2 数据类型,。。。);
如果要设置主键或非空,则在数据类型后面加上 AUTO_INCREMENT(让主键值自动增长)primary key(主键)要搭配在一起用!或 not null
主键:not null + unique
varchar型要规定长度。
ps:利用已有数据创建新表:
mysql> create table newTable select * from xxx;

显示表:show tables;
删除表:drop table xxx;
查看表结构:desc xxx;
在表中添加列:alter table xxx add 字段名 字符类型;
修改列:alter table xxx modify 字段名 字符类型;
alter table 表名 change 原字段名 新字段名 字段类型;–修改表列名
删除列:alter table xxx drop column xxx-;
修改是否可为空:
ALTER TABLE MODIFY 数据类型 <NULL ‘OR’ NOT NULL>
对表重命名:rename table xxx to NEW_xxx;

增添数据:insert into 表名 VALUES (default(id), ‘xxx’,。。。);
多个:insert into 表名 VALUES (default(id), ‘xxx’,。。。),(null(id), ‘xxx’,。。。),…;
更新数据:update table_name set 列名=’xxxx’,列名=’xxxx’,… where id=xx(或者某个条件);
删除数据:delete from table_name where id = xx(或者某个条件);

查询:
查询有多少个:select count(*) from xxx where (条件);
查询所有:select * from xxx;
查询某一列:select 列名 from 表名;
查询包含某个字符的信息:
select */列名 from 表名 where 列名 like ‘%xxx%’;
多个条件用 and/or
去重复查询:select distinct 字段名 from 表名;
对查询结果排序:select 字段1,字段2…from 表名 where …. order by 属性名 [asc|desc]

多表联合查询:
1、内连接:将两个表中存在连结关系的字段符合连接条件的记录形成记录集
Select A.name,B.name from A inner join B on A.id=B.id和
Select A.name,B.name from A,B where A.id=B.id结果是一样的(内连接的inner关键字可省略);
2、外连接:分为左外连接和右外连接
左连接A、B表结果包括A的全部记录和符合条件的B的记录。
右联结A、B表的结果和左联结B、A的结果是一样的,也就是说:
Select A.name,B.name from A Left Join B on A.id=B.id和
Select A.name,B.name from B Right Join A on B.id-A.id执行后的结果是一样的。
3、全联结
4、无联结
5、三表联结查询
select username,psw,gname,tel from (t1 left join t2 on t1.t1_id=t2.t1_id) left join t3 on t1.t1_id=t3.t1_id
6、终极的三表联结查询
items:商品表,item_visit_stats:商品访问表,item_trade_stats:商品销售表
SELECT i.num_iid, i.title, i.price, SUM(iv.user_visits) AS uv,it.buyer_num,it.item_num,it.item_num*i.price AS turnover
FROM (items AS i RIGHT JOIN item_visit_stats AS iv ON i.num_iid=iv.num_iid)
LEFT JOIN (SELECT num_iid,SUM(buyer_num) AS buyer_num,SUM(item_num) AS item_num FROM item_trade_stats
WHERE seller_nick=”XXXX” AND business_day BETWEEN ‘2010-08-14’ AND ‘2010-08-15’ GROUP BY num_iid)
AS it ON it.num_iid=iv.num_iid
WHERE i.nick=”XXXX” AND iv.business_day BETWEEN ‘2010-08-14’ AND ‘2010-08-15’
GROUP BY i.num_iid ORDER BY uv DESC

建立表之间的关系(添加外键):
在建立之初添加外键:
(CONSTRAINT 外键名—给外键起名,可省略)
FOREIGN KEY (主表作为外键列名) REFERENCES 从表名(从表列名);
(上面要建立对应的列!!!)
建立好表之后添加外键:
ALTER TABLE主表名 ADD CONSTRAINT 外键名 FOREIGN KEY(主表作为外键的列名)REFERENCES 从表名(从表列名);
解除关联(删除外键):ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
查看已有的外键:
use information_schema;
SELECT * FROM information_schema.TABLE_CONSTRAINTS
WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = ‘FOREIGN KEY’
AND information_schema.TABLE_CONSTRAINTS.TABLE_SCHEMA = ‘要查看的数据库名’
AND information_schema.TABLE_CONSTRAINTS.TABLE_NAME = ‘要查看的表名’;

索引:
创建索引:CREATE INDEX 索引名 ON 表名(列名[(length)]…);
修改表时添加索引:ALTER TABLE 表名 ADD INDEX [索引名] (列名[(length)]…);
创建表时添加索引:INDEX [索引名] (列名[(length)]…);
删除索引:DROP INDEX 索引名 ON 表名
禁用索引:ALTER TABLE 表名 DISABLE KEYS;
打开索引:ALTER TABLE 表名 ENABLE KEYS;

ps:
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引
INNER JOIN: 如果表中有至少一个匹配,则返回行
(把两个表中都存在id的行拼成一行(即内联))
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
(显示左表T1中的所有行,并把右表T2中符合条件加到左表T1中,右表T2中不符合条件,就不用加入结果表中,并 且NULL表示)
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
(显示右表T2中的所有行,并把左表T中符合条件加到右表T中,左表T1中不符合条件,就不用加入结果表中,并 且NULL表示)
FULL JOIN: 只要其中一个表中存在匹配,就返回行
(显示左表T1、右表T2两边中的所有行,即把左联结果表 + 右联结果表组合在一起,然后过滤掉重复的。)