show databases;查看所有数据库
三种注释
注释一:–+空格 单行注释
注释二:# 单行注释
注释三:/*
… 多行注释
*/
安装过后自带的数据库如下:
information_schema mysql元数据,基础数据
mysql mysql配置数据库,其中包含用户信息。(用户名和密码,权限管理)
performance_schema mysql数据库软件的运行数据,日志信息,性能数据
test 测试数据库。空的
创建数据库student ,默认编码是utf8
create database student default character set utf8;
删除student数据库:drop student ;
修改student数据库的编码为gbk:alter database student default character set gbk;
查看数据库默认字符集 show create database student;
修改表字段
改类型:
ALTER TABLE xiaobai MODIFY COLUMN age VARCHAR(10);
同时改名子和类型:
ALTER TABLE xiaobai CHANGE COLUMN age sage INT;
修改表名
alter table xiaobai rename to xiaohei;
查看表
SHOW TABLES;
查看表结构:
desc 表名
数据的增删改查
INSERT INTO xiaobai VALUES(3,'tom',1);
DELETE FROM xiaobai WHERE id=2;
UPDATE xiaobai SET sage = 1 WHERE id = 1;
SELECT * FROM xiaobai;
Delete from 和 truncate table的区别:
– delete from: 可以全表删除 1)可以带条件删除 2)只能删除表的数据,不能删除表的约束 3)使用delete from删除的数据可以回滚(事务)
– truncate table: 可以全表删除 1)不能带条件删除 2)即可以删除表的数据,也可以删除表的约束 3)使用truncate table删除的数据不能回滚
查询可以指定列,添加常量列,最好用as指定列名:
select id as "狗东西",'tom' as “小垃圾” from xiaobai;
其中的 as就是输出的列名,可以指定任何名字
查询时,可计算
SELECT NAME,(id+sage) AS "合体" FROM xiaobai ;
查询去重distinct
这个词作用是查询去除结果相同的数据
具体含有就是:**在结果集中每一行的数据不能完全相同**单列的信息相同是不影响结果的
举例:
输出不同age的信息
select distinct age from xiaobai
输出全部信息,因为id作为主键,肯定各不相同,所有每行数据完全不同。
select id ,age from xiaobai
输出age和那么组合不同的信息
select age ,name from xiaobai
条件判断,空查询
判空条件(null 空字符串): is null / is not null / ='' / <>''
-- null:表示没有值 & 空字符串:有值的!
-- 判断null
SELECT * FROM student WHERE address IS NULL ;
-- 判断空字符串
SELECT * FROM student WHERE address='';
SELECT * FROM student WHERE address IS NULL OR address=''; -- (包括null和空字符串)
-- 需求: 查询有地址的学生(不包括null和空字符串)
SELECT * FROM student WHERE address IS NOT NULL AND address<>'';
模糊查询
select * from xiaobai where name='_o%';
_代表一个字符,%代表人已字符
聚合查询
-- 常用的聚合函数: sum() avg() max() min() count()
-- 需求:查询学生的servlet的总成绩 (sum() :求和函数)
SELECT SUM(servlet) AS 'servlet的总成绩' FROM student;
-- 需求: 查询学生的servlet的平均分
SELECT AVG(servlet) AS 'servlet的平均分' FROM student;
-- 需求: 查询当前servlet最高分
SELECT MAX(servlet) AS '最高分' FROM student;
-- 需求: 查询最低分
SELECT MIN(servlet) AS '最低分' FROM student;
-- 需求: 统计当前有多少学生(count(字段))
SELECT COUNT(*) FROM student;
SELECT COUNT(id) FROM student;
-- 注意:count()函数统计的数量不包含null的数据
-- 使用count统计表的记录数,要使用不包含null值的字段
SELECT COUNT(age) FROM student;
下面介绍MySQL的分页查询
语法:
select * from xiaobai limit (当前页数-1)*每页显示条数,每页显示条数
举例:
分页显示第二条到第6条信息
select * from xiaobai limit 1,5
基本上是从前台获取当前页数,传进数据库,从controller层
第一页:0,5条0-4
第二页:5,5条5-9
第三页:10,5条10-14
第n页:(n-1)*条数,条数
查询排序
`
语法 :order by 字段1,字段2… asc/desc,默认就是升序,其中字段2。。。。在前一个字段有重复值的时候才会启用。
– asc: 顺序,正序。数值:递增,字母:自然顺序(a-z)
– desc: 倒序,反序。数值:递减,字母:自然反序(z-a)
举例:
SELECT * FROM xiaobai ORDER BY id DESC;
SELECT * FROM xiaobai ORDER BY id ASC;
`
分组查询
语法
select 字段1,count(*) from 表 group by 字段1
需求: 查询男女的人数
-- 预期结果:
-- 男 3
-- 女 2
-- 1) 把学生按照性别分组(GROUP BY gender)
-- 2) 统计每组的人数(COUNT(*))
SELECT gender,COUNT(*) FROM student GROUP BY gender;
分组查询后,筛选结果:
语法:
select 字段1,count(*) from 表 group by 字段1 having 判断条件;
需求: 查询总人数大于2的性别
-- 1) 查询男女的人数
-- 2)筛选出人数大于2的记录(having)
--- 注意: 分组之前条件使用where关键字,分组之前条件使用having关键字
SELECT gender,COUNT(*) FROM student GROUP BY gender HAVING COUNT(*)>2;
sql语句分类
DDL:数据定义语言
用于创建、修改、删除数据库内数据结构
如:create、drop、alter
DML:数据操作语言
用于修改数据库中数据
如:
insert,delete ,update,truncate
DQL:数据查询语言
select,show
DCL:数据控制语言
用于对数据库的访问
如:给用户授予访问权限(grant);取消用户访问权限(remoke)
下面讲一下建表的 时候怎么写默认值
如:name varchar(50) default ‘gouzi’
一目了然不多说了,强调一点就是,插入数据的是后,不写入数据就采用默认值,默认值没有设置就是null
也可以通过强制赋值为空的方法使其为null,如insert into 小白 values(1,null,null…)
not null 修饰的字段可赋值为空字符串 ''
unique 修饰的字段值是惟一的,可以为空,可以为多个null
这个时候强调一下主键是非空且唯一 的,这都是废话
下面介绍一个常用的关键词,自动增长
auto_increment
只要写在字段的属性后面就可以了
效果就是,赋值其他字段,这个字段的值在自动增长,有个毛病就是删除一行,那么这行的自动增长的那个字段所在地数字就永远消失了,除非用truncate删除表内容,那么在次向表中写入数据的时候,序号从头开始了。空口无凭,上图
下面来说一下外键相关的情况:
语法:
constraint 外键名 foreign key(本表的外键字段) references 外键表(外键表的主键)
这里说一下,外键名主要是 用来排错和删除外键的
注意:
1)被约束的表称为副表,约束别人的表称为主表,外键设置在副表上的!!!
2)主表的参考字段通用为主键!(唯一且非空,副表才能作为参考)
3)添加数据: 先添加主表,再添加副表
4)修改数据: 先修改副表,再修改主表
5)删除数据: 先删除副表,再删除主表
外键和主键的删除:
#查看所有的主键和外键
SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
#删除外键
alter table tableName drop foreign key foreignKeyName;、
删除主键:
alter table tableName drop primary key;
来个彩蛋:
级联操作(on update cascade 级联更新,on delete cascade 级联删除)
原理就是在创建外键的时候,在最后语句最后加上 on update cascade on delete cascade
那么怎么在已经存在的外键上添加这些约束呢,注意看我下一波操作:
这是我一开始写的外键,没名字,没约束:CONSTRAINT FOREIGN KEY(aid) REFERENCES a(id)
那么我下面要改造一下,给他来个户口,给点权限:
alter table b add constraint a_b_fk foreign key(aid) references a(id) on update cascade on delete cascade;
这样的话,我只有把主表的数据全部删除,那么附表的内容就不复存在了。皮之不存毛将焉附啊
接下来说一说主键的添加,删除,修改
CREATE TABLE c(
id INT PRIMARY KEY,
NAME VARCHAR(50),
age INT
);
先删除主键
ALTER TABLE c DROP PRIMARY KEY;
再添加主键
ALTER TABLE c ADD PRIMARY KEY(id,NAME);
还能在设置自动增长
ALTER TABLE c MODIFY COLUMN id INT AUTO_INCREMENT;