MySQL笔记
SQL基本语句:
show databases; 显示所有的数据库
create database + 数据库名; 创建数据库
drop database + 数据库名; 删除数据库
use + 数据库名; 在该数据库下操作
select database( ); 选择查看当前正在使用的某个数据库
create table 表名(
字段名 类型(长度) [约束],
字段名 类型(长度) [约束]
); 创建表格
primary key(主键) auto_increment(自增)
show table 在数据库里显示表格
show columns from 数据表 查看表头具体信息(属性类型,主键信息)
show index from 数据表 显示数据表的详细索引信息
drop table + 表名 删除表
desc + 表名 查看表结构
insert into + 表名 values(相对应的数据) 插入表格数据内容
insert into + 表名(表头名) values(相对应表头名的数据) 插入表格数据内容
select * from + 表名 查看表里数据
delete from 表名 删除整个表
delete from 表名 where id = 想要删除的某条信息id 删除表中的某条信息
update 表名 set 表头名 = “修改的内容” where id = 修改的某条信息id 修改数据
rename table 原表名 to 将要修改的表名 修改表名
异常的抛出
数据库数据类型
数值,日期/时间,字符串类型
3.1 严格数值数据类型:INTEGER,SMALLINT,DECIMAL,NUMERIC
近似数值数据类型:FLOAT,REAL,DOUBLE,PRECISION
3.2 日期与时间:DATETIME,DATE,TIMESTAMP,TIME ,YEAR
3.3 字符串类型:CHAR,VARCHAR,BINARY,VARBINARY,BLOB,TEXT,ENUM,SET
查询数据库版本号
直接输入:select mysql();
间接查询:status
2020.01.25
➢ 数据库:数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
➢ RDBMS 即关系数据库管理系统(Relational Database Management System)的特点:
● 1.数据以表格的形式出现
● 2.每行为各种记录名称
● 3.每列为记录名称所对应的数据域
● 4.许多的行和列组成一张表单
● 5.若干的表单组成database
➢ RDBMS专业术语:
● 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
● 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
● 外键:外键用于关联两个表。
● 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
● 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
● 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
➢ MySQL安装的地址:地址(安装的时候开启管理员权限)
https://dev.mysql.com/downloads/mysql/
➢ 检测电脑是否自带安装MySQL
rpm -qa | grep mysql
➢ 发现自己的电脑有MySQL系统,删除方法;
// 普通删除模式
rpm -e mysql
// 强力删除模式,如果使用上面命令删除时,提示有依赖的其它文件,则用该命令可以对其进行强力删除
rpm -e --nodeps mysql
➢ MySQL安装步骤:地址
https://www.runoob.com/mysql/mysql-install.html
➢ 登录MySQL语句
mysql -h 主机名 -u 用户名 -p
➢ MySQL忘记密码操作
○ 打开 my.cnf 配置文件,找到 [mysqld] ,然后在该行下面添加以下参数:
skip-grant-tables
○ 重启MySQL服务
service mysql restart
○ 登录的时候不需要密
○ root密码为123456
mysql> use mysql; mysql> update user set authentication_string=password(“123456”) where user=‘root’; mysql> flush privileges; # 刷新权限
● 注意:注意密码字段名 5.7 版本的是 authentication_string,之前的为 password。修改完后,记得注释掉 my.cnf 中的 skip-grant-tables 参数,重启 MySQL 服务,就可以用你设置的密码登录了。(Windows密码修改下面的笔记有相关的教程修改密码)
➢ MySQL常用编写语句
○ use 数据库名
选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库。
● SHOW DAYABASES
列出 MySQL 数据库管理系统的数据库列表。
● SHOW TABLES
显示指定数据库的所有表,使用该命令前需要使用 use 命令来选择要操作的数据库。
● SHOW COLUMNS FROM 数据表
显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。
● SHOW INDEX FROM 数据表
显示数据表的详细索引信息,包括PRIMARY KEY(主键)。
● SHOW TABLE STATUS [FROM db_name] [LIKE ‘pattern’] \G:
该命令将输出Mysql数据库管理系统的性能及统计信息。
● MySQL相关语句:
mysql> SHOW TABLE STATUS FROM RUNOOB;
mysql> SHOW TABLE STATUS from RUNOOB LIKE ‘runoob%’;
mysql> SHOW TABLE STATUS from RUNOOB LIKE ‘runoob%’\G;
➢ 创建数据库
CREATE DATABASES 数据库名
➢ 使用mysqladmin创建数据库
mysqladmin -u root -p create 数据库名
➢ 删除数据库
mysql> drop database 数据库名;
➢ 使用mysqladmin删除数据库
mysqladmin -u root -p drop 数据库名
➢ 选择数据库
USE 数据库名
➢ MySQL数据库类型
○ 数值类型
■ 严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC)
■ 近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)
○ 日期/时间类型
DATETIME、DATE、TIMESTAMP、TIME和YEAR
○ 字符串(字符)类型
CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET
2020.01.25
➢ MySQL创建数据表
CREATE TABLE 表名 (column_name(列名) column_type(数据类型));
如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
ENGINE 设置存储引擎,CHARSET 设置编码。
➢ MySQL删除数据表
DROP TABLE 表名 ;
○ 删除表内数据(delete)
delete from 表名 where 删除条件;
//释放该表表空间
optimize table student;
○ 清除表内数据(truncate)
truncate table 表名;
➢ MySQL插入数据
INSERT INTO table_name ( field1, field2,…fieldN )
VALUES
( value1, value2,…valueN );
● 读写数据表(查询全表)
select * from 表名;
●
select _column,_column from _table [where Clause] [limit N][offset M]
select * : 返回所有记录
limit N : 返回 N 条记录
offset M : 跳过 M 条记录, 默认 M=0, 单独使用似乎不起作用
limit N,M : 相当于 limit M offset N , 从第 N 条记录开始, 返回 M 条记录
select * from _table limit (page_number-1)*lines_perpage, lines_perpage
或者
select * from _table limit lines_perpage offset (page_number-1)*lines_perpage
MySQL查询笔记待看
2021/01/27
➢ SQL SELECT 语句使用 WHERE 子句从数据表中读取数据的通用语法:
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:数据库中常用的是where关键字,用于在初始表中筛选查询。它是一个约束声明,用于约束数据,在返回结果集之前起作用。
group by:对select查询出来的结果集按照某个字段或者表达式进行分组,获得一组组的集合,然后从每组中取出一个指定字段或者表达式的值。
having:用于对where和group by查询出来的分组经行过滤,查出满足条件的分组结果。它是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作。
执行顺序
select –>where –> group by–> having–>order by(执行顺序有待验证)
➢ UPDATE 命令修改 MySQL 数据表数据的通用 SQL 语法:
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
你可以同时更新一个或多个字段。
你可以在 WHERE 子句中指定任何条件。
你可以在一个单独表中同时更新数据
➢ SQL DELETE 语句从 MySQL 数据表中删除数据的通用语法:
DELETE FROM table_name [WHERE Clause]
如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
你可以在 WHERE 子句中指定任何条件
您可以在单个表中一次性删除记录。
● delete,drop,truncate 都有删除表的作用(执行的速度:drop>truncate>delete)
➢ SQL SELECT 语句使用 LIKE 子句从数据表中读取数据的通用语法:
SELECT field1, field2,…fieldN FROM table_name WHERE field1 LIKE condition1 [AND [OR]] filed2 = ‘somevalue’
你可以在 WHERE 子句中指定任何条件。
你可以在 WHERE 子句中使用LIKE子句。
你可以使用LIKE子句代替等号 =。
LIKE 通常与 % 一同使用,类似于一个元字符的搜索。
你可以使用 AND 或者 OR 指定一个或多个条件。
你可以在 DELETE 或 UPDATE 命令中使用 WHERE…LIKE 子句来指定条件。
例:mysql> SELECT * from runoob_tbl WHERE runoob_author LIKE ‘%COM’;
● like 匹配/模糊匹配,会与 % 和 _ 结合使用:
‘%a’ //以a结尾的数据
‘a%’ //以a开头的数据
‘%a%’ //含有a的数据
‘a’ //三位且中间字母是a的
‘a’ //两位且结尾字母是a的
'a’ //两位且开头字母是a的
● 在where like 的条件查询中,SQL 提供了四种匹配方式。
➢ MySQL 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: 可选,返回所有结果集,包含重复数据。
笔记:
UNION 语句:用于将不同表中相同列中查询的数据展示出来(不包括重复数据)
UNION ALL 语句:用于将不同表中相同列中查询的数据展示出来(包括重复数据)
使用形式如下:
SELECT 列名称 FROM 表名称 UNION SELECT 列名称 FROM 表名称 ORDER BY 列名称; SELECT 列名称 FROM 表名称 UNION ALL SELECT 列名称 FROM 表名称 ORDER BY 列名称;
➢ SQL SELECT 语句使用 ORDER BY 子句将查询数据排序后再返回数据:
SELECT field1, field2,…fieldN FROM table_name1, table_name2…
ORDER BY field1 [ASC [DESC][默认 ASC]], [field2…] [ASC [DESC][默认 ASC]]
你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
你可以设定多个字段来排序。
你可以使用 ASC(升序) 或 DESC(降序) 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
你可以添加 WHERE…LIKE 子句来设置条件。
➢ MySQL拼音排序
■ 如果字符集采用的是 gbk(汉字编码字符集),直接在查询语句后边添加 ORDER BY:
SELECT * FROM runoob_tbl
ORDER BY runoob_title;
● 如果字符集采用的是 utf8(万国码),需要先对字段进行转码然后排序:
SELECT * FROM 表名;
ORDER BY CONVERT(runoob_title using gbk);
➢ GROUP BY语句根据一个或多个列对结果集进行分组,在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。
SELECT 列名, function方法名
FROM 表名
WHERE 列名 operator value
GROUP BY 列名;
● 使用 with rollup
WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
例如我们将以上的数据表按名字进行分组,再统计每个人登录的次数:
举例:mysql> SELECT name,
SUM(singin) as singin_count
FROM employee_tbl
GROUP BY name
WITH ROLLUP;
name | singin_count |
小丽 | 2 |
小明 | 7 |
小王 | 7 |
NULL | 16 |
4 rows in set (0.00 sec)
其中记录 NULL 表示所有人的登录次数。
我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:
select coalesce(a,b,c);
参数说明:如果anull,则选择b;如果bnull,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。
如果名字为空的时候,我们可以使用总数代替:
举例:mysql> SELECT coalesce(name, ‘总数’),
SUM(singin) as singin_count
FROM employee_tbl
GROUP BY name
WITH ROLLUP;
➢ MySQL连接的使用
○ JOIN 按照功能大致分为如下三类:
● INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
● LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
● RIGHT JOIN(右连接):(LEFT JOIN相反)获取右表所有记录,即使左表没有对应匹配的记录。
■ 使用MySQL的INNER JOIN(也可以省略 INNER 使用 JOIN,效果一样)来连接以上两张表来读取runoob_tbl表中所有runoob_author字段在tcount_tbl表对应的runoob_count字段值:
● INNER JOIN
mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
a.runoob_id | a.runoob_author | b.runoob_count
1 | 菜鸟教程 | 10
2 | 菜鸟教程 | 10
3 | RUNOOB.COM | 20
4 | RUNOOB.COM | 20
4 rows in set (0.00 sec)
等价于
● WHERE 子句
mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a, tcount_tbl b WHERE a.runoob_author = b.runoob_author;
a.runoob_id | a.runoob_author | b.runoob_count
1 | 菜鸟教程 | 10
2 | 菜鸟教程 | 10
3 | RUNOOB.COM | 20
4 | RUNOOB.COM | 20
4 rows in set (0.01 sec)
● LEFT JOIN
MySQL left join 与 join 有所不同。 MySQL LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
● RIGHT JOIN
MySQL RIGHT JOIN 会读取右边数据表的全部数据,即便左边边表无对应数据。
➢ MySQL NULL 值处理
● IS NULL: 当列的值是 NULL,此运算符返回 true。
● IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
● <=>: 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true。
注意:在 MySQL 中,NULL 值与任何其它值的比较(即使是 NULL)永远返回 NULL,即 NULL = NULL 返回 NULL 。MySQL 中处理 NULL 使用 IS NULL 和 IS NOT NULL 运算符。
注意:
select * , columnName1+ifnull(columnName2,0) from tableName;
columnName1,columnName2 为 int 型,当 columnName2 中,有值为 null 时,columnName1+columnName2=null, ifnull(columnName2,0) 把 columnName2 中 null 值转为 0。
➢ MySQL 正则表达
下表中的正则模式可应用于 REGEXP 操作符中。
模式 描述
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。
. 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用像 ‘[.\n]’ 的模式。
[…] 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。
[^…] 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’。
p1|p2|p3 匹配 p1 或 p2 或 p3。例如,‘z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food”。
➢ MySQL 事务
● 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
● 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
● 事务用来管理 insert,update,delete 语句
➢ 一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability);
● 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
● 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
● 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
● 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
➢ 事务控制语句:
● 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 事务处理的两种方法:
○ 用 BEGIN, ROLLBACK, COMMIT来实现
● BEGIN 开始一个事务
● ROLLBACK 事务回滚
● COMMIT 事务确认
○ 直接用 SET 来改变 MySQL 的自动提交模式:
● SET AUTOCOMMIT=0 禁止自动提交
● SET AUTOCOMMIT=1 开启自动提交
➢ 保留点(savepoint)
○ savepoint 是在数据库事务处理中实现“子事务”(subtransaction),也称为嵌套事务的方法。事务可以回滚到 savepoint 而不影响 savepoint 创建前的变化, 不需要放弃整个事务。
ROLLBACK 回滚的用法可以设置保留点 SAVEPOINT,执行多条操作时,回滚到想要的那条语句之前。
● 使用 SAVEPOINT
SAVEPOINT savepoint_name; // 声明一个 savepoint
ROLLBACK TO savepoint_name; // 回滚到savepoint
● 删除 SAVEPOINT
保留点再事务处理完成(执行一条 ROLLBACK 或 COMMIT)后自动释放。
MySQL5 以来,可以用:
RELEASE SAVEPOINT savepoint_name; // 删除指定保留点
➢ MySQL alter命令(修改数据表名或者修改数据表字段)
○ 修改表字段(删除,添加)
//删除字段
mysql> ALTER TABLE testalter_tbl DROP i;
//增加字段
mysql> ALTER TABLE testalter_tbl ADD i INT;
注意点:
如果你需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)
FIRST 和 AFTER 关键字可用于 ADD 与 MODIFY 子句,所以如果你想重置数据表字段的位置就需要先使用 DROP 删除字段然后使用 ADD 来添加字段并设置位置。
○ 修改字段类型及名称(在ALTER命令中使用 MODIFY 或 CHANGE 子句 )
mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);
■ CHANGED使用方法
在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型。
mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
mysql> ALTER TABLE testalter_tbl CHANGE j j INT;
■ alter table 对 NULL 值和默认值得影响
//指定字段 j 为 NOT NULL 且默认值为100 。
mysql> ALTER TABLE testalter_tbl
-> MODIFY j BIGINT NOT NULL DEFAULT 100;
//如果你不设置默认值,MySQL会自动设置该字段默认为 NULL。
■ 修改字段默认值
mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
//使用 ALTER 命令及 DROP子句来删除字段的默认值
mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
//修改数据表类型(使用 ALTER 命令及 TYPE 子句来完成)
//注意:查看数据表类型可以使用 SHOW TABLE STATUS 语句。
mysql> ALTER TABLE testalter_tbl ENGINE = MYISAM; //修改存储引擎
mysql> SHOW TABLE STATUS LIKE ‘testalter_tbl’\G
■ 修改数据表的名称
//在 ALTER TABLE 语句中使用 RENAME 子句来实现。
mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;
//删除外键约束:keyName是外键别名
alter table tableName drop foreign key keyName;
//修改字段的相对位置:这里name1为想要修改的字段,type1为该字段原来类型,first和after二选一,这应该显而易见,first放在第一位,after放在name2字段后面
alter table tableName modify name1 type1 first|after name2;
➢ MySQL索引
索引分单列索引和组合索引。
单列索引:即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。
组合索引:即一个索引包含多个列。
注意点:创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
优势:索引可以大大提高MySQL的检索速度
缺点:滥用索引会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE
○ 普通索引
//创建索引
CREATE INDEX indexName ON table_name (column_name)
注意点:如果是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 indexName ON mytable(username(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命令添加和删除索引
//该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list):
//这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list):
//添加普通索引,索引值可出现多次。
ALTER TABLE tbl_name ADD INDEX index_name (column_list)
//该语句指定了索引为 FULLTEXT ,用于全文索引。
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list)
● 使用ALTER命令添加和删除主键
//添加主键索引时,你需要确保该主键默认不为空(NOT NULL)
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
//使用ALTER命令删除主键
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
注意点:删除主键时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。
● 显示索引信息
■ 使用 SHOW INDEX 命令来列出表中的相关的索引信息;可以通过添加 \G 来格式化输出信息。
mysql> SHOW INDEX FROM table_name; \G
➢ MySQL临时表(临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间)
//创建临时表
mysql> CREATE TEMPORARY TABLE SalesSummary (
-> product_name VARCHAR(50) NOT NULL
-> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
-> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
-> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);
//断开与MySQL连接,临时表就已经已经销毁
//创建临时表
CREATE TEMPORARY TABLE 临时表名 AS
(
SELECT * FROM 旧的表名
LIMIT 0,10000
);
//删除MySQL临时表
mysql>DROP table 临时表名;
➢ MySQL复制表
● 使用 SHOW CREATE TABLE 命令获取创建数据表(CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等。
● 复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令 将完全的复制数据表结构。
● 如果你想复制表的内容,你就可以使用 INSERT INTO … SELECT 语句来实现。
//1.查看表完整结构
mysql> SHOW CREATE TABLE runoob_tbl \G;
//2.修改SQL语句里面的表名,然后执行;
//3.拷贝数据表的数据你可以使用 INSERT INTO… SELECT 语句
➢ 方法二:MySQL复制表
CREATE TABLE targetTable LIKE sourceTable;
INSERT INTO targetTable SELECT * FROM sourceTable;
● 拷贝表中的部分字段
CREATE TABLE newadmin AS
(
SELECT username, password FROM admin
)
● 将新建的表的字段改名
CREATE TABLE newadmin AS
(
SELECT id, username AS uname, password AS pass FROM admin
)
● 拷贝部分数据
CREATE TABLE newadmin AS
(
SELECT * FROM admin WHERE LEFT(username,1) = ‘s’
)
● 创建表的同时定义表中的字段信息
CREATE TABLE newadmin
(
id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY
)
AS
(
SELECT * FROM admin
)
● MySQL复制表的两种方式
//复制表结构到新表
create table 新表 select * from 旧表 where 1=2
或
create table 新表 like 旧表
//复制表结构及数据到新表
create table新表 select * from 旧表
➢ MySQL元数据
● 查询结果信息: SELECT, UPDATE 或 DELETE语句影响的记录数。
● 数据库和数据表的信息: 包含了数据库及数据表的结构信息。
● MySQL服务器信息: 包含了数据库服务器的当前状态,版本号等。
■ 获取服务器元数据
命令 描述
SELECT VERSION( ) 服务器版本信息
SELECT DATABASE( ) 当前数据库名 (或者返回空)
SELECT USER( ) 当前用户名
SHOW STATUS 服务器状态
SHOW VARIABLES 服务器配置变量
➢ MySQL序列使用
○ 一张数据表只能有一个字段自增主键;实现自动增加,就可以使用MySQL序列来实现。
○ 使用auto_increment (无需指定,自动增加)
○ 重置序列
mysql> ALTER TABLE insect DROP id;
mysql> ALTER TABLE insect
-> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
-> ADD PRIMARY KEY (id);
○ 设置序列的开始值
auto_increment=100 //建表的时候可以写
//建表之后可以实现
mysql> ALTER TABLE t AUTO_INCREMENT = 100;
➢ MySQL 处理重复数据
○ 防止表中出现重复数据
在 MySQL 数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性。
● INSERT IGNORE INTO 与 INSERT INTO 的区别就是 INSERT IGNORE INTO 会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。
● 统计重复数据
mysql> SELECT COUNT(*) as repetitions, last_name, first_name -> FROM person_tbl
-> GROUP BY last_name, first_name
-> HAVING repetitions > 1;
//确定哪一列包含的值可能会重复。
//在列选择列表使用COUNT(*)列出的那些列。
//在GROUP BY子句中列出的列。
//HAVING子句设置重复数大于1
● 过滤重复数据
//select 语句中 使用distinct关键字过滤重复数据
mysql> SELECT DISTINCT last_name, first_name
-> FROM person_tbl;
//group by 读取数据表中不重复的数据
mysql> SELECT last_name, first_name
-> FROM person_tbl
-> GROUP BY (last_name, first_name);
● 删除重复数据
//使用以下SQL语句
mysql> CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl
GROUP BY (last_name, first_name, sex);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;
//在数据表中添加index(索引)和primary key(主键)
mysql> ALTER IGNORE TABLE person_tbl
-> ADD PRIMARY KEY (last_name, first_name);
● 笔记(简单理解)
//原理:先按照要查询出现重复数据的列,进行分组查询。count > 1 代表出现 2 次或 2 次以上。
select 列名1,count(1) as count
from 表名
group by 列名1
having count>1 and 其他条件
select 列名1,列名2,count(1) as count
from 表名
group by 列名1,列名2
having count>1 and 其他条件
//举例:
/查询重复数据/
select serialnum,cdate,count(*) as count
from m_8_customer_temp_20180820bak
group by serialnum,cdate
having count>1 and cdate>=‘2018-08-20 00:00:00’;
➢ SQL注入
通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
○ 防止SQL注入
● 1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。
● 2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
● 3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
● 4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
● 5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
● 6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
➢ MySQL 导出数据
○ 使用SELECT…INTO OUTFILE语句
//将数据表 runoob_tbl 数据导出到 /tmp/runoob.txt 文件中
mysql> SELECT * FROM runoob_tbl
-> INTO OUTFILE ‘/tmp/runoob.txt’;
○ 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服务器所拥有。这意味着,虽然你就可以读取该文件,但可能无法将其删除。
➢ MySQL 导入数据
○ mysql 命令导入
mysql -u用户名 -p密码 < 要导入的数据库数据(runoob.sql)
//实例
● source 命令导入
mysql> create database abc; # 创建数据库
mysql> use abc; # 使用已创建的数据库
mysql> set names utf8; # 设置编码
mysql> source /home/abc/abc.sql # 导入备份数据库
➢ MySQL 函数
○ MySQL字符串函数
○ MySQL数字函数
○ MySQL日期函数
○ MySQL高级函数
➢ MySQL运算符
○ 算术运算符
运算符 作用
大于
< 小于
<= 小于等于
= 大于等于
BETWEEN 在两值之间 >=min&&<=max
NOT BETWEEN 不在两值之间
IN 在集合中
NOT IN 不在集合中
<=> 严格比较两个NULL值是否相等 两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0
LIKE 模糊匹配
REGEXP 或 RLIKE 正则式匹配
IS NULL 为空
IS NOT NULL 不为空
○ 逻辑运算符
运算符号 作用
NOT 或 ! 逻辑非
AND 逻辑与
OR 逻辑或
XOR 逻辑异或
○ 位运算符
运算符号 作用
& 按位与
| 按位或
^ 按位异或
! 取反
<< 左移
右移
● 运算符优先级
最低优先级为: :=。
最高优先级为: !、BINARY、 COLLATE。
待整理
varchar、char,和 nvarchar/nchar 有什么样的区别啊?分别适合用在什么地方?
(在n开头的类型可以存储多国语言,没n的只能存储安装时的本地区域语言及英文,比如繁体的操作系统上装繁体的sqlserver,可能存简体中文就变成乱码。另外,n开头的比没有n开头的,存储空间大一倍,也就是n开头的数据存得少.至于varchar/nvarchar与char/nchar相比,前者是变长,只要不超过定义,那么存储的空间就是实际的数据大小,而后者,假设你定义了10,但是你存了一个字符,那么sqlserver在分配空间的时候,还是以10来分配。)
时间的数据类型(timestamp)
Mysql中经常用来存储日期的数据类型有三种:Date、Datetime、Timestamp。
( i n t 类型)在 MySQL 中支持的 5 个主要整数类型是 TINYINT,SMALLINT,MEDIUMINT,INT 和 BIGINT。这些类型在很大程度上是相同的,只有它们存储的值的大小是不相同的。
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
数据库建表具体操作
用户表
create table user(id
int(20) UNSIGNED AUTO_INCREMENT NOT NULL,username
varchar(6) NOT NULL,password
varchar(20) NOT NULL,phone
varchar(11) NOT NULL,address
varchar(200) NOT NULL,identity
smallint(2) NOT NULL,PRIMARY KEY (id
));
订单表
create table orders(orders_id
int(11) UNSIGNED AUTO_INCREMENT NOT NULL,id
varchar(11) NOT NULL,name_id
varchar(11) NOT NULL,time
timestamp NOT NULL,status
int(5) NOT NULL,note
varchar(200) NOT NULL,total
decimal NOT NULL,PRIMARY KEY (orders_id
));
菜品表
create table menu(name_id
int(15) UNSIGNED AUTO_INCREMENT NOT NULL,sort_id
int(15) NOT NULL,photo
blob NOT NULL,unit_price
decimal NOT NULL,sales_volume
bigint(20) NOT NULL,PRIMARY KEY (name_id
));
菜类表
create table type(sort_id
int(15) UNSIGNED AUTO_INCREMENT NOT NULL,type
varchar(20) NOT NULL,PRIMARY KEY (sort_id
));
在这里插入代码片