1、MySQL是关系型数据库!
2、RDBMS指关系型数据库管理系统,即数据库服务器。
3、MySQL重要文件
①C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe客户端程序,用来访问服务器
②C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe服务器程序
③C:\ProgramData\MySQL\MySQL Server 8.0\my.ini服务器配置文件
>配置MySQL的端口:port=3306,默认为3306
>配置字符编码
>配置二进制数据大小上限
④C:\ProgramData\MySQL\MySQL Server 8.0\Data该目录下的每一个目录表示一个数据库,每个目录下的每一个frm文件是一张表。是由DBMS来读写的。
4、开启关闭服务器以及登录退出客户端
开启服务器:net start mysql
关闭服务器:net stop mysql
客户端登录:mysql -u用户名 -p密码 -hIP(或者-hlocalhost)
退出服务器:exit或quit
5、SQL语言概述
①SQL:结构化查询语言(Structured Query Language),用来操作服务器
②SQL语句可以在单行或多行书写,以分号结尾;可使用空格和缩进来增强语句的可读性;MySQL不区分大小写,建议大写。
③SQL语句分类:
>DDL:数据定义语言,用来定义数据库对象,如库、表、列
>DML:数据操作语言,用来定义数据库记录(数据),增、删、改(数据更新)
>DCL:数据控制语言,用来定义访问权限与安全级别(对用户的创建及授权)
>DQL:数据查询语言
6、数据类型(1字节(Byte)= 8 bit,8位二进制的无符号数表数范围:0~255)
注意:存储的是字符数,并不是字节数,(一般一个字符一个字节)具体占用的字节数与编码有关。
utf-8一个汉字3个字节,一个英文字母1个字节。gbk一个汉字2个字节。
例如:varchar(10),非Unicode字符串类型,最多输入10个字母或5个汉字。而Unicode字符串类型,最多输入10个字母或10个汉字。
①浮点型:double(5,2)表示五位数据,2位小数;decimal:不会出现精度缺失问题
②char:固定长度字符串类型,char(255),当数据长度不足指定长度时会在后面添加空格
③varchar:可变长度字符串类型,varchar(65535),一次存储时,其中会有一个字节用来记录长度,当数据超过指定长度时会再增加一次指定大小空间
④(MySQL独有)text(clob):可变长度字符串类型
tinytext:最大存储值2^8-1B;text:2^16-1B;mediumtext:2^24-1B;longtext :2^32-1B;
text(blob):字节类型
binary固定长度二进制类型,最大255B,binary(10),当数据为5B时会添加5B来补位到10B。
varbinary:可变长度二进制类型(有记录位),255
tinyblob:可变长度二进制类型,2^8-1B
blob:2^16-1B
mediumblob:2^24-1B
longblob:(4G)2^32-1B
⑤timestamp:时间戳类型
以下:菜鸟教程https://www.runoob.com/mysql/mysql-tutorial.html
>LIKE字句
SELECT field1, field2,...fieldN
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
>UNION操作符:用于连接两个以上的SELECT语句的结果组合到一个结果集合中。多个SELECT语句会删除重复的数据。
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
其中:
-
DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
-
ALL: 可选,返回所有结果集,包含重复数据。
>排序:通过ORDER BY字句设定按哪个字段哪种方式排序
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1 [ASC [DESC][默认 ASC]], [field2...] [ASC [DESC][默认 ASC]]
其中:使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
>分组:GROUP BY语句根据一个或多个列对结果集进行分组,在分组的列上可以使用COUNT,SUM,AVG等函数
SELECT column_name, function(column_name) [as rename]
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
例:将数据表按名字进行分组,并统计每个人有多少条记录:
SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
coalesce 来设置一个可以取代 NUll 的名称。(coalesce(name, '总数')当name为null时用“总数”替代)
例:SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;
>联合多表查询JOIN
JOIN 按照功能大致分为如下三类:
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
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;
等价于:
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a, tcount_tbl b WHERE a.runoob_author = b.runoob_author;
>NULL值处理
三大运算符:
- IS NULL: 当列的值是 NULL,此运算符返回 true。
- IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
- <=>: 比较操作符(不同于=运算符),当比较的两个值为 NULL 时返回 true。
select * , columnName1+ifnull(columnName2,0) from tableName;
columnName1,columnName2 为 int 型,当 columnName2 中,有值为 null 时,columnName1+columnName2=null, ifnull(columnName2,0) 把 columnName2 中 null 值转为 0。
>正则表达式(部分)
例:查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据:
SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';
>事务
>ALTER命令:修改数据表名或者修改数据表字段
添加列:
ALTER TABLE testalter_tbl ADD i INT [FIRST];添加到第一列
ALTER TABLE testalter_tbl ADD i INT AFTER c;添加到c列之后
删除列:
ALTER TABLE testalter_tbl DROP i;
修改字段类型和名称:
ALTER TABLE testalter_tbl MODIFY j BIGINT NOT NULL DEFAULT 100;修改字段时指定字段j为 NOT NULL 且默认值为100 。
ALTER TABLE testalter_tbl CHANGE i j BIGINT;i要修改的字段名j新的字段名
修改字段默认值:
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
修改表名:
ALTER TABLE testalter_tbl RENAME TO alter_tbl;
>索引:MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
创建唯一(索引列的值必须唯一,但允许有空值)索引:
CREATE [UNIQUE] INDEX indexName ON mytable(username(length))
>临时表:临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。(CREATE TEMPORARY TABLE)使用 SHOW TABLES命令显示数据表列表时,无法看到创建的临时表,但能查询到数据。
>复制表:
获取数据表的完整结构:
SHOW CREATE TABLE runoob_tbl \G;
修改SQL语句的数据表名,并执行SQL语句
拷贝数据表的数据使用INSERT INTO... SELECT 语句来实现
>序列:使用AUTO_INCREMENT 来定义列
设置序列的初始值:
CREATE TABLE insect
-> (
-> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
-> PRIMARY KEY (id),
-> name VARCHAR(30) NOT NULL,
-> date DATE NOT NULL,
-> origin VARCHAR(30) NOT NULL
)engine=innodb auto_increment=100 charset=utf8;
修改序列的开始值:
ALTER TABLE t AUTO_INCREMENT = 100;
>处理重复数据
设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性时, INSERT IGNORE 会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。即执行后不会出错,也不会向数据表中插入重复数据。而 REPLACE INTO 如果存在 primary 或 unique 相同的记录,则先删除掉。再插入新记录。
>统计重复数据
SELECT COUNT(*) as repetitions, last_name, first_name -> FROM person_tbl -> GROUP BY last_name, first_name -> HAVING repetitions > 1;
>过滤重复数据
在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据。
SELECT DISTINCT last_name, first_name -> FROM person_tbl;
使用 GROUP BY 来读取数据表中不重复的数据
SELECT last_name, first_name -> FROM person_tbl -> GROUP BY (last_name, first_name);
>删除重复数据
复制新表并分组:
CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl GROUP BY (last_name, first_name, sex); DROP TABLE person_tbl; ALTER TABLE tmp RENAME TO person_tbl;
也可以在数据表中添加 INDEX(索引) 和 PRIMAY KEY(主键)这种简单的方法来删除表中的重复记录。
ALTER IGNORE TABLE person_tbl -> ADD PRIMARY KEY (last_name, first_name);
>SQL注入:通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。所以需要对用户输入的数据进行过滤处理。
>导出数据
SELECT * FROM runoob_tbl -> INTO OUTFILE '/tmp/runoob.txt';
导出表/库中SQL格式数据:
mysqldump -u root -p database_name table_name > dump.txt
导入表:(确认数据库已经创建)
mysql -u root -p database_name < dump.txt
>将指定主机的数据库拷贝到本地(确保两台服务器是相通的):指定远程服务器的IP、端口及数据库名。
mysqldump -h other-host.com -P port -u root -p database_name > dump.txt
>导入备份数据库
source /home/abc/abc.sql # 导入备份数据库
>导入数据
LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;
>MySQL函数
>MySQL运算符
注意比较运算符中:
等于:=
不等于:<>, !=
严格比较两个NULL值是否相等:<=>