hn:hostname un:username fn:filename dn:databasename tn:tablename cn:columnname
USE dn:选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库
SHOW DATABASES:列出 MySQL 数据库管理系统的数据库列表
SHOW TABLES:显示指定数据库的所有表,使用该命令前需要使用 use 命令来选择要操作的数据库
SHOW COLUMNS FROM tn:显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息
SHOW INDEX FROM tn:显示数据表的详细索引信息,包括PRIMARY KEY(主键)
SHOW TABLE STATUS FROM dn [LIKE 'pattern'] G: 显示数据库中所有表(过滤的表)信息
SHOW ENGINES:显示数据库支持的所有引擎
CREATE DATABASE IF NOT EXISTS test DEFAULT CHARSET UTF8;:创建数据库test
DROP DATABASE IF EXISTS test;删除数据库test
CREATE TABLE IF NOT EXISTS tn
(列名
类型 [NULL | NOT NULL | UNIQUE [KEY] | [PRIMARY] KEY | DEFAULT {literal | (expr)} | COMMENT 'str'):创建表
DROP TABLE IF EXISTS tn
:删除数据和表结构并释放空间
TRUNCATE TABLE tn
:删除数据保留表结构,释放空间
DELETE FROM tn
:删除数据,表结构不变,MyISAM释放空间,INNODB不释放
DELETE FROM tn
WHERE xxx:条件删除,不释放空间.若接着使用optimize table 表名
则释放空间
ALTER TABLE tn
ADD [COLUMN | INDEX] name varchar(12);增加name列|索引
ALTER TABLE tn
DROP [COLUMN | INDEX] name;删除name列
ALTER TABLE tn
MODIFY COLUMN name char(16) [FIRST | AFTER] id;修改name列类型为char并在id列前|后
ALTER TABLE tn
CHANGE COLUMN oldname newname varchar(24) [FIRST | AFTER] id;修改列名oldname为newname且类型为varchar(24)在id列前|后,change和modify都可以修改表定义,但是change需要写两次列名,不过change可修改列名而modify不行
ALTER TABLE tn
RENAME [COLUMN | INDEX] oldname TO newname;修改列|索引名
ALTER TABLE tn
RENAME [TO|AS] newtn
;修改表名
ALTER TABLE tn
ENGINE=MYISAM/INNODB:更改表的引擎
INSERT INTO tn
(cn1
, cn2
...) VALUES(v1, v2...):插入数据
INSERT INTO tn
(cn1
, cn2
...) SELECT cn1
, cn2
... FROM anothertn
:从另外一张表查询数据并插入(速度快)
UPDATE tn
SET cn
=value WHERE...ORDER BY...:更新tn中符合WHERE条件cn列的值为value
SELECT [ALL | DISTINCT | DISTINCTROW ] cn
|sum|count()|max|min FROM tn
WHERE...GROUP BY...HAVING...ORDER BY..ASC|DESC...LIMIT [offset,] num:查询数据
GRANT SELECT, INSERT ON dn.tn TO un
@hn
IDENTIFIED BY 'passwd':所有权限用ALL表示,dn为表示所有库,tn为*表示所有表,hn为localhost只能从本机登录,为%可从所有主机登录,省略passwd表示密码为空
REVOKE SELECT, INSERT ON dn.tn TO un
@hn
;收回权限
mysqldump -uun -p dn > fn.sql:导出整个库
mysqldump -uun -p dn tn > fn.sql:导出库的一张表
mysql -uun -p dn < fn.sql:导入数据库
use dn; source 'path/fn.sql':导入数据库
load data local infile 'path/fn.sql' into table tn;导入数据库
连接分为内连接和外连接(左连接和右连接):
内连接:使用比较运算符根据每个表指定列的值进行比较返回符合条件的共同记录,SELECT * FROM A JOIN B ON A.id=B.id;
左连接(外):返回左表的所有行,若左表的行在右表中没有则将右表中的该行列值设为NULL,SELECT * FROM A LEFT JOIN B ON A.id=B.id;
右连接(外):返回右表的所有行,若右表的行在左表中没有则将左表中的该行列值设为NULL,SELECT * FROM A RIGHT JOIN B ON A.id=B.id;
全连接(外):返回左表和右表的所有行,若某行在另一表中没有则将另一表中该行的列值设置为NULL,SELECT * FROM A FULL JOIN B ON A.id=B.id;
交叉连接:返回两表的笛卡尔积.A表的每一行与B表的每一行组合,AB各有4条记录,返回16条记录.SELECT * FROM A, B;
SQL查询的基本原理:
单表:根据WHERE条件过滤表中记录形成中间表(用户不可见),然后根据SELECT选择的列从中间表抽取数据并返回
两表:对两表求笛卡尔积并用ON条件和连接类型过滤形成中间表,然后根据WHERE条件过滤中间表记录,并根据SELECT选择的列抽取数据返回
多表:先对第一和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询直至最后一张表,最终形成中间表.然后根据WHERE条件过滤中间表记录,并根据SELECT选择的列抽取数据返回
ON后的条件与WHERE条件的区别:ON条件,过滤两表笛卡尔积形成中间表.WHERE条件,在有ON条件的SELECT语句中过滤中间表,在没有ON的单表查询中限制物理表或中间查询结果,在两表或多表连接中限制中间表的返回结果.
推荐做法:ON只进行连接,WHERE只过滤中间表记录
子查询:查询需要的条件是另外一个SELECT的结果,关键字有in, not in, =, !=, exists, not exists,若子查询结果唯一则可用=代替in.表连接很多时候用于优化子查询
记录联合:将两表的数据按照一定的查询条件得出的结果合并在一起显示,用union, union all,union all直接合并,union在union all的基础上进行一次DISTINCT. SELECT id FROM A UNION ALL SELECT id FROM B;
引擎:
InnoDB:事务安全,行锁,外键,集群索引,数据缓存,空间和内存使用高,批量插入慢
MyISAM:表锁,全文索引,数据可压缩,空间和内存使用低,批量插入快
MyISAM中.frm存储表定义.MYD(MYData)存储数据.MYI(MYIndex存储索引)
InnoDB中.frm存储表定义.ibd存储数据
my.ini/my.cnf:
mysqld目录和文件
basedir = path:安装目录
datadir = path:数据存放目录
pid-file = fn:linux/unix中存放mysqld PID的文件
socket = /var/lib/mysql/mysql.sock:linux/unix客户端和服务器间本地通信所使用的socket,默认/var/lib/mysql/mysql.sock
字符集设置
character-set-[client|server|database|connection|filesystem] = utf8:设置相应字符集
通信安全
local-infile = [1|0]:允许/禁止使用load data local语句来处理本地文件
skip-grant-tables:不使用mysql数据库中存放的密码进行访问控制
port = 3306:指定端口
use = name:linux中必须从root账户启动后才能切换到另一个账户下执行,mysqld_safe脚本默认使用--user=mysql来启动mysqld
查询缓存
max_connections = n:同时处理的数据库最大连接数
日志
log = fn:把所有的连接及所有的SQL记入查询日志.默认是hn.log
slow-query-log = [1|0]:开启|关闭慢查询
slow-query-log-file = fn:把执行时间超过long_query_time设定值的查询命令记入慢查询日志,默认是hn-slow.log
long_query_time:设定慢查询超时时间,默认10s
log-bin = [fn|1|0]:二进制文件,记录修改数据或可能引起数据改变的sql,并记录语句发生时间,执行时长,操作的数据.fn指定文件,1开启0关闭.默认mysql-bin.000001(数字递增)用mysqlbinlog mysql-bin.000001或show binlog events in mysql-bin.000001查看内容
log-error = fn:错误查询日志,启动和关闭,运行,事件调度过程中产生的错误信息.默认是hn.err
general-log = [1|0]:查询日志是否开启,默认关闭
general-log-file = fn:查询日志,记录用户所有操作,信息量大默认关闭.hn.log
数值类型:TINYINT,SMALLINT,MEDIUMINT,INT/INTIGER,BIGINT,FLOAT,DOUBLE,DECIMAL
日期时间类型:DATE(1000-01-01~9999-12-31),TIME,YEAR(1901-2155),DATETIME,TIMESTAMP(1970-01-01 00:00:00~2038-01-19 11:14:07)
字符串类型:CHAR,VARCHAR,TINYBLOB,TINYTEXT,BLOB,TEXT,MEDIUMBLOB,MEDIUMTEXT,LONGBLOB,LONGTEXT(VARCHAR(n)表示n个字符,一个utf8编码的汉字是3B,GBK编码是2B)
create table if not exists info
(
idno
varchar(18) not null,
name
varchar(8),
gender
varchar(2),
age
tinyint,
birthday
datetime,
enrollment
date,
score
decimal(4,1),
grade
char(2),
tel
char(11),
email
varchar(64),
salary
int,
address
varchar(64),
carno
varchar(16),
insurance
char(16),
primary key(idno
)
)engine=innodb default charset=utf8;