1数据库

83 阅读5分钟
使用-- 添加单行注释时,--后面一定要加空格,而#没有要求。
查询所有的数据库SHOW DATABASES;
**创建数据库 CREATE DATABASE IF NOT EXISTS 数据库名称;
删除数据库DROP DATABASE IF EXISTS 数据库名称;
**使用数据库 USE 数据库名称;
**查看当前使用的数据库 SELECT DATABASE();
查询表SHOW TABLES;
查询表结构DESC 表名称;
创建表
CREATE TABLE 表名 (
	字段名1  数据类型1,id int,
	字段名2  数据类型2, username varchar(20), 
	字段名n  数据类型npassword varchar(32)
);注意:最后一行末尾,不能加逗号
tinyint : 小整数型,占一个字节
学生状态(用数字表示,正常、休学、毕业...)  status tinyint
SMALLINT
MEDIUMINT
BIGINT
FLOAT
DOUBLE
DECIMAL 
INTINTEGER: 大整数类型,占四个字节  
double浮点类型  字段名 double(总长度,小数点后保留的位数)
	eg : score double(5,2)  
date  只包含年月日   
datetime 包含年月日时分秒
TIME
YEAR
TIMESTAMP

字符串
varchar 缺点:存储性能底
char
TINYBLOB
TINYTEXT
BLOB
TEXT
MEDIUMBLOB
MEDIUMTEXT
LONGBLOB
LONGTEXT

删除修改添加表

删除表DROP TABLE IF EXISTS 表名;
修改表名
ALTER TABLE 表名 RENAME TO 新的表名; 
-- 将表名student修改为stu
alter table student rename to stu;
添加一列
ALTER TABLE 表名 ADD 列名 数据类型; 
-- 给stu表添加一列address,该字段类型是varchar(50)
alter table stu add address varchar(50);
修改数据类型
ALTER TABLE 表名 MODIFY 列名 新数据类型;
-- 将stu表中的address字段的类型改为 char(50)
alter table stu modify address char(50);
-   **修改列名和数据类型**
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;
-- 将stu表中的address字段名改为 addr,类型改为varchar(50)
alter table stu change address addr varchar(50);
删除表ALTER TABLE 表名 DROP 列名;
-- 将stu表中的addr字段 删除
alter table stu drop addr;

对数据进行增(insert)删(delete)改update

添加数据

- 给指定列添加数据
INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…);
给全部列添加数据
INSERT INTO 表名 VALUES(值1,值2,…);
-批量添加数据
INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
INSERT INTO 表名 VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
检查select * from stu; 

修改表数据

注意注意修改语句中如果不加where条件,则将所有数据都修改!
UPDATE 表名 SET 列名1=值1,列名2=值2,… [WHERE 条件] ;

删除数据

DELETE FROM 表名 [WHERE 条件] ;
## 分页 查询
SELECT 
    字段列表
FROM 
    表名列表 
WHERE 
    条件列表
GROUP BY
    分组字段
HAVING
    分组后条件
ORDER BY
    排序字段
LIMIT
     起始索引 , 查询条目数;
     起始索引 = (当前页码 - 1) * 每页显示的条数
     每页显示3条数据,查询第3页数据
     select * from stu limit 6 , 3;
上述语句中的起始索引是从0开始     
所有列* 表示 select * 表示from stu;
查询出来的有重复的数据 DISTINCT 字段列表  distinct address
查询去除重复记录SELECT DISTINCT 字段列表 FROM 表名;
 起别名AS : AS  math as 数学成绩 =math  数学成绩 as可省
条件查询
SELECT 字段列表 FROM 表名 WHERE 条件列表;

image.png

&& 和 and 都表示并且的意思。建议使用 and 。

BETWEEN 20 and 30;
BETWEEN '1998-09-01' and '1999-09-01';
!=<> 都是不等于
查询年龄等于18岁 或者 年龄等于20岁 或者 年龄等于22岁的学员信息
select * from stu where age = 18 or age = 20 or age = 22;
select * from stu where age in (18,20 ,22);
查询英语成绩为 null的学员信息
select * from stu where english = null; -- 这个语句是不行的
select * from stu where english is null;
select * from stu where english is not null;
#模糊查询
模糊查询使用like关键字,可以使用通配符进行占位:
(1)_ : 代表单个任意字符(2)% : 代表任意个数字符
查询姓'马'的学员信息
select * from stu where name like '马%';
查询第二个字是'花'的学员信息
select * from stu where name like '_花%';
查询名字中包含 '德' 的学员信息
select * from stu where name like '%德%';
##排序查询
注意:如果有多个排序条件,当前边的条件值一样时,才会根据第二条件进行排序
SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1 [排序方式1],排序字段名2 [排序方式2] …;  -   ASC : 升序排列 **(默认值)**  -   DESC : 降序排列
select * from stu order by math desc , english asc ;

聚合函数--总体计算

SELECT 聚合函数名(列名) FROM 表;
注意:null 值不参与所有聚合函数运算
count(列名)max(列名)min(列名)sum(列名)avg(列名)
如果该字段某一行的值为null的话,将不会被统计,所以可以在count(*) 来实现
select count(*) from stu;

分组查询

SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤];
注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
1查询男同学和女同学各自的数学平均分
select sex, avg(math) from stu group
select name, sex, avg(math) from stu group by sex;  -- 这里查询name字段就没有任何意义
2查询男同学和女同学各自的数学平均分,以及各自人数
select sex, avg(math),count(*) from stu group by sex;
查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组,分组之后人数大于2个;
select sex, avg(math),count(*) from stu where math > 70 group by sex *having count(* ) > 2;
**where 和 having 区别:** 
-   执行时机不一样:where 是分组之前进行限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤。
-   可判断的条件不一样:where 不能对聚合函数进行判断,having 可以。