初步使用数据库
-
重启数据库
service mysqld restart
-
、进入数据库,输入密码
service mysqld restart
-
显示所有数据库
show databases
-
创建数据库
create database 数据库名
-
使用数据库
use 数据库名
-
查看数据库所有的表
show tables
-
删除数据库
drop database 数据库名
-
显示表结构,查看数据库引擎
desc 表名
show create table 表名
-
查看当前使用的表属于那个数据库
select dataabse ()
-
删除表
drop table 表名
创建表
sql语句
create table 表名(
field datatype DEFAULT 默认值 COMMENT 注释,
字段名 类型,
primary key(字段名)
)
创建表时有三类信息必须明确写出:表名、字段名、字段类型 其他信息可以不明确写出,不写出时,使用默认设置
常见的数据类型
- 字符串类型(varchar)
- 定长字符串:长度是在创建表时指定的。 比如邮政编码,是6位的字符。 如果向一个6位的定长字符串类型的字段,只插入2位字符, 则数据库默认会在2个字符末尾补4个空格,以补足6位。
- 不定长字符串创建表时指定一个最大长度
- 数值类型
- 整数
- 小数
- 日期类型
- 二进制类型
默认值(DEFAULT )
- 表中所有的字段都可以设置默认值
- 默认值的数据类型必须与字段保持一致
- 除主键字段外,建议其他所有字段都设置默认值
- 提高使用性能;如果一个字段不赋值,那么这个字段就会被赋NULL值, 会影响使用性能
主键(primary key)
- 一个表只能有一个主键;
- 一个表中的所有行,主键字段的值不允许重复;主键的作用是保证数据的唯 一性和完整性;
- 主键字段可以为多个,甚至是表中所有字段一起做主键;多个字段一起做主 键时,我们称为联合主键或重复主键;不过一般来说不会超过5个,否则会影 响操作性能;
- 允许为NULL的字段不能做主键字段;主键不应包含动态变化的数据
- 永远也不要更新主键的值
NULL
- 表示一种“不知道”、“不确定”的状态
- 每个字段,要么是NOT NULL,要么是可为NULL。创建表时,可以不指定, 默认情况下是可为NULL,也就是可以不包含值,尽量避免将字段设置为可为NULL。
- 如何判断某个字段的值是否为NULL?
示例
create table teacher(teacher_id varchar(20) not null,
teacher_name varchar(50) not null default “”,
gender varchar(10) null,
primary key(teacher_id)
)comment ‘老师’;
操纵表
-
更新表名:使用rename table关键字。
rename table 旧表名 to 新表名;
-
更新字段名
alter table 表名 change 旧字段名 新字段名 字段类型
-
更新字段类型
alter table表名 modify 字段名 新字段类型;
-
删除字段默认值
alter table 表名 alter column 字段名 drop default;
-
设置主键,可以设置多个字段为联合主键
alter table 表名 add primary key (主键字段列表);
-
删除主键
alter table 表名 drop primary key
-
新增字段
alter table 表名 add column 新字段名 字段类型及其他属性
-
删除字段
alter table 表名 drop column字段名;
-
清空表内容(表名和字段还在,等于先drop,再create表名)
truncate table 表名
-
复制表结构
create table 表2 like 表1
插入数据
-
插入整行字段:关键字INSERT INTO
insert into表名 values (行数据,值的顺序与表中的字段顺序必须一致)
insert into表名(字段列表) values (对应字段列表的数据)//没有给出的字段要可以为null
-
借助其他表数据插入
insert into 表2 selelct * from 表1
-
克隆表(结构和数据都复制)
selelct * into 表2 FROM 表1
create table 表2 selelct * from 表1
查询数据
-
查询指定(所有)列
select 字段列表 from 表名
select * from 表名
-
将查询结果排序
select 字段列表 from 表名 order by 字段1 ASC/DESC,字段2 ASC/DESC,…
-
限制返回结果
-
返回回前几行
select top 10 字段列表 from 表名;
select 字段列表 from 表名 limit 10;
-
返回中间几行(从第N行开始,返回M行记录,这里的第N行,是从0开始算起的))
select 字段列表 from 表名 limit M offset N
select 字段列表 from 表名 limit N,M
-
-
对字段数据去重
select distinct 字段 from表名
过滤数据
-
select 字段列表 from 表名 where 过滤条件;
过滤条件一般由要过滤的字段、操作符、限定值三部分组成
-
操作符
-
使用通配符过滤数据:关键字like
示例
select * from student where student_name like “梁**%**”
select * from student where student_name like “彭**_**晏”
select * from student where student_name like “胡**[歌军]**”
-
组合WHERE子句
示例
所有姓梁的男同学
select * from student where student_name like “梁%” and gender = ‘男’
所有姓梁的同学或男同学
select * from student where student_name like “梁%” or gender = ‘男’
创建新的输出字段
-
字段拼接:关键字concat
-
CASE WHEN逻辑转换
case when 条件表达式1 then 结果表达式1
when 条件表达式2 then 结果表达式2
…
条件表达式N then 结果表达N
else else结果表达式
end
from 表名
- 没有else部分时,如果所有条件表达式都不满足,则返回NULL。 每一个case when都应该有else分支!!
函数
-
数值函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fFBMmdVp-1638715482054)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20211106225515004.png)]
-
文本函数
-
日期和时间函数
汇总统计及group by
-
聚集函数
- 计数count(字段),不会忽略值为NULL的行
- 和sum,忽略值为NULL的行
- 最大值max,忽略值为NULL的行
- 最小值min,忽略值为NULL的行
- 平均值avg,忽略值为NULL的行
-
分组group by
group by将NULL值的行,分到同一组计算统计值
-
过滤分组结果:having
select 字段 from 表名 group by 分组字段 having 分组要达到的条件表达式;
-
where和having的区别
- where过滤行,再group by前执行
- having过率分组,再group by后执行
-
排序分组结果(集合的无序性):关键字order by
select 字段 from 表名 group by 分组字段 order by 字段(按哪个字段来排序) AES/DESC(排序方法);
-
select子句顺序
select
字段
from 表名
where 行过滤条件
group by 分组字段
having 分组要达到的条件表达式
order by 字段(按哪个字段来排序)AES/DESC(排序方法)
方便的子查询及EXISTS
示例
获取姓牛的老师教了哪些学生?
SELECT student_id,student_name FROM student
WHERE teacher_id IN ( SELECT teacher_id FROM teacher WHERE teacher_name like ‘牛%’);
SELECT student_id,student_name FROM student a
WHERE EXISTS ( SELECT 1 FROM teacher b WHERE a.teacher_id = b.teacher_id AND b.teacher_name like ‘牛%’ )
组合查询
union:合并结果集后去除重复记录
union all:合并结果集后不去除重复记录
- 待合并的结果集的字段数量必须一致
- union all 与union的执行优先级一致,谁在前谁先执行;
- 不可以使用括号改变执行优先级
连表查询
关键字:on 连接条件
-
交叉连接cross join ,实现笛卡儿积
-
内连接inner join(inner 可以省略)
不加条件时相当于一个笛卡儿积
-
全外连接full out join,MySQL不支持
-
左外连接(只想要左表字段不为NULL的数据, 而不需左表字段为NULL的数据)
-
右外连接(只想要右表字段不为NULL的数据, 而不需右表字段为NULL的数据)
-
连表的执行步骤
select * from student S
left outer join teacher T
on S.teacher_id = T.teacher_id
where S.S.teacher_id = ‘S0001’;
- 参与连接的两个表做笛卡尔积;
- 根据ON后的连接条件筛选笛卡尔积的结果;
- 补充左表(LEFT JOIN)或右表(RIGHT JOIN)不满足连接条件的 数据(INNER JOIN内关联时无此步骤)
- 根据WHERE后的过滤条件筛选第三步的结果
-
外连接时,on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。而where条件是在临时表生成好后,再对临时表进行过滤的条件
-
多表连接,就是第一张表与后面的表依次连接,重复执行表连接的步骤
select * from student S inner join teacher T on S.teacher_id = T.teacher_id
inner join class C on S.class_id = C.class_id
S表和T表做内连接的结果与C表做内连接
-
非唯一键连接
select S.student_id,S.student_name, T.teacher_id,T.teacher_name
from student S inner join teacher T on S.teacher_id = T.teacher_id
如果teacher表有重复的数据,将返回重复的数据
更新和删除数据
-
更新全部数据
update 表名 set 字段名=新值
-
更新部分数据,多字段
update 表名 set 字段名1=新值1,字段名2=新值 … where 限定条件;
-
根据其他表更新数据
update 表名 set 字段名=(子查询) where 限定条件;
-
删除全部数据
delete from 表名
-
删除部分数据
delete from 表名 where 限定条件;
-
根据其他表删除数据
delete from 表名 where 子查询
约束
-
主键约束:唯一标识表中每一行的一个或多个字段(列)
-
外键约束:约定某一列的值必须出现在另一个表的主键中,就是拿别的表的主键当自己的外键
-
唯一约束:约定某一列或某几列的值在表中不重复
-
检查约束 :约定某一列的值必须满足指定的条件
-
非空约束:约定某一列的值不可为NULL
WHNp-1638715482102)][外链图片转存中…(img-MKb1H33j-1638715482103)]
-
外键约束:约定某一列的值必须出现在另一个表的主键中,就是拿别的表的主键当自己的外键
[外链图片转存中…(img-odqstHs2-1638715482105)][外链图片转存中…(img-mufHlujK-1638715482106)]
-
唯一约束:约定某一列或某几列的值在表中不重复
[外链图片转存中…(img-4E0jnoy5-1638715482108)]
[外链图片转存中…(img-GT5Zi9cc-1638715482110)]
-
检查约束 :约定某一列的值必须满足指定的条件
[外链图片转存中…(img-pCsLOqZS-1638715482111)]
-
非空约束:约定某一列的值不可为NULL
[外链图片转存中…(img-Ud0kuKIH-1638715482113)]