mysql学习

连接

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]

where 字句

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。

update查询

修改或更新MySQL中的数据

update table_name 
set field1=new_value1, field2=new_value2
[where clause]

delete 语句

delete from table_name [where clause]

like 字句

在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

NULL值处理

  • 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

# 增加表字段
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命令添加和删除索引

# 普通索引
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 原表的表名;

auto_increment

自动增长

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

导出SQL格式的数据

$ 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

导入

load data

# 从当前目录读取文件dump.txt,插入到当前数据库mytbl表中
load data local infile 'dump.txt' into table mytabl;

mysqlimport

# 从文件 dump.txt 中将数据导入到 mytbl 数据表中
$ mysqlimport -u root -p --local database_name dump.txt

你可能感兴趣的:(mysql,学习,mysql)