mysql数据库sql语句

一.插入数据

insert into table_name (field1,field2,...,fieldN) values (value1,value2,...,valueN)
如果数据是字符型,必须使用单引号或者双引号,如:"value"。
image.png
id字段在创建表的时候已经设置它为 AUTO_INCREMENT(自动增加) 属性,该字段会自动递增而不需要我们去设置,因此insert语句中没有提供id字段的数据值。

二.查询数据

select column_name,column_name from table_name [where Clause] [limit N] [OFFSET M]

  • 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
  • SELECT 命令可以读取一条或者多条记录。
  • 可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
  • 可以使用 WHERE 语句来包含任何条件。
  • 可以使用 LIMIT 属性来设定返回的记录数。
  • 可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。

image.png

三.where子句

如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中。
select field1,field2,...fieldN from table_name1,table_name2 ...where condition1 [and [or]] condition2 ...

  • 查询语句中你可以使用一个或者多个表,表之间使用逗号, 分割,并使用WHERE语句来设定查询条件。
  • 你可以在 WHERE 子句中指定任何条件。
  • 你可以使用 AND 或者 OR 指定一个或多个条件。
  • WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。
  • WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。

以下操作符列表可用于where子句中:

操作符 描述
= 等号,检测两个值是否相等,如果相等返回true
<> ,!= 不等于,检测两个值是否相等,如果不相等返回true
> 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true
< 小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true
>= 大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true
<= 小于等于号,检测左边的值是否小于或等于右边的值, 如果左边的值小于或等于右边的值返回true

如果给定的条件在表中没有任何匹配的记录,那么查询不会返回任何数据。
实例:
image.png

四.update更新

update table_name set field1=new-value1,field2=new-value2 [where Clause];

  • 可以同时更新一个或多个字段。
  • 可以在 WHERE 子句中指定任何条件。
  • 可以在一个单独表中同时更新数据。

实例:
image.png

五.delete语句

delete from table_name [where Clause];

  • 如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
  • 你可以在 WHERE 子句中指定任何条件
  • 您可以在单个表中一次性删除记录。

实例:
image.png

六.like子句

有时候需要获取 某字段含有 "COM" 字符的所有记录,这时我们就需要在 WHERE 子句中使用 SQL LIKE 子句。

SQL LIKE 子句中使用百分号%字符来表示任意字符,类似于UNIX或正则表达式中的星号 *。

如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。

select field1,field2,...fieldN from table_name where field1 like condition1 [and[or]] field2 = 'samevalue';

  • 可以在 WHERE 子句中指定任何条件。
  • 可以在 WHERE 子句中使用LIKE子句。
  • 可以使用LIKE子句代替等号 =。
  • LIKE 通常与 % 一同使用,类似于一个元字符的搜索。
  • 可以使用 AND 或者 OR 指定一个或多个条件。
  • 可以在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句来指定条件。

实例:
image.png

七.union

union操作符用于连接两个以上的select语句的结果组合到一个结果集中,多个select语句会删除重复的数据。
select expression1,expression2,...expression_n from tables [where conditions]
union [all|distinct]
select expression1,expression2,...expression_n from tables [where conditions];

  • expression1, expression2, ... expression_n: 要检索的列。
  • tables: 要检索的数据表。
  • WHERE conditions: 可选,检索条件。
  • DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
  • ALL: 可选,返回所有结果集,包含重复数据。

image.png

八.order by 排序

Select field1,field2,...fieldN from table_name1,table_name2...order by field1 asc|desc,field2...[默认asc]

  • 可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
  • 可以设定多个字段来排序。
  • 可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
  • 可以添加 WHERE...LIKE 子句来设置条件。

image.png

九.group by分组

Select column_name,function(column_name) from table_name where column_name operator value group by column_name;
image.png

十.join连接

