SQL的分类
DDL【Data Definition Language】,
数据定义语言,创建、修改、删除数据库和表结构
DML【Data Manipulation Language】,
数据操作语言,用于对表数据进行增删改的操作
DQL【Data Query Language】,
数据查询语言,用于负责表数据的查询工作
DCL【Data Control Language】:
数据控制语言,用来定义访问权限和安全级别
表常用数据类型
数据库操作
关于show的操作
show databases;
show tables;
#查看创建表的详细信息
show create table table_name;
1.DDL
使用关键字:CREATE ALTER DROP
1.1 create创建
1.1.1 数据库创建
CREATE DATABASE database_name charset=utf8;
1.1.2 表的创建
CREATE TABLE 表名 (
字段1 字段类型[列级别约束条件][默认值],
字段2 字段类型[列级别约束条件][默认值],
….
字段n 字段类型[列级别约束条件][默认值]
[表级别约束条件]
)
演示总结
#查询当前数据库服务器中的所有数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema | |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
#查看当前正在使用的数据库
mysql> select database();
+------------+
| database() |
+------------+
| NULL |
+------------+
1 row in set (0.00 sec)
#创建一个数据库
mysql> create database mydb1 charset=utf8;
Query OK, 1 row affected (0.00 sec)
#切换数据库
mysql> use mydb1;
Database changed
# 创建user表
create table user(
id int primary key auto_increment,
name varchar(20),
age int
);
1.2 alter操作
修改
关键字:rename、modify、change
#1.修改表名
ALTER TABLE old_table_name RENAME [TO] new_table_name
#2.修改字段的数据类型
语法规则:ALTER TABLE table_name MODIFY 字段名 数据类型
#修改完成之后可以查看DESC table_name检验结果
#3.修改字段名
ALTER TABLE table_name CHANGE 旧字段名 新字段名 数据类型
#4.修改字段的排列位置
ALTER TABLE table_name MODIFY 字段1 数据类型 FIRST|AFTER 字段2
first: 设置成第一个
after 字段2: 在指定字段2的后面
添加和删除
关键字 add、drop
#5.添加字段
ALTER TABLE table_name ADD 新字段名 数据类型 [约束条件] [FIRST|AFTER 已经存在的字段名]
#为字段增加索引
alter table money add index(username);
#添加外键约束
#6.删除字段
ALTER TABLE table_name DROP 字段名
#7.删除表的外键约束
ALTER TABLE table_name DROP FOREIGN KEY 外键约束名
#删除索引
ALTER TABLE table_name DROP INDEX index_name
#8.删除数据表
#删除没有被关联的表
语法规则:DROP TABLE [IF EXISTS] 表1,表2...
#删除被其他表关联的的表
#直接删除会出现错误的,操作: 先解除关联 再进行删除
1.3 drop操作
# 删除数据库
DROP DATABASE database_name
# 删除表
drop table table_name;
2.DML
2.1 insert
关键词:values
#单行插入
INSERT INTO table_name (field1, field2,...fieldN) VALUES(value1, value2,...valueN);
#多行插入[批量插入]
INSERT INTO table_name (field1, field2,...fieldN)
VALUES
(value1, value2,...valueN),
(value12, value22,...valueNN)...;
#如果给每个字段都赋值,就可以省略掉字段的书写
mysql> insert into worker values(3,'rose','g',6000);
#一次性插入多条数据【批量插入】
mysql> insert into worker(id,name,gender,salary) values(4,'bob','b',1500),(5,'hello','g',5500),(6,'abc','b',6600);
2.2 update
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
'''
注意:
a.完全可以更新一个字段或者多个字段
b.where相当于Python中的if语句
c.可以指定任何条件到where子句中
d.如果没有where子句,则默认所有的行都被同时更新为指定的操作[慎用!一般要结合where使用]
'''
2.3 delete
DELETE FROM table_name [WHERE Clause] DELETE FROM table_name [WHERE Clause]
'''
Truncate是一个能够快速清空资料表内所有资料的SQL语法。并且能针对具有自动
递增值的字段,做计数重置归零重新计算的作用。
'''
mysql> truncate table worker;
'''
注意:
delete:删除表中的指定数据,表结构还在,删除之后的数据可以找回,对自动增加的字段无影响
truncate:清空表中的数据,删除的数据是不能找回的,执行速度比delete快,自动增加的字段会重新计数
drop: 删除表,数据和表结构都删除
'''
3.DQL
SELECT 列名 FROM 表名【WHERE --> GROUP BY -->HAVING--> ORDER BY】
3.1 基础查询
#1.查询所有列
mysql> select * from student;
+------+----------+------+--------+
| id | name | age | gender |
+------+----------+------+--------+
| 1 | aaaa | 19 | female |
| 2 | bbbbbbbb | 20 | male |
| 3 | cc | 15 | male |
| 4 | ddd | 16 | female |
| 5 | eee | 20 | female |
+------+----------+------+--------+
5 rows in set (0.00 sec)
#2.查询指定列
mysql> select id,name,gender from student;
+------+----------+--------+
| id | name | gender |
+------+----------+--------+
| 1 | aaaa | female |
| 2 | bbbbbbbb | male |
| 3 | cc | male |
| 4 | ddd | female |
| 5 | eee | female |
+------+----------+--------+
5 rows in set (0.00 sec)
3.2 条件查询
关键字where
- 操作符 说明
- <>/!= 不等
- = 相等
- < 小于
- <= 小于等于
- in(A,B,…) 符合区间里面的任意一项
- between A and B 位于AB之间的
- and
- or
- is / is not 常用语判断null值
3.3 模糊查询
关键字:where、like
通配符:
_: 匹配一个任意字符
%:匹配0~n个任意字符【n大于等于1】
#1.查询姓名由4个字符组成的记录
mysql> select * from student where name like '____';
#2.查询姓名由3个字符组成的记录,并且最后一个字母为c的记录
mysql> select * from student where name like '__c';
#3.查询以a开头的记录
mysql> select * from student where name like 'a%';
#4.查询姓名中包含b的记录
mysql> select * from student where name like '%b%';
#5.查询姓名中第2个字母为c的记录
mysql> select * from student where name like '_c%';
3.4 字段控制查询
关键字:as、distinct
#1.去除重复记录
mysql> select distinct id from student;
#2.给列名起别名
mysql> select name as 姓名,gender as 性别 from student;
3.5 排序
关键字:order by(asc默认、desc)
#2.查询所有学生记录,按照年龄降序排序,如果年龄相等,则按照编号进行升序排序
mysql> select * from student order by age desc,id asc;
用法:select from 表 order by xxx
#####3.6 分组查询
聚合函数
- count():统计指定列不为null的记录行数
- sum():计算指定列的数值和
- 求指定列中的最大值和最小值max():min():
- avg()
关键字:group by、having
#1.查询各个部门的人数
mysql> select count(*) from emp group by deptno;
#2.查询每个部门的部门编号和每个部门的工资和
mysql> select deptno,sum(sal) from emp group by deptno;
#3.查询每个部门的部门编号和每个部门的人数
mysql> select deptno,count(*) from emp group by deptno;
#4.查询每个部门的部门编号和每个部门工资大于1500的人数
mysql> select deptno,count(*) from emp where sal>1500 group by
#5.查询工资总和大于7000的部门编号以及工资和
mysql> select deptno,sum(sal) from emp group by deptno having sum(sal)>7000;
'''
总结:
having和where的区别
a.二者都表示对数据执行条件
b.having是在分组之后对数据进行过滤
where是在分组之前对数据进行过滤
c.having后面可以使用聚合函数
where后面不可以使用聚合函数
'''
3.7 分页查询
关键字:limit
#1.查询4行记录,起始行从0开始
mysql> select * from emp limit 0,4;