常用linux操作数据库命令
systemctl start mysqld 启用数据库
systemctl status mysqld 查看数据库状态
mysql -uroot -p12345" 登录数据库
show databases; 显示数据库列表
use db_name; 指定数据库
show tables; 显示指定数据库的所有表
show columns from tables_name;显示数据表的属性,属性类型,主键信息等
show index from tables_name; 显示数据表的详细索引信息,包括主键
show tables status like [from db_name][like 'pattern'] \G; 输出数据库管理系统的性能及统计信息
数据库安装配置可以参考网上教程。
1.创建数据库
create database db_name;
2.删除数据库
drop database db_name;
3.创建数据表
create table table_name(column_name column_type)
4.删除数据表
drop table table_name;
5.插入数据
insert into table_name(field1, field2...) values (values1, values2...)
6.查询数据
select column_name,column_name from table_name [where clause][limit n][ offset M]
where:
BINARY区分大小写
7.更新数据表
update table_name set field1=new-value1,field2=new-values2...[where clause]
8.删除表信息
delete from table_name [where clause]
9.条件
like模糊匹配 %通配符;
union操作符,删除重复数据;
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
order by [cloumn_name] 排序;默认升序,如ASC DESC指定排序方式
group by [column_name] 将数据表按照某个属性分组
with rollup 可以在分组统计数据基础上再进行相同的统计(sum,avg,count...)
coalesce(a,b,c) 可以取代null的名称
10.Join连接实现多表查询
-
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录
inner join
SELECT a._id, a._author, b._count FROM run a INNER JOIN cou b ON a._author = b._author;
等价于
SELECT a._id, a._author, b._count FROM run a, cou b WHERE a._author = b._author;
11.NULL值处理
- IS NULL: 当列的值是 NULL,此运算符返回 true。
- IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
- <=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true。
注意
select * , columnName1+ifnull(columnName2,0) from tableName;
12.正则表达式
常用的如^ $ [...] [^...] p1|p2|p3 * + {n} {m,n}
事务
- 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
- 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
- 事务用来管理 insert,update,delete 语句
一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)
事务控制语句:
-
BEGIN或START TRANSACTION;显式地开启一个事务;
-
COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改成为永久性的;
-
ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
-
SAVEPOINT identifier;SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;
-
RELEASE SAVEPOINT identifier;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
-
ROLLBACK TO identifier;把事务回滚到标记点;
-
SET TRANSACTION;用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。
MYSQL 事务处理主要有两种方法:
1、用 BEGIN, ROLLBACK, COMMIT来实现
- BEGIN 开始一个事务
- ROLLBACK 事务回滚
- COMMIT 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:
- SET AUTOCOMMIT=0 禁止自动提交
- SET AUTOCOMMIT=1 开启自动提交
13.alter修改
修改表名或修改数据库表字段
alter table table_name [add\drop\modify] 字段 [类型][first/after 字段]
alter table table_name change 修改字段 修改后字段 类型
alter table table_name1 rename to table_name2;修改表名
alter table table_name engine=newEngine; 修改存储引擎
alter table table_name drop foreign key key_name; 删除外键约束
alter table table_name alter 字段 set default 100;修改字段默认值
修改字段类型、创建删除索引等,功能比较强大
MySQL索引
索引分单列索引和组合索引。创建索引时,你需要确保该索引时应用在SQL查询语句的条件。实际上,索引也是一张表,该表保存了主键和索引字段,并指向实体表的记录。虽然索引大大提高了查询速度,同时也降低更新表的速度。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。
创建索引
CREATE INDEX indexName ON mytable(username(length));
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
修改表结构(添加索引)
ALTER table tableName ADD INDEX indexName(columnName)
删除索引
DROP INDEX [indexName] ON mytable;
唯一索引:索引列的值必须唯一,但允许有空值。UNIQUE
使用ALTER 命令添加和删除索引
有四种方式来添加数据表的索引:
- ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
- ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
- ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
- ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。
显示索引信息
show index from table_name; \G
MySQL临时表(temporary table)
临时表只在当前连接可见,当关闭连接时,MySQL会自动删除表并释放所有空间。
MySQL复制表
复制MySQL数据表,步骤如下:
- 使用 SHOW CREATE TABLE 命令获取创建数据表(CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等。
- 复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令 将完全的复制数据表结构。
- 如果你想复制表的内容,你就可以使用 INSERT INTO ... SELECT 语句来实现。
MySQL元数据
- 查询结果信息: SELECT, UPDATE 或 DELETE语句影响的记录数。
- 数据库和数据表的信息: 包含了数据库及数据表的结构信息。
- MySQL服务器信息: 包含了数据库服务器的当前状态,版本号等。
MySQL
AUTO_INCREMENT | 自增 |
---|---|
LAST_INSERT_ID() | 获取最后的插入表中的自增列的值 |
insect | 重置序列 |
AUTO_INCREMENT=100 | 设置序列初始值 |
INSERT IGNORE INTO | 忽略数据库中的重复数据,如果有则跳过 |
INSERT REPLACE INTO | 如果存在primary 或 unique相同的记录,则先删除掉。再插入新记录 |
,查询重复的值,请执行以下操作:
- 确定哪一列包含的值可能会重复。
- 在列选择列表使用COUNT(*)列出的那些列。
- 在GROUP BY子句中列出的列。
- HAVING子句设置重复数大于1。
select count(*) as repeat,last_name,first_name from person group by last_name,first_name having repeat > 1;
如果你需要读取不重复的数据可以在 SELECT 语句中使用 DISTINCT 关键
字来过滤重复数据
select distinct last_name,first_name from person;
也可以使用 GROUP BY 来读取数据表中不重复的数据:
select last_name,first_name from person group by (last_name,first_name);
删除重复数据,可以使用创建去除重复值后的表实现或添加 INDEX(索引) 和 PRIMAY KEY(主键)方法
alter ignore table person add primary key (last_name,first_name);
SQL注入
通过把SQL命令插入到web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
防止SQL注入,我们需要注意以下几个要点:
- 1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。
- 2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
- 3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
- 4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
- 5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
- 6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等
导出数据
select * from person into outfile 'c:\\users';