inner  join(内连接,等值连接):获取两个表中字段匹配关系的记录。
left join(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
right join(右连接):获取右表所有记录,即使左表没有对应匹配的记录。
image.png

十一.NULL值处理

当提供的查询条件字段为 NULL 时,使用 SQL SELECT 命令就无法正常工作。
IS NULL: 当列的值是 NULL,此运算符返回 true。
IS NOT NULL: 当列的值不为 NULL,运算符返回 true。
<=>: 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true
在 MySQL 中,NULL 值与任何其它值的比较(即使是 NULL)永远返回 NULL,即 NULL = NULL 返回 NULL 。
image.png

十二.正则表达式

下表中的正则模式可应用于 regexp 操作符中

模式 描述
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 'n' 或 'r' 之后的位置
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 'n' 或 'r' 之前的位置
. 匹配除 "n" 之外的任何单个字符。要匹配包括 'n' 在内的任何字符,请使用象 '[.\n]' 的模式。
[...] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'
1 负值字符集合。匹配未包含的任意字符。例如, '2' 可以匹配 "plain" 中的'p'。
image.png 匹配 p1 或 p2 或 p3。例如,image.png 则匹配 "zood" 或 "food"。
* 匹配前面的子表达式零次或多次。例如,zo 能匹配 "z" 以及 "zoo"。 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

image.png

十三.alert命令

当需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令。
1.如下命令使用了 ALTER 命令及 DROP 子句来删除以上创建表的 i 字段:
image.png

2.如下命令使用了alter命令及add子句来添加表的i2字段,定义数据类型为int

3.如果需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。
image.png

4.如果需要修改字段类型及名称, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。

把字段name 的数据类型由varchar(100)改为varchar(50)
image.png

在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型。
image.png

5.修改默认值
image.png

6.使用alter命令和drop子句来删除字段默认值
image.png

7.使用 ALTER 命令及 TYPE 子句修改表类型
image.png

8.修改表名

可以在 ALTER TABLE 语句中使用 RENAME 子句来实现

十四.索引

索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。

创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

普通索引

1.创建普通索引
create index indexname on mytable (username(length));
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。

2.修改表结构(添加普通索引)
Alter table table_name add index indexname(columnname);

3.创建表的时候直接指定普通索引
create table mytable(
id int not null,
username varchar(16) not null,
index indexname)
);

4.删除普通索引的语法
drop index [indexname] on mytable;

唯一索引

索引的值必须唯一,但允许有空值。如果是组合索引,则列的组合必须唯一。有以下几种创建方式:

  1. 创建索引

Create union index indexname on mytable(username(length));

  1. 修改表结构

Alter table mytable add union [indexname] (username(length));

  1. 创建表时直接指定

Create table mytable(
Id int not null,
Username varchar(16) not null,
Union [indexname] (username(length))
);

使用alter命令添加和删除索引

Alter table tbl_name add primary key (column_list);该语句添加一个主键,意味着这个索引值必须唯一的,且不能为null。

image.png

Alter table tbl_name add union indexname(column_list);这条语句创建索引的值必须是唯一的(除了null外,null可能会出现多次)。

Alter table tbl_name add index indexname(column_list);添加普通索引,索引值可出现多次。

Alter tbl_name add fulltext indexname(column_list);该语句制定了索引为fulltext,用于全文索引。

Alter table tbl_name drop index indexname;在alter命令中使用drop子句来删除索引。

Alter table tbl_name drop primary key;删除主键

显示索引信息

Show index from table_name;G
image.png

临时表

Mysql临时表在我们需要保存一些临时数据时非常有用的。临时表只在当前连接可见,当关闭连接时,mysql会自动删除表并释放所有空间。

创建临时表的语法:create temporary table tbl_name(id int not null,name varchar(16) not null);

当你使用 SHOW TABLES命令显示数据表列表时,你将无法看到 SalesSummary表。

如果你退出当前MySQL会话,再使用 SELECT命令来读取原先创建的临时表数据,那你会发现数据库中没有该表的存在,因为在你退出时该临时表已经被销毁了。
image.png

默认情况下,当你断开与数据库的连接后,临时表就会自动被销毁。当然你也可以在当前MySQL会话使用 DROP TABLE 命令来手动删除临时表。

drop table test3;

复制表

步骤1:使用show create table命令获取创建数据表(create table)语句,该语句包含了原数据表的结构,索引等。
image.png

元数据

Select version(); 获取数据库版本号
image.png

序列使用

使用auto_increment来定义列
创建表定义id自增长
create table test5(id int not null auto_increment,primary key(id),name varchar(16) not null);
插入数据,不指定id,使id自增长
insert test5(name) values ('zhangsan');
显示本次连接中,具有Auto_increment(自动增长)特性的属性列的最新值
image.png

处理重复数据

1、设置指定的字段为primary key(主键)或者unique(唯一)索引来保证数据的唯一性。

2、如果想设置表中字段first_name,last_name数据不能重复,可以设置双主键模式来设置数据的唯一性,设置后,那个键的默认值不能为null。
create table person_tbl(first_name char(20) not null,last_name char(20) not null,sex char(10),primary key(last_name,first_name));
image.png

3、Insert ignore into 会忽略数据库中已经存在的数据,如果数据库中就插入新的数据。如果有数据就跳过这条数据。

image.png

4、另一种设置数据唯一性的方法就是添加一个unique索引

create table person_tbl2(first_name char(20) not null,last_name char(20) not null,sex char(10),unique(last_name,first_name));

5、统计重复数据

select count(*) as repetitions,last_name,first_name from person_tbl group by last_name,first_name having repetitions > 1;

以上查询语句将返回 person_tbl 表中重复的记录数。 一般情况下,查询重复的值,请执行以下操作:

1)确定哪一列包含的值可能会重复。

2)在列选择列表使用COUNT(*)列出的那些列。

3)在GROUP BY子句中列出的列。

4)HAVING子句设置重复数大于1。
image.png

6、过滤重复数据

在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据
image.png
使用group by 来读取数据库表中不重复的数据。

image.png

7、删除重复的数据

image.png
create table person_tbl5 select first_name,last_name,sex from person_tbl3 group by first_name,last_name,sex; 复制表和数据

image.png

drop table person_tbl3; 删除原表
image.png

alter table person_tbl5 rename to person_tbl3; 新表重命名
image.png

Mysql及sql注入

1、防止sql注入,需要注意以下几点:

1)永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。

2)永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

3)永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

4)不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

5)应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

导出数据

1、使用select ... into outfile语句导出数据

1)将数据库表test1导出到test1.txt文件中

select * from test1 into outfile '/tmp/test1.txt';
image.png

2)通过命令选项来设置数据输出的指定格式,以下实例为导出CSV格式:

select * from test1 into outfile '/tmp/test2.txt' fields terminated  by ',' enclosed by '"' lines terminated by  'rn';
image.png

3)以下实例生成一个文件,每个值用逗号隔开:

select id,name into outfile '/tmp/test3.txt' fields terminated by ',' optionally enclosed by '"' lines terminated by 'n' from test1;
image.png

4)select ... into outfile 语句有以下属性:

  • LOAD DATA INFILE是SELECT ... INTO OUTFILE的逆操作,SELECT句法。为了将一个数据库的数据写入一个文件,使用SELECT ... INTO OUTFILE,为了将文件读回数据库,使用LOAD DATA INFILE。
  • SELECT...INTO OUTFILE 'file_name'形式的SELECT可以把被选择的行写入一个文件中。该文件被创建到服务器主机上,因此您必须拥有FILE权限,才能使用此语法。
  • 输出不能是一个已存在的文件。防止文件数据被篡改。
  • 你需要有一个登陆服务器的账号来检索文件。否则 SELECT ... INTO OUTFILE 不会起任何作用。
  • 在UNIX中,该文件被创建后是可读的,权限由MySQL服务器所拥有。这意味着,虽然你就可以读取该文件,但可能无法将其删除。

2、mysqldump导出表作为原始数据

Mysqldump是mysql用于转存储数据库的实用程序。它主要产生一个sql脚本,其中包含从头重新创建数据库所必须的命令create table insert等

使用mysqldump导出数据需要使用--tab选项来指定导出文件指定的目录,该目标必须是可写的。

1)将数据库表test4导出到/tmp目录中
mysqldump -u root -p --no-create-info --tab=/tmp yisen test4
image.png

2)导出sql格式的数据

导出sql格式的数据到指定的文件中:

mysqldump -u root -p database_name table_name > dump.txt

mysqldump -u root -p yisen person_tbl2 > /tmp/person_tbl2.txt
image.png

2)导出整个数据库的数据

mysqldump -u root -p yisen2 > database_dump.txt;
image.png

4)备份所有数据库

mysqldump -u root -p --all-databases >alldatabases_dump.txt

5)将数据表及数据库拷贝到其他主机

使用管道来将导出的数据导入到指定的远程主机上

Mysqldump -u root -p database_name |mysql -h other-host.com database_name
image.png

导入数据

1、使用load data导入数据(与导出select ... into outfile对应)

1)Load data local infile ‘dump.txt’ into table mytbl;

  • 如果指定LOCAL关键词,则表明从客户主机上按路径读取文件。如果没有指定,则文件在服务器上按路径读取文件。
  • 你能明确地在LOAD DATA语句中指出列值的分隔符和行尾标记,但是默认标记是定位符和换行符。
  • 两个命令的 FIELDS 和 LINES 子句的语法是一样的。两个子句都是可选的,但是如果两个同时被指定,FIELDS 子句必须出现在 LINES 子句之前。
  • 如果用户指定一个 FIELDS 子句,它的子句 (TERMINATED BY、[OPTIONALLY] ENCLOSED BY 和 ESCAPED BY) 也是可选的,不过,用户必须至少指定它们中的一个。

2)LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl FIELDS TERMINATED BY ':' LINES TERMINATED BY 'rn';

load data local infile '/tmp/person_tbl.txt' into table person_tbl;
image.png

3)LOAD DATA 默认情况下是按照数据文件中列的顺序插入数据的,如果数据文件中的列与插入表中的列不一致,则需要指定列的顺序。

如,在数据文件中的列顺序是 a,b,c,但在插入表的列顺序为b,c,a,则数据导入语法如下:

Load data local infile ‘dump.txt’ into table mytbl(b,c,a);

2、使用mysql命令导入语法格式(与mysqldump导出整个数据库对应)
Mysql -u 用户名 -p 密码 database_name < 要导入的数据库数据
mysql -u root -p  yisen3 < database_dump.txt
image.png

3、source命令导入(与mysqldump导出sql格式的数据对应)

1)登录到数据库终端

2)创建好数据库

3)执行source /tmp/test1.sql

4、使用mysqlimport导入数据(与mysqldump导出数据库表相对应)

Mysqlimport 客户端提供了load data infileql语句的一个命令行接口。

从文件test4.txtx重将数据导入到yisen2数据库表test4(该表已存在)中,可以使用以下命令:

mysqlimport -u root -p --local yisen2 /tmp/test4.txt;

Mysqlimport命令可以指定选项来设置指定格式,命令语句格式如下:

mysqlimport -u root -p --local --fields-terminated-by=":" --lines-terminated-by="rn" yisen2 /tmp/test5.txt;

image.png

mysqlimport 语句中使用 --columns 选项来设置列的顺序:(指定后的导入结果与预期不一致)

mysqlimport -u root -p --local --columns=name,id yisen2 /tmp/test6.txt;


  1. ...
  2. abc

你可能感兴趣的:(mysql,测试,test)