mysql -h 服务器 -u username -p
create database 数据库名
drop database 数据库名;
use 数据库名;
严格数值数据类型 (integer、samllint、decimal 和 numeric)
近似数值数据类型 (float、real 和 double precision)
关键字 int 是 integer 同义词,dec 是 decimal 同义词
bit 数据类型保存位字段值
以及整数类型 tinyint 、mediumint、bigint
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
tinyint | 1 字节 | (-128,127) | (0,255) | 小整数值 |
smallint | 2 字节 | (-32 768,32 767) | (0,65 535) | 大整数值 |
mediumint | 3 字节 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
int或integer | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
bigint | 8 字节 | (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
float | 4 字节 | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
double | 8 字节 | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
decimal | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
类型 | 大小 (字节) | 范围 | 格式 | 用途 |
---|---|---|---|---|
date | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
time | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值或持续时间 |
year | 1 | 1901/2155 | YYYY | 年份值 |
datetime | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
timestamp | 4 | 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038-1-19 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
类型 | 大小 | 用途 |
---|---|---|
char | 0-255字节 | 定长字符串 |
varchar | 0-65535 字节 | 变长字符串 |
tinyblob | 0-255字节 | 不超过 255 个字符的二进制字符串 |
tinytext | 0-255字节 | 短文本字符串 |
blob | 0-65 535字节 | 二进制形式的长文本数据 |
text | 0-65 535字节 | 长文本数据 |
mediumblob | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
mediumtext | 0-16 777 215字节 | 中等长度文本数据 |
longblob | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
longtext | 0-4 294 967 295字节 | 极大文本数据 |
create table tableName (column_name coulumn_type);
例子:
create table student(
sno char(10) primary key,
sname char(10) not null,
);
AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
drop table table_name;
insert into table_name (field1, field2,...fieldN)
values
(value1,value2,...valueN)
select column_name,column_name
from table1_name,table2_name,..tableN_name
[where clause(字句)]
[offset m][limit n]
select col_name
from table_name
where condition1 [and|or] condition2...
操作符 | 描述 | 实例 |
---|---|---|
= | 等号,检测两个值是否相等,如果相等返回true | (A = B) 返回false。 |
<> 或 != | 不等于,检测两个值是否相等,如果不相等返回true | (A != B) 返回 true。 |
> | 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true | (A > B) 返回false。 |
< | 小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true | (A < B) 返回 true。 |
>= | 大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true | (A >= B) 返回false。 |
<= | 小于等于号,检测左边的值是否小于于或等于右边的值, 如果左边的值小于或等于右边的值返回true | (A <= B) 返回 true。 |
修改或更新MySQL中的数据
update table_name
set field1=new_value1, field2=new_value2
[where clause]
delete from table_name [where clause]
在where字句中用于匹配字符
例子:
# 匹配student表中email由'@163.com'结尾的记录
select email
from stundent
where email like '%@163.com'
在最后使用
# 按snanme升序排列,sname相同的部分按sno降序排列
select sname,sno,email
from student
where email like '%@163.com'
order by sname asc, sno desc
GROUP BY 语句根据一个或多个列对结果集进行分组。
在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。
GROUP BY 语法
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
例子
将数据表按名字进行分组,并统计每个人有多少条记录:
select name,count(*)
from emplopyee_tbl
group by name
#+--------+----------+
#| name | COUNT(*) |
#+--------+----------+
#| 小丽 | 1 |
#| 小明 | 3 |
#| 小王 | 2 |
#+--------+----------+
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3HCE2ZZd-1651130172907)(笔记图片/image-20220427171422528–16510508665726.png)]
获取两个表中字段匹配关系的记录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s3NhfU5f-1651130172909)(笔记图片/image-20220427170622929.png)]
select
from TableA a
inner join TableB b
on a.key = b.key
# 相当于
select
from TableA a, TableB b
where a.key = b.key
获取左表的所有记录,即使右表没有对应匹配的记录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m4AnpPj5-1651130172909)(笔记图片/image-20220427171122285.png)]
select
from TableA a
left join TableB b
on a.key = b.key
与左连接相反
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fbpOBwvm-1651130172910)(笔记图片/image-20220427171348518.png)]
select
from TableA a
right join TableB b
on a.key = b.key
is null
is not null
<=>
比较操作符,当比较的两个值为NULL时返回true关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。
在MySQL中,NULL值与任何其它值的比较(即使是NULL)永远返回false,即 NULL = NULL 返回false 。
MySQL中处理NULL使用IS NULL和IS NOT NULL运算符。
select
from TableA a
where name regexp '正则表达式';
# 增加表字段
alter table 表名 add 字段定义 (例如:i int not null); # 添加表字段到表尾
alter table 表名 add 字段定义 (例如:i int not null) after 字段A; # 添加表字段到字段A后面
alter table 表名 add 字段定义 (例如:i int not null) first; # 添加表字段到表首
# 删除表字段
alter table 表名 drop 字段名 # 删除字段
# 修改表字段类型以及名称
alter table 表名 modify 要修改的字段 字段新类型; # 只修改字段类型
alter table 表名 change 要修改的字段 新字段定义; # 只需要修改字段名(也要填进去原来的字段类型),或者都需要修改
# 修改字段默认值
alter table 表名 set default 1000; # 修改默认值为1000
# 修改表名
alter table 要改名的表名 rename to 新表名;
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
建立索引会占用磁盘空间的索引文件。
create index indexName on table_name (column_name);
create index indexName on table_name (column_name(length));
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
alter table tableName add index indexName(columnName)
create table mytable(
id int not null,
username varchar(16) not null,
index [indexName] (username(length))
)
drop index [indexName] on mytable;
索引列的值必须唯一,但允许有空值。
create unique index indexNmae on tableName(column_name(length));
alter table mytable add unique [indexName] (username(length));
create table mytable(
id int not null,
username varchar(16) not null,
unique [indexName] (username(length))
);
# 普通索引
alter table tbl_name add index index_name (column_list);
# 唯一索引
alter table tbl_name add unique index_name (column_list);
# 全文索引
alter table tbl_name add fulltext index_name (column_list);
# 添加主键
alter table tbl_name add primary key (column_list);
# 添加主键
alter table testalter_tbl modify i int not null;
alter table testalter_tbl add primary key (i);
# 删除主键
alter table testalter_tbl drop primary key;
show index from table_name\g
临时表只在本次连接存在,连接一旦关闭,所有临时表会被自动删除
create temporary table 临时表名();
使用show tables 看不到临时表
drop table 临时表名;
# 1. 首先使用
show create table 要复制的数据表名
# 2. 将create及之后的内容拷贝下来,只改表名,然后执行
create table `clone_tbl`(
省略
) engine=innodb;
# 表已经克隆好了,如果想拷贝数据可以这样
insert into clone_tbl (<克隆表的列 列表>)
select (<原表的列 列表>)
from 原表的表名;
自动增长
mysql> CREATE TABLE insect
-> (
-> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
-> PRIMARY KEY (id),
-> name VARCHAR(30) NOT NULL, # type of insect
-> date DATE NOT NULL, # date collected
-> origin VARCHAR(30) NOT NULL # where collected
);
# id列的值会自动增长
# 设置序列开始值,默认开始值为1
# 只用将上述代码第三行的 AUTO_INCREMENT 改成 AUTO_INCREMENT=100即可实现将开始值设置为100
# 表创建成功后可以这样改
alter table t auto_increment = 100;
# 在查询时加上一个 distinct
select distinct * from tableName;
# 删除重复数据
# 添加索引和主键来删除表中的重复记录
alter ignore table person_tbl
add primary key (last_name,first_name)
将tutorials中的数据导出到导出路径文件中
select * from tutorials_tbnl
into outfile '导出路径.txt'
你可以通过命令选项来设置数据输出的指定格式,以下实例为导出 CSV 格式:
mysql> SELECT * FROM passwd INTO OUTFILE '/tmp/tutorials.txt'
-> FIELDS TERMINATED BY ',' ENCLOSED BY '"'
-> LINES TERMINATED BY '\r\n';
在cmd环境下运行而不是mysql环境下
mysqldump是MySQL用于转存储数据库的实用程序。它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等。
使用mysqldump导出数据需要使用 --tab 选项来指定导出文件指定的目录,该目标必须是可写的。
以下实例将数据表 tutorials_tbl 导出到 /tmp 目录中:
$ mysqldump -u root -p --no-create-info \
--tab=/tmp W3CSCHOOL w3cschool_tbl
$ mysqldump -h 服务器地址(本地这句就不用写了) -u 用户名 -p密码(与-p之间不能有空格,写了密码也会出问题) 数据库名 表名(多张表用空格隔开,不写表示整个数据库) > 导出的路径文件名.txt(sql)
先导出数据
$ mysqldump -u root -p database_name table_name > dump.txt
然后导入
$ mysql -u root -p database_name < dump.txt
# 从当前目录读取文件dump.txt,插入到当前数据库mytbl表中
load data local infile 'dump.txt' into table mytabl;
# 从文件 dump.txt 中将数据导入到 mytbl 数据表中
$ mysqlimport -u root -p --local database_name dump.txt