参考
MySQL 5.5 Reference Manual
MySQL 教程 | 菜鸟教程
知识点大纲
- 1 基本知识
- 1.1概念
- 1.2安装与连接
- 1.3客户端
- 1.4数据类型
- 2 DDL
- 2.1库操作
- 2.2表操作
- 2.3列操作
- 3 DML
- 增删改
- 查
- 4 DCL
- 权限
- 5 高级(优化等等)
1 基本知识
1.1概念
1.2安装与连接
1.3客户端
1.4数据类型
因为mysql主要业务就是处理数据,所以他对数据处理更加细致,数据的分类上就很细,大致分为三类:
- 数值型
- 字符串型
- 时间日期型
数值型又细分为整型 浮点型和定点型,下面细说
数据类型>数值型>整型
|类型名|取值范围(有符号或无符号)|占用存储(字节)|范围对应感觉|
|-|-|-|
|TINYINT| -128~127 或0~2^8-1 | 1|比如存年龄|
|SMALLINT |-32768~32767或0~2^16-1 |2|正负3万,一般商品ID够了|
|MEDIUMINT |-223~223-1或0~2^24-1 |3|正负八百万|
|INT| -231~231-1或0~2^32-1 |4|正负20亿|
|BIGINT |-263~263-1或0~2^64-1 |8|正负十万万亿...|
一个字节byte=8位bit
有没有符号用unsigned来表明,
整型还有zerofill和M属性
M的意思是表明数字最长有几位,配合zerofill用会将不足的位数用0填充,如果不写zerofill,其实M起不到任何作用,没有意义
此此外,写了zerofill那就是自动unsigned的。
数据类型>数值型>定点与浮点
|类型名 |占用存储(字节)|范围|
|-|-|
|FLOAT(M,D)| 4|正负3.4E+38|
|DOUBLE(M,D)| 8|范围更大,不必去记忆了|
|DECIMAL(M, D) |M+2 (ver >3.23)||
M表示小数点前后总位数,D表示小数点后面位数,而且不同于int的M值在zerofill时才有用,浮点数的M和D是真的有用,就是这个范围了
为什么float和int都是4字节,范围不一样呢
float/double , 有精度损失
decimal 定点型,更精确
定点型,是将整数部分和小数部分用分别用数字来存储的,所以定点型更精确,看如下的例子
在为列选择了使用某种数值类型时,除了要考虑数据的类型外,还应该注意所要表示的值的范围和存储需求,只需选择能覆盖要取值的范围的最小类型即可。
数据类型>字符串型
类型名 | 备注 |
---|---|
CHAR(M) | 定长字符串,M<255字符,M表示字符数,不够M的会用空格填充 |
VARCHAR(M) | 变长字符串,M<(65535转换成对应的字符数) |
TEXT(M) | M<2^16-1=65535字符 与varchar相反,很大的文本,慢,能用varchar就用varchar |
ENUM('value1','value2',...) | 枚举:列只能赋值为某个枚举成员或NULL |
SET('value1','value2',...) | 集合:列可以赋值为多个(最多64个)集合成员或NULL |
BLOB | BLOB(2^16-1)音频图像等 |
TINYBLOB | BLOB(2^8-1) |
MEDIUMBLOB | BLOB(2^24-1) |
LONGBLOB | BLOB(2^32-1) |
TINYTEXT | TEXT(2^8-1) |
MEDIUMTEXT | TEXT(2^24-1) |
LONGTEXT | TEXT(2^32-1) |
表格中,BLOB是一个能保存可变数量的数据的二进制的大对象。在某种意义上,串实际是一种非常“通用”类型,因为可用它们来表示任意值,不仅仅是字符串。例如,可用串类型来存储二进制数据,如图像、视频或音频。
char和varchard的选择?
字数少于20的话 直接用char,速度快
char和varchar的区别很有意思,有时单独开一篇
数据类型>日期和时间列类型
|类型名 |范围|含义|
|-|-|
|DATE|1000-01-01
到9999-12-31|日期, 'YYYY-MM-DD'
年份写两位的话0-69是用用20补全,70-99是用19补全|
|TIME|-838:59:59
到838:59:59|时间, 'HH:MM:SS'|
|DATETIME||时间和时间组合, 'YYYY-MM-DD HH:MM:SS|
|TIMESTAMP||时间戳,是1970-01-01到当前的秒数
timestamp不填的话会自动插入和更新|
所有时间日期类型数据要加引号插入
举例,生成一个日期和时间表,并插入2个元素:
CREATE TABLE my_test
(
id INT,
ts TIMESTAMP
)
INSERT my_test VALUES(1,20010101000000)
INSERT my_test(id) VALUES(2);
SELECT * from my_test
+------+----------------+
| id | ts |
+------+----------------+
| 1 | 20010101000000 |
| 2 | 20010113165713 |
+------+----------------+
转意序列列表
符号 | 含义 |
---|---|
\0 ASCII 0(NUL)字符 | |
\r | 回车 |
\b | 退格 |
' | 单引号 |
% | 百分号 |
\n | 换行 |
\t | 定位符 |
反斜杠 | |
" | 双引号 |
_ | 下划线 |
2 DDL操作
2.1库操作 增删改查
|序号|操作 |语法|备注|
|-|-|-|
|1|创建库| create database dbname;|数据库名字可用是数字,字母,下划线和美元符号组成,不能用数字开头。建议都小写。|
|2|查看库所有库| show databases;||
|3|选库| use dbname;||
|4|删除库|drop databse dbname;| 谨慎操作!|
|5|查看当前库 | mysql> SELECT database();||
|6|查看当前状态 | mysql> status;||
|7|改root密码| mysql> SET PASSWORD FOR 'root'@'localhost' = 'newpass';|-|
2.2表操作
2.2.1创建表
全面语法
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]
create_definition:
col_name column_definition
| [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
[index_option] ...
| {INDEX|KEY} [index_name] [index_type] (index_col_name,...)
[index_option] ...
| [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
[index_name] [index_type] (index_col_name,...)
[index_option] ...
| {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...)
[index_option] ...
| [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name,...) reference_definition
| CHECK (expr)
column_definition:
data_type [NOT NULL | NULL] [DEFAULT default_value]
[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]
[COMMENT 'string']
[COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]
[STORAGE {DISK|MEMORY|DEFAULT}]
[reference_definition]
重要参数 | 说明 | |
type | 字段类型 就是列类型,参见数据类型 | |
not null | 如果不写,默认插入null,如果声明了not null,那就不允许空着,或者设置default | |
default | 设定默认值 | |
auoto_increment | 设定自动编号,每个表只能有一个自增列,并且必须被索引 | |
primary key | 设定主键,主键是不能重复的 |
实例
mysql> create table goods2 (
-> goods_id int(10) not null auto_increment primary key,
->goods_num int(10) not null default 0);
Query OK, 0 rows affected (0.02 sec)
注意列名一律小写,因为null查询不方便所以所有列都要声明not null
2.2.2删除表
drop table tbl_name;
2.2.3查看表
查看本数据库的所有表
show tables;
查看某一个表的列
语法SHOW COLUMNS Syntax
SHOW [FULL] {COLUMNS | FIELDS} {FROM | IN} tbl_name [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr]
实例
show columns from shop.goods2;
或者用describe table语法
2.2.4 改表名
实例(rename)
rename table goods2 to shangpin;
2.3 列操作 修改列ALTER TABLE Syntax(添加 删除 修改列)
全面语法
ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name
[alter_specification [, alter_specification] ...]
[partition_options]
alter_specification:
table_options
| ADD [COLUMN] col_name column_definition
[FIRST | AFTER col_name ]
| ADD [COLUMN] (col_name column_definition,...)
| ADD {INDEX|KEY} [index_name]
[index_type] (index_col_name,...) [index_option] ...
| ADD [CONSTRAINT [symbol]] PRIMARY KEY
[index_type] (index_col_name,...) [index_option] ...
| ADD [CONSTRAINT [symbol]]
UNIQUE [INDEX|KEY] [index_name]
[index_type] (index_col_name,...) [index_option] ...
| ADD FULLTEXT [INDEX|KEY] [index_name]
(index_col_name,...) [index_option] ...
| ADD SPATIAL [INDEX|KEY] [index_name]
(index_col_name,...) [index_option] ...
| ADD [CONSTRAINT [symbol]]
FOREIGN KEY [index_name] (index_col_name,...)
reference_definition
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
| CHANGE [COLUMN] old_col_name new_col_name column_definition
[FIRST|AFTER col_name]
| MODIFY [COLUMN] col_name column_definition
[FIRST | AFTER col_name]
| DROP [COLUMN] col_name
| DROP PRIMARY KEY
| DROP {INDEX|KEY} index_name
| DROP FOREIGN KEY fk_symbol
| DISABLE KEYS
| ENABLE KEYS
| RENAME [TO|AS] new_tbl_name
| ORDER BY col_name [, col_name] ...
| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
| [DEFAULT] CHARACTER SET [=] charset_name [COLLATE [=] collation_name]
| DISCARD TABLESPACE
| IMPORT TABLESPACE
| FORCE
| ADD PARTITION (partition_definition)
| DROP PARTITION partition_names
| TRUNCATE PARTITION {partition_names | ALL}
| COALESCE PARTITION number
| REORGANIZE PARTITION [partition_names INTO (partition_definitions)]
| ANALYZE PARTITION {partition_names | ALL}
| CHECK PARTITION {partition_names | ALL}
| OPTIMIZE PARTITION {partition_names | ALL}
| REBUILD PARTITION {partition_names | ALL}
| REPAIR PARTITION {partition_names | ALL}
| PARTITION BY partitioning_expression
| REMOVE PARTITIONING
实例(add)
alter table goods2 add imag1 varchar(100) not null;
深入学习 MySQL 5.5 Reference Manual/SQL Statement Syntax/Data Definition Statements/
3 DML操作(行操作)
3.1增加数据insert
Insert
语法
insert into tbl_name
(col_name,…) values (value1,…) //指定列
insertinto *tbl_name
(value1,…) //所有列
insert into tbl_name
*(value1,…),(value1,…),**(value1,…) //一次加入多行
注意:数字不用加单引号,字符串必须加单引号
3.2 删除delete
delete from tbl_name (col_name,…) where expr
3.3 更改 update
update tbl_name set col_name = value where expr
3.3 查找数据select
select * from tbl_name
select * from tbl_name where expr
高级版
SELECT selection_list // 选择哪些列
FROM table_list // 从何处选择行
WHERE primary_constraint // 行必须满足什么条件
GROUP BY grouping_columns // 怎样对结果分组
HAVING secondary_constraint // 行必须满足的第二条件
ORDER BY sorting_columns // 怎样对结果排序
LIMIT count // 结果限定
Tips: 所有使用的关键词必须精确地以上面的顺序给出。例如,一个 HAVING 子句必须跟在 GROUP BY 子句之后和 ORDER BY 子句之前。
where→group by →having→order by→ limit
实例:
mysql> SELECT * FROM pet; // 普通查询
mysql> SELECT * FROM pet WHERE name = "Bowser"; // 查询特定行
mysql> SELECT name, birth FROM pet where owner="Gwen"; // 查询特定列
mysql> SELECT death-birth FROM pet WHERE name="Bowser"; // 表达式计算
mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f"; // 条件查询
mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m") // 多重条件
-> OR (species = "dog" AND sex = "f");
mysql> SELECT name, birth FROM pet ORDER BY birth DESC; // 排序输出
mysql>SELECT * FROM pet GROUP BY species; // 分组输出
mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner; // 分组统计