一.插入数据
insert into table_name (field1,field2,...,fieldN) values (value1,value2,...,valueN)
如果数据是字符型,必须使用单引号或者双引号,如:"value"。
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。
三.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 |
如果给定的条件在表中没有任何匹配的记录,那么查询不会返回任何数据。
实例:
四.update更新
update table_name set field1=new-value1,field2=new-value2 [where Clause];
- 可以同时更新一个或多个字段。
- 可以在 WHERE 子句中指定任何条件。
- 可以在一个单独表中同时更新数据。
五.delete语句
delete from table_name [where Clause];
- 如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
- 你可以在 WHERE 子句中指定任何条件
- 您可以在单个表中一次性删除记录。
六.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 子句来指定条件。
七.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: 可选,返回所有结果集,包含重复数据。
八.order by 排序
Select field1,field2,...fieldN from table_name1,table_name2...order by field1 asc|desc,field2...[默认asc]
- 可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
- 可以设定多个字段来排序。
- 可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
- 可以添加 WHERE...LIKE 子句来设置条件。
九.group by分组
Select column_name,function(column_name) from table_name where column_name operator value group by column_name;
十.join连接
inner join(内连接,等值连接):获取两个表中字段匹配关系的记录。
left join(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
right join(右连接):获取右表所有记录,即使左表没有对应匹配的记录。
十一.NULL值处理
当提供的查询条件字段为 NULL 时,使用 SQL SELECT 命令就无法正常工作。
IS NULL: 当列的值是 NULL,此运算符返回 true。
IS NOT NULL: 当列的值不为 NULL,运算符返回 true。
<=>: 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true
在 MySQL 中,NULL 值与任何其它值的比较(即使是 NULL)永远返回 NULL,即 NULL = NULL 返回 NULL 。
十二.正则表达式
下表中的正则模式可应用于 regexp 操作符中
模式 | 描述 |
---|---|
^ | 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 'n' 或 'r' 之后的位置 |
$ | 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 'n' 或 'r' 之前的位置 |
. | 匹配除 "n" 之外的任何单个字符。要匹配包括 'n' 在内的任何字符,请使用象 '[.\n]' 的模式。 |
[...] | 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a' |
1 | 负值字符集合。匹配未包含的任意字符。例如, '2' 可以匹配 "plain" 中的'p'。 |
匹配 p1 或 p2 或 p3。例如, 则匹配 "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 次。 |
十三.alert命令
当需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令。
1.如下命令使用了 ALTER 命令及 DROP 子句来删除以上创建表的 i 字段:
2.如下命令使用了alter命令及add子句来添加表的i2字段,定义数据类型为int
3.如果需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。
4.如果需要修改字段类型及名称, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。
把字段name 的数据类型由varchar(100)改为varchar(50)
在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型。
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;
唯一索引
索引的值必须唯一,但允许有空值。如果是组合索引,则列的组合必须唯一。有以下几种创建方式:
- 创建索引
Create union index indexname on mytable(username(length));
- 修改表结构
Alter table mytable add union [indexname] (username(length));
- 创建表时直接指定
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。
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;删除主键
显示索引信息
临时表
Mysql临时表在我们需要保存一些临时数据时非常有用的。临时表只在当前连接可见,当关闭连接时,mysql会自动删除表并释放所有空间。
创建临时表的语法:create temporary table tbl_name(id int not null,name varchar(16) not null);
当你使用 SHOW TABLES命令显示数据表列表时,你将无法看到 SalesSummary表。
如果你退出当前MySQL会话,再使用 SELECT命令来读取原先创建的临时表数据,那你会发现数据库中没有该表的存在,因为在你退出时该临时表已经被销毁了。
默认情况下,当你断开与数据库的连接后,临时表就会自动被销毁。当然你也可以在当前MySQL会话使用 DROP TABLE 命令来手动删除临时表。
drop table test3;
复制表
步骤1:使用show create table命令获取创建数据表(create table)语句,该语句包含了原数据表的结构,索引等。
元数据
序列使用
使用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(自动增长)特性的属性列的最新值
处理重复数据
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));
3、Insert ignore into 会忽略数据库中已经存在的数据,如果数据库中就插入新的数据。如果有数据就跳过这条数据。
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子句中列出的列。
6、过滤重复数据
在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据
使用group by 来读取数据库表中不重复的数据。
7、删除重复的数据
create table person_tbl5 select first_name,last_name,sex from person_tbl3 group by first_name,last_name,sex; 复制表和数据
alter table person_tbl5 rename to person_tbl3; 新表重命名
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';
2)通过命令选项来设置数据输出的指定格式,以下实例为导出CSV格式:
select * from test1 into outfile '/tmp/test2.txt' fields terminated by ',' enclosed by '"' lines terminated by 'rn';
3)以下实例生成一个文件,每个值用逗号隔开:
select id,name into outfile '/tmp/test3.txt' fields terminated by ',' optionally enclosed by '"' lines terminated by 'n' from test1;
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
2)导出sql格式的数据
导出sql格式的数据到指定的文件中:
mysqldump -u root -p database_name table_name > dump.txt
mysqldump -u root -p yisen person_tbl2 > /tmp/person_tbl2.txt
2)导出整个数据库的数据
mysqldump -u root -p yisen2 > database_dump.txt;
4)备份所有数据库
mysqldump -u root -p --all-databases >alldatabases_dump.txt
5)将数据表及数据库拷贝到其他主机
使用管道来将导出的数据导入到指定的远程主机上
Mysqldump -u root -p database_name |mysql -h other-host.com database_name
导入数据
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;
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
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;
mysqlimport 语句中使用 --columns 选项来设置列的顺序:(指定后的导入结果与预期不一致)
mysqlimport -u root -p --local --columns=name,id yisen2 /tmp/test6.txt;