DDL 创建 删除 修改数据库,数据表(create drop alter)
DML 管理数据表的数据(insert updata delete)
DQL 查询数据表的数据(select)
DCL 控制数据库组件的存取(事务commit、rollback)
MySQL中注释:1、单行注释“#”,2、单行注释“--”,3、多行注释“/**/”
WHERE 限制条件
= 等于
<> 不等于。注释:在 SQL 的一些版本中,该操作符可被写成 !=
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某个范围内
LIKE 搜索某种模式
OR/IN 指定针对某个列的多个可能值
AND/&& 同时满足and前后的两个条件
MySQL中数据类型
整数类型 | 大小 | 描述 |
tinyint | 1byte | 非常小整数 |
smallint | 2byte | 小整数 |
mediumint | 3byte | 中等大小整数 |
int | 4byte | 标准的整数 |
bigint | 8byte | 大整数 |
小数类型 | 大小 | 描述 |
float | 4byte | 单精度浮点型 |
double | 8byte | 双精度浮点型 |
日期和时间类型 | 大小 | 描述 |
year | 1byte | 年份 |
time | 3byte | 时间 |
date | 3byte | 日期 |
datetime | 8byte | 日期+时间 |
timestamp | 4byte | 时间戳 |
字符串类型 | 大小 | 描述 |
char(M) | M个字符 | 固定长度的字符串 |
varchar(M) | M个字符 | 可变长度的字符串 |
tinytext | 2^8-1 byte | 非常小的字符串 |
text | 2^16-1 byte | 小型字符串 |
二进制类型 | 大小 | 描述 |
bit(M) | M位的二进制数 | 小的二进制数 |
binary(M) | M byte | 普通二进制数项 |
create database 库名;
DROP DATABASE 库名;
show databases;
#在创建表之前一定要先选择数据库
use 数据库名称;
USE s_students;
CREATE TABLE tablename(
#列信息
字段名词 数据类型 是否主键/是否为空/默认值 自增 ...
);
CREATE TABLE user(
id INT PRIMARY KEY auto_increment,
name VARCHAR(100)
);
(1)添加表列ADD:ALTER TABLE 表名 ADD 列名 类型;
USE s_students;
ALTER TABLE student ADD s_tel INT;
(2)修改列类型MODIFY:ALTER TABLE 表名 MODIFY 列名;
USE s_students;
ALTER TABLE student MODIFY age int NOT NULL; --将age修改为整型不能为空
ALTER TABLE new_student MODIFY name VARCHAR(100); --将name修改为100个字符大小
(3)修改列名 CHANGE:ALTER TABLE 表名 CHANGE 旧列名 新列名 类型;
USE s_students;
ALTER TABLE student CHANGE s_tel tel DOUBLE;
(4)删除列 DROP:ALTER TABLE 表名 DROP 列名;
USE s_students;
ALTER TABLE student DROP tel;
(5)修改表名:RENAME TABLE 表名 TO 新表名;
USE s_students;
RENAME TABLE student TO new_student;
(6)修改字符集character set:ALTER TABLE 表名 character set 字符集;
注意:列如果为主键,则不能修改,如果非要修改,可以通过以下两种方式
1、删除主键,再修改列并定义新的主键
-- 删除原有主键
ALTER TABLE 表名 DROP PRIMARY KEY;
-- 定义新的主键
ALTER TABLE 表名 ADD PRIMARY KEY (列名);
2、先将该列修改为非主键,再修改列并设置列为主键
(1)直接删除:DROP TABLE 表名;
(2)判断表是否存在,如果存在则删除表:DROP TABLE IF EXISTS 表名;
USE s_students;
SHOW TABLES;
USE s_students;
DESC stu_info;
#插入的是整行数据而非某一列数据
INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...);
INSERT INTO new_student(id, `name`, age) VALUES (1, '张三', 55);
INSERT INTO new_student(id, `name`, age) VALUES (2, '李四', 666),(21,'多条数据',777);
INSERT INTO new_student VALUES (3,'测试省略添加列表',22); --省略字段列表相当于添加全部
INSERT INTO new_student SET sex = '男'; --插入sex是男的一行数据其他字段设置为空
(1)删除表中所有数据
DELETE FROM new_student;
(2)删除表中某些数据
DELETE FROM table_name WHERE some_column=some_value;
DELETE FROM new_student WHERE id=2;
#更新某一行某一列数据(带where)/某一整列数据(不带where)
UPDATE table_name SET column1=value1,... WHERE some_column=some_value;
UPDATE new_student SET name='mysql',age=21 WHERE id=2;
UPDATE new_student SET sex = '女' where id !=3;
UPDATE new_student SET sex = '男';
SELECT * FROM 表名;
1、查询指定字段的内容
select 字段1,字段2,... from 表名;
SELECT id,name FROM new_student;
2、单个条件查询(or/in)
SELECT * FROM new_student WHERE id=2;
SELECT * FROM new_student WHERE age=22 or age=21;
SELECT * FROM new_student WHERE id>5;
SELECT id,name FROM new_student WHERE id IN (2,3);
3、多个条件查询(and)
SELECT * FROM new_student WHERE age=22 AND name='测试省略添加列表';
4、查询...到...之间的内容(between...and.../ && / and)
SELECT * FROM new_student WHERE age BETWEEN 21 AND 22; --包含21和22
SELECT * FROM new_student WHERE age > 23 AND age < 26;
SELECT * FROM new_student WHERE age > 23 && age < 26;
SELECT * FROM new_student WHERE age IS NOT NULL;
_:单个任意字符
%:多个任意字符
#查询表中name字段第一个字为“同”的整行记录
SELECT * FROM new_student WHERE name LIKE '同%';
#查询表中name字段以“表”结尾的整行记录
SELECT * FROM new_student WHERE name LIKE '%表';
#查询表中name字段第三个字为“d”,后面是任意字符的整行记录(通常_要搭配%一起使用)
SELECT * FROM new_student WHERE name LIKE '__d%';
#SELECT DISTINCT 列名称 FROM 表名称;
SELECT DISTINCT age FROM new_student;
#以升序排序查询
SELECT * FROM new_student ORDER BY age;
#以降序排序查询
SELECT * FROM new_student ORDER BY age DESC;
1.count:计算个数(字段名称,则统计不为null的个数;数字,则统计包含null的个数)
2.max:计算最大值
3.min:计算最小值
4.sum:计算和
5.avg:计算平均数
效率排行 | count的方式 | 原因 |
1 | count(*) | 对key_len最短的二级索引进行遍历,如果没有,那么就根据聚簇索引进行遍历(不读取聚簇索引的值) |
2 | count(1) | 对聚簇索引进行遍历(不读取聚簇索引的值) |
3 | count(索引字段) | 对聚簇索引进行遍历(读取索引的值) |
4 | count(非索引字段) | 全表扫描(比如普通字段name) |
#表中id值进行求和
SELECT SUM(id) as 'id总和' FROM new_student;
#取表中id最小的id值
SELECT MIN(id) FROM new_student;
1、执行运算符:加减乘除
SELECT age+6 FROM new_student; #返回age+6的值
2、比较运算符:大于、等于、小于、不等于,返回1表示true,返回0表示false
SELECT age>23 FROM new_student;
3、逻辑运算符:与 或 非,返回1表示true,返回0表示false
SELECT age>23 && id<10 FROM new_student;
#按照性别分组,分别查询男女同学的最小年龄
SELECT sex , MIN(age) FROM new_student GROUP BY sex;
#按照性别分组,分别查询男女同学平均年龄和男女同学人数
SELECT sex , AVG(age), COUNT(id) FROM new_student GROUP BY sex;
1. HAVING 子句必须紧随 GROUP BY 子句,并出现在 ORDER BY 子句(如果有的话)之前,语法如下:
SELECT column1,column2
FROM table1,table2
WHERE [conditions]
GROUP BY column1,column2
HAVING [conditions]
ORDER BY column1,column2
2. HAVING与WHERE的区别:
#查表中的前4条记录
SELECT * FROM new_student LIMIT 4;
#查询表中第2~4条记录(即第二行开始查,总共查3条)
SELECT * FROM new_student LIMIT 1,3;
#表中的一个字段,该字段的值是每行数据的唯一标识,每张表都要有一个主键,也只能有一个主键,一般定义为int类型,因为int类型存储空间小,同时可以设置为自增,避免冲突,主键值必须唯一
CREATE TABLE class(
id INT PRIMARY KEY aut_increment,
name VARCHAR(100)
);
--删除主键ALTER TABLE 表名 DROP PRIMARY KEY;
#表中的某个字段为外键,与另一张表的主键进行关联,从而将两张表的数据建立级联关系,外键的取值必须是主键主键中已经存储的值,如果是主键中没有的值,则外键无法存储
CREATE TABLE student(
id INT PRIMARY KEY auto_increment,
name VARCHAR(50),
cid INT,
#外键的取值范围必须是主键中存储的值
FOREIGN KEY(cid) REFERENCES class(id)
);
--删除外键(解除外键约束)
alter table 数据表 drop foreign key 外键名称; #外键名称不是表的列名称
#主表
CREATE TABLE class(
id INT PRIMARY KEY auto_increment,
name VARCHAR(100)
);
#从表
CREATE TABLE student(
id INT PRIMARY KEY auto_increment,
name VARCHAR(50),
cid INT,
FOREIGN KEY(cid) REFERENCES class(id)
);
#两张主表
CREATE TABLE user(
id INT PRIMARY KEY auto_increment,
name VARCHAR(20)
);
CREATE TABLE course(
id INT PRIMARY KEY auto_increment,
name VARCHAR(20)
);
#一张从表
CREATE TABLE user_course(
id INT PRIMARY KEY auto_increment,
uid INT,
cid INT,
FOREIGN KEY(uid) REFERENCES user(id),
FOREIGN KEY(cid) REFERENCES course(id)
);
#把两张表用inner join连接起来,然后追加条件
SELECT * FROM student INNER JOIN class WHERE student.`name` = '张三' AND student.cid = class.id;
-- SELECT * FROM student;
-- SELECT * FROM class;
SELECT * FROM student INNER JOIN class; #这样查询取的是上面两条笛卡尔积
#更多用内连接做通用查询,显示内连接和隐式内连接区别是inner join可以用逗号表示
--语法1 (隐式内连接)
select 字段1,字段2...
from 表1,表2...
where 过滤条件;
--语法2 (显式内连接)
select 字段1,字段2...
from 表1 inner join 表2 ...
where 过滤条件;
#student的别名s class的别名c 使用LEFT JOIN...ON...将两张表进行级联
SELECT * FROM student s LEFT JOIN class c ON s.cid = c.id;
#左连接:左表所有数据和右表满足条件的数据
SELECT * FROM student s LEFT JOIN class c ON s.cid = c.id AND s.id = 1;
SELECT * FROM student s RIGHT JOIN class c ON s.cid = c.id AND s.id = 1;
#写连接查询,先把表的关系关联起来,再去加业务逻辑
SELECT * FROM user u, course c, user_course uc WHERE u.id = uc.uid and c.id = uc.cid and u.id = 1; #多对多关系级联查询
举例:使用数据表关系的一对多
#查询张三信息,包括个人信息和所在班级信息
SELECT cid FROM student WHERE name = '张三'; #得到外键值
SELECT * FROM class WHERE id = (SELECT cid FROM student WHERE name = '张三'); #外键值作为参数传入查询语句
#通过从表查询的外键值作为入参来查询主表得到个人信息和班级信息,因为外键的取值必须是主键主键中已经存储的值
#第一条sql的结果作为第二条sql的条件做一个查询
索引类似书的目录,目的是提高查询效率
1、出现在where语句中的列,而不是select后面的列
2、索引的值尽量唯一
3、不要添加过多的索引
alter table 数据表 add index 索引名(需要添加索引的数据表列名称);
或者
create index 索引名 数据表 (需要添加索引的数据表列名称);
alter table 数据表 drop index 索引名; #没有外键约束才能删索引
或者
drop index 索引名 on 数据表;
create user '用户名'@'主机名' identified by '密码';
drop user '用户名'@'主机名';
show grants for '用户名'@'主机名';
--语法
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
--授予faker用户所有权限,在任意数据库任意表上
grant all on *.* to 'faker'@'localhost';
--语法
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
--授予faker用户所有权限,在任意数据库任意表上
grant all on *.* to 'faker'@'localhost';
参考文章:http://c.biancheng.net/view/2574.html