数据库学习之MySQL

常用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';

 

猜你喜欢

转载自blog.csdn.net/u013783095/article/details/81163841
今日推荐