\d,delimiter 改变结束符
\#,rehash
\c
\g
\G
\q
\?
help
help keyword
数据库对象:
数据库
表
字段
索引
视图
触发器
事件
存储过程
存储函数
用户
表:
关系的描述,关系的实现
CREATE TABLE tb_name (
filed_name data_type,
...
);
ALTER TABLE tb_name CHANGE old_fileld new_filed data_type (FIRST|AFTER some_filed)
ALTER TEBLE tb_name MODIFY filed data_type 改变字段定义
ALTER TEBLE tb_name ADD new_filed data_type 添加字段
ALTER TABLE tb_name DROP filed 删除字段
ALTER TABLE tb_name RENAME new_tb_name
RENAME TABLE tb_name TO new_tb_name
存储引擎
MyISAM 默认的,不支持事务,表级别锁,在线备份
InnoDB 支持事务,行级别锁,粒度小,
Aechive 归档存储,不支持索引,可以压缩
Federated 组合表,跨数据库组合表
MRG 同一个库中组合表
Blackhole 黑洞,复制时有用
CSV 用于实现非SQL格式数据库的转换,使用纯文本文件存储数据
Cluster NDB
类似BDB,运行在内存中 在集群中使用
use 数据库名 (设置当前默认数据库)
******linux 数据库中不支持check约束******
改存储引擎时如果有数据则非常危险
定义外键,要先修改存储引擎为INNODB,如果在MYISAM中定义了外键,是不起作用的
建议同一个库中所有表的存储引擎改为一样
SHOW TABLE STATUS\G (查看表使用的是什么存储引擎)
ALTER TABLE stu ENGINE=INNODB;
ALTER TABLE course ENGINE=INNODB;
最直接的方式是在创建表时指定存储引擎的类型,向下面这样:
CREATE TABLE mytable (id int, title char(20)) ENGINE = INNODB
你还可以改变现有的表使用的存储引擎,用以下语句:
ALTER TABLE mytable ENGINE = MyISAM
然而,你在以这种方式修改表格类型的时候需要非常仔细,因为对不支持同样的索引、字段类型或者表大小的一个类型进行修改可能使你丢失数据。如果你指定一个在你的当前的数据库中不存在的一个存储引擎,那么就会创建一个MyISAM(默认的)类型的表。
ON DELETE 定义被引用的表被删除了怎样处理此表(有外键时)
CASXADE
RE
SHOW DATABASES;
IF NOT EXISTS 避免在脚本中创建表时报错
INSERT
INCERT INTO students(sid,sname) VAUES
DELETE where
UPDATE where
SELECT
TRUNCATE TABLE students 清空表,并清空计数
REPLACE 先删除,再添加
%多个字符
_一个字符
distinct 消除多余行
having 是对group by 分组后的再限定
或,异或问题
在逻辑学中,逻辑算符 异或(符号为XOR或EOR或�)是对两个运算元的一种逻辑析取类型。但与一般的逻辑或不同,异或算符的值为真仅当两个运算元中恰有一个的值为真,而另外一个的值为非真[1]。转化为命题,就是:“两者的值不同。”或“有且仅有一个为真。”
两个运算元(命题):A与B的异或一般写成A异或B,或者写成AXORB等等。在C语言中,写作A^B。
limit 2,3 (绕过前2行,再显示3行)
SHOW CREATE TABLE t1\G 显示创建表的命令
SHOW TABLE STATUS 查看表的信息
use information―schema
DESC TABLES;
SELECT TABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,
ALTER TABLE labrary.t1 ENGINE=NEMORY 改变存储引擎
外键:
FOREIGN KEY () REFERENCES table(field) ON DELETE SET NULL
CREATE TABLE stu (
name CHAR(6) NOT NULL,
age TINYINT UNSIGNED NOT NULL, TINYINT 3bit UNSIGNED 无符号
gendir CHAR(1),
PRIMARY KET(name,gender)
);
ALTER TABLE stu MODIFY gender CHAR(1) NOT NULL DEFAULT 'm';
ALTER TABLE stu ADD course TINYINT UNSIGNED DEFAULT '2';
CREATE TBALE course (
id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
course VARCHAR(255) NOT NULL DEFAULT 'mysql',
startdate DATE NOT NULL DEFAULT '2010-12-01'
);
ALTER TABLE stu ENGINE=INNODB;
ALTER TABLE course ENGINE=INNODB;
ALTER TABLE stu ADD FOREIGN KEY(course) REFERENCES course(id);
CREATE TABLE IF NOT EXISTS stu ( name VARCHAR(30));
SHOW WARNINGS;
CHECKSUM 1 对表做校验
COMMENT '*****' 对表加注释信息
DELAY_KEY_WRITE 延迟索引更新
CREATE TABLE course2 SELECT * FROM course WHERE id < 100;
表复制,auto_increment属性不会复制
CREATE TABLE course3 LIKE course;
创建一个结构属性和course完全相同的表
表中插入数据:
INSERT [INTO] tb_name VALUES (value1,val2,...),(val1,val2,...),(val1,val2,...)
INSERT INTO cource(course,startdate) VALUES('appache','2011-01-01');
SELECT * FROM course;
INSERT INTO course(course) VALUES('ftp'),('www'),('ssh');
INSERT INTO course(course,startdate) VALUES('appache','2011-01-01'); 如果不定义唯一键,那么数据可以重复
TRUNCATE TABLE cource; 清空表
唯一键:
ALTER TABLE course ADD UNIQUE KEY(course);
INSERT INTO course(course,startdate) VALUES('appache','2011-01-01'); 会提示出错
替换数据:
REPLACE INTO course(course,startdate) VALUES('appache','2011-01-01');
INSERT INTO course3 SELECT * FROM course;
为某一字段设置某一值:
INSERT INTO course SET course='telnet';
更新字段:
UPDATE course SET id=2 WHERE course='www';
UPDATE course SET id=id-1 ORDER BY id LIMIT 3; 根据id排序,只改前三行
删除字段:
DELETE FROM course WHERE id=1;
查询:
SELECT * FROM course;
SELECT course AS COURSE FROM course;
SELECT VERSION() AS VER;
SELECT course AS COURSE FROM course WHERE id>3;
SELECT * FROM course WHERE id>1 AND id<4;
SELECT * FROM course WHERE id BETWEEN 1 AND 4;
SELECT * FROM course WHERE id IN (1,2,3);
SELECT * FROM course WHERE course LIKE 'w%'; 匹配%多个字符
SELECT * FROM course WHERE course LIKE 'w_w'; 匹配_单个字符
SELECT DISTINCT startdate FROM course; 结果中如果有重复值时,只显示一次
SELECT DISTINCT startdate FROM course ORDER BY id;
SELECT DISTINCT startdate FROM course ORDER BY startdate;
SELECT DISTINCT startdate FROM course ORDER BY startdate DESC;
SELECT * FROM course GROUP BY startdate;
SELECT startdate FROM course GROUP BY startdate HAVING COUNT(*)>1;
SELECT COUNT(*) FROM course;
SELECT * FROM course ORDER BY id LIMIT 2;
SELECT * FROM course ORDER BY id LIMIT 2,2; 2,2 绕过前两行,再显示两行
SELECT * FROM course ORDER BY id DESC LIMIT 2;
(SELECT * FROM course ORDER BY id DESC LIMIT 2) UNION (SELECT * FROM course3 ORDER BY id LIMIT 2) ORDER BY id; 两个查询结果连接显示
SELECT
DISTINCT
ORDER BY
LIMIT
GROUP BY
HAVING
多表查询
内连接 =
外连接:左外连接;右外连接
A LEFT JONE B =
A RIGHT JONE B =
自连接
INNER JONE
子查询
where中有“ IN ” “ = ” 两种;还可以在from中用子查询,但是要为子查询结果取别名
where EXISTS ( select ……)
view ,视图
虚表,基表
CREAT VIEW DBname AS SELECT语句
视图可以更新,基表也跟着更新
WITH CHECK OPTION
索引:
创建索引:在创建表时创建索引
alter table db ADD INDEX index_name ( )
三种索引
BTREE|RTREE|HASH|FULLTEXT
不同的存储引擎支持哪些索引???作业
事务:transaction
一大堆语句的组合,而被看做一个整体
ACID:
原子性,
一致性,
隔离性, 事务隔离级别,四个级别
持久性
MyISAM,基于表级别的锁
InnoDB,行级别
读锁,写锁
set
隔离级别:四个
读未提交:没有提交,别人就可以读取
读提交:只有提交,别人才可以读取
重读: 当我的事务没有结束,无论别人怎样改,我读的结果都一样,是第一眼看到的
串行化:当别人在修改的时候不读取,等修改完成后再读取
要先确定是否基于事务的引擎,建议:一个数据库的所有表都是用同一存储引擎
加锁:读锁是共享的,写锁是独占的。写锁优先级高
读锁,我读的时候,不允许别人写入修改
在linux主机上装上oracle
内存1G,独立分区50G