MySQL
1.数据目录
数据库:文件夹
表:文件
数据
2.安装目录
配置文件 my.imi
SQL
Structured Query Language:结构化查询语言。。定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方。称之为方言。
通用语法
SQL语句单行或者多行书写,以分号结尾。可使用空格和缩进来增强语句的可读性
MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
单行注释
-- 注释内容【--后必须有空格】 # 注释内容(mysql特有)
多行注释
/* 注释 */
DDL:数据定义语言
用来定义数据库对象:数据库,表,列表。关键字:create,drop,alter
DML:数据操作语言
用来对数据库中表的记录进行增删改。关键字:insert,delete,update
DQL:数据查询语言
用来查询数据库中表的记录(数据)。关键字:select,where
DCL:数据控制语言
用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT,REVOKE
操作数据库:CRUD Create,Retrieve查,Update改,Delete 使用数据库
登录:mysql -u... -p... mysql -uroot -padmin
mysql -hip
-u... -p... mysql -h127.0.0.1 -uroot -p
DDL
操作数据库
查询数据库
show databases
information_schema
mysql
performance_schema
test
show create database mysql;
Database | Create Database
mysql | CREATE DATABASE `mysql` /*!40100 DEFAULT CHARACTER SET utf8 */
创建数据库
creat database db1;
create database if not exists db2;
create database if not exists db2 character set utf8;
修改数据库
alter database db2 character set jbk;
删除数据库
drop database db1;
?
drop database if exists db1;
使用数据库
select database();查询当前正在使用的数据库
use db2;使用数据库
操作表
查询表
show tables;
desc 表名;查询表结构
创建表
create table tab1(age int,height double(3,2),birthday date,name varchar(5));
date:yyyy-MM-dd;
datetime:yyyy-MM-dd HH:mm:ss
timestamp:时间错类型 包含年月日时分秒。 若不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值。
create table tab2(age int,
height double(3,2),
birthday date,
name varchar(5),
insert_time timestamp
);
creat table 表名 like 被复制表名;
删除D(Delete)
drop table;
drop table if exists
修改表U(update)
1.修改表名:alter table 表名 rename to 新的表名
2.修改表的字符集:alter table 表名 character set 字符集名
3.添加一列:alter table 表名 add 列名 数据类型;
4.修改列名称类型:alter table 表名 change 列名 新列名 新数据类型
alter table 表名 modify 列名 新数据类型
5.删除列:alter table 表名 drop sex;
DML:增删改表中数据
添加数据
INSERT INTO 表名(NAME,age,chinese,math) VALUES("张三",20,99.5,1122.5);
列名和值一一对应
若表名后,不定义列名,则默认给所有列添加值
insert into 表名 values(值1,值2,.....值n);
除了数字类型,其他都用引号起来【单引双引皆可】
删除数据
delete from 表名 [where条件]; delete from 表名 where age=1; 不加条件,改变所有数据的
delete from 表名; 有多少记录就删除多少次
truncate table 表名; 删除表,然后再创建一个一模一样的空表
修改数据
update 表名 set 列名1=值1,列名2=值2,......[where 条件]
DQL:查询表中数据
select *from 表名;
1.语法
select 字段列表 from 表名 where 条件列表 group by 分组字段 having 分组之后的条件 order by 排序 limit 分页限定
2.基础查询
1.多个字段查询
SELECT sex,NAME,age FROM preson;
?
SELECT
?
sex, -- 性别
?
NAME, -- 姓名
?
age -- 年龄
?
FROM
?
preson; -- 成员表
2.去重【注意格式....eg空格】
SELECT DISTINCT addresss FROM preson;
3.计算列
SELECT NAME,math,english,math english FROM preson;
SELECT NAME,math,english,math IFNULL(english,0) FROM preson;-- 空值
4.起别名
SELECT NAME,math,english,math IFNULL(english,0) AS 总分 FROM preson;
[可用空格代替AS]
SELECT NAME,math AS 数学,english 英语,math IFNULL(english,0) AS 总分 FROM preson;
3.条件查询
1.where子句后跟条件
2.运算符
>、<、<=、>=、=、<>【不等于】
BETWEEN...AND 【之间,包含双边】
IN(集合) 【之内】
LIKE 【模糊查询】
IS NULL
and 或 &&
or 或 ||
not 或 !
【NULL值不能使用=、!=判断,用IS NULL,IS NOT NULL】
SELECT *FROM preson WHERE age<>20;
SELECT *FROM preson WHERE NAME LIKE ‘马%‘;
SELECT *FROM preson WHERE NAME LIKE ‘_岩%‘;
SELECT *FROM preson WHERE NAME LIKE ‘___‘;
SELECT *FROM preson WHERE NAME LIKE ‘%马%‘;
%一个或多个
_字数
4.查询语句
排序查询
order by 子句
order by 排序字段1 排序方式1,排序字段2 排序方式2
排序方式 ASC:升序 【默认的】; DESC:降序
SELECT *FROM preson ORDER BY math,english DESC;
聚合函数:将一列数据作为一个整体,进行纵向的运算。
count:计算个数
1.一般选择非空的列 主键
2.count(*)
max:计算最大值
min
avg:计算平均值
SELECT SUM(english)FROM preson; -- 自动排除null值
-- 解决办法
SELECT COUNT(IFNULL(english,0))FROM preson; -- IFNULL
SELECT COUNT(id)FROM preson;-- 选择非空的列进行计算
分组查询
group by 分组字段
注意1.分组之后查询的字段:分组字段、聚合函数
2.where ,having区别。
1.where分组之前进行限定,不满足条件,不参与分组
having分组之后进行限定,不满足条件,则不会被查询出来
2.where后不可跟聚合函数,having可进行聚合函数的判断
SELECT sex,COUNT(id),AVG(math),AVG(english)FROM preson GROUP BY sex
SELECT sex,AVG(math)FROM preson WHERE math>=70 GROUP BY sex
SELECT sex,COUNT(id),AVG(math)FROM preson WHERE math>=70 GROUP BY sex HAVING COUNT(id)>2;-- 分组之后人数大于二的 HAVING
SELECT sex,COUNT(id) 人数,AVG(math)FROM preson WHERE math>=70 GROUP BY sex HAVING 人数>2;
分页查询
limit 开始的索引,每页查询的条数;
公式:开始的索引=(当前页码-1)*每页显示的条数
SELECT id,NAME,age FROM preson LIMIT 0,2;-- 第一页
SELECT id,NAME,age FROM preson LIMIT 2,2;-- 第二页
limit是MySQL的一个“方言”;
5.约束:对表中的数据进行限定,保证数据的正确性、有效性和完整性
非空约束 not null
USE db2;
CREATE TABLE student(id INT,
NAME VARCHAR(5) NOT NULL-- 创建前约束
);
ALTER TABLE student MODIFY NAME VARCHAR(5);
ALTER TABLE student MODIFY NAME VARCHAR(5) NOT NULL;-- 创建后约束
唯一约束 unique
USE db2;
CREATE TABLE student1(id INT UNIQUE,-- null可重复
NAME VARCHAR(5)
);
ALTER TABLE student1 DROP INDEX id;
ALTER TABLE student1 MODIFY id INT UNIQUE;
主键约束 primary key
1.非空且唯一
2.一张表只能有一个字段为主键
3.主键就是表中记录的唯一标识
USE db2;
CREATE TABLE student2(id INT PRIMARY KEY);
-- ALTER TABLE student1 MODIFY id INT;
ALTER TABLE student2 DROP PRIMARY KEY;
ALTER TABLE student2 MODIFY id INT PRIMARY KEY;
自动增长
1.若某一列是数值类型的,使用 auto_increment可以完成值的自动增长。
2.配合主键使用
USE db2;
CREATE TABLE student4(id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(5)
);
INSERT INTO student4(NAME) VALUES(‘张三‘),(‘李四‘);
INSERT INTO student4 VALUES(NULL,‘张三‘),(10,‘李四‘),(NULL,‘王五‘);
SELECT *FROM student4;
ALTER TABLE student4 MODIFY id INT;-- 删除自动增长
ALTER TABLE student4 MODIFY id INT AUTO_INCREMENT;
外键约束 foreign key【外键可以为null值】
1.创建表时,添加外键
constraint 外键名称 foreign key(外键列名称)references 主表名称(主表列名称)
2.删除外键
alter table 表名 drop foreign key 外键名称;
3.创建表之后,添加外键
alter table 表名 add constraint 外键名称 foreign key(外键字段名称)references 主表名称(主表列名称)
CREATE DATABASE db3;
USE db3;
CREATE TABLE school(id INT PRIMARY KEY AUTO_INCREMENT,
grade VARCHAR(5)
);
INSERT INTO school VALUES(NULL,‘一年级‘),(NULL,‘二年级‘),(NULL,‘三年级‘);
SELECT *FROM school;
TRUNCATE TABLE school;
?
?
?
USE db3;
CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(5),
sch_id INT,
CONSTRAINT stu_sch_id FOREIGN KEY(sch_id)REFERENCES school(id)
);
INSERT INTO student VALUES(NULL,‘张三‘,1),(NULL,‘李四‘,2),(NULL,‘王五‘,3),(NULL,‘赵六‘,2);
SELECT *FROM student;
ALTER TABLE student DROP FOREIGN KEY stu_sch_id;
ALTER TABLE student ADD CONSTRAINT stu_sch_id FOREIGN KEY(sch_id)REFERENCES school(id);
级联
级联删除:on delete cascade;
级联更新:on update cascade;
ALTER TABLE student ADD CONSTRAINT stu_sch_id FOREIGN KEY(sch_id)REFERENCES school(id)ON UPDATE CASCADE ON DELETE CASCADE;