#SQL基础
ddl学习
1. 操作数据库
-
C (Create):创建
-
创建数据库
create databases 数据库名;
-
创建数据库前先判断是否存在
create database if not exists 数据库名;
-
创建数据库,判断是否存在,并指定字符集
create database if not exists 数据库名 character set 字符集
-
练习:创建数据库db1 ,判断是否存在,并指定字符集为utf8
create database if not exists db1 character set utf8;
-
-
R (Retrieve):查询
-
查询所有数据库的名称
show databases;
-
查询某个数据库的字符集–其实是查询数据库的创建sql语句
show create database db1(数据库名);
-
-
U(Update):修改
-
修改数据库的字符集
alter database db1(数据库名) character set utf8(字符集);
-
-
D(Delete):删除
-
删除数据库
drop database db1(数据库名);
-
删除数据库前先判断是否存在
drop database if exists db1(数据库名);
-
-
使用数据库
-
查询当前正在使用的数据库名称
select database();
-
注意 和 show databases;的细微区别
1. 语义不同,分别是:查看所有数据库名称,查看当前正在使用的数据库名称 2. 写法不同,database() 和 databases
-
使用数据库
use db1(数据库名);
-
2. ddl操作表
-
查询
-
查询某个数据库中所有的表名称
show tables;
-
查询表结构
desc 表名;
-
查询表的创建语句
show create table 表名;
-
-
创建
创建表
create table 表名( 列名1 数据类型1, 列名2 数据类型2, ...... 列名n 数据类型n ); 注意:最后一列,不需要加逗号
画图,理解什么是表
数据类型 1. int 整数类型 age int 2. double 小数类型 score double(5,2) 总长度5,小数点后的位数2,最大值999.99 3. date 日期,只包含年月日,yyyy-MM-dd 4. datetime 日期,包含年月日和时分秒 yyyy-MM-dd HH:mm:ss 5. timestamp 时间戳,包含年月日和时分秒 yyyy-MM-dd HH:mm:ss 如果该类型字段没有赋值,或赋值为null,则默认使用当前系统时间填充 6. varchar 字符串(长度可变) 7. char字符串(长度固定) name varchar(20) 表示姓名最长20个字符的限制 注意: 1.字符串varchar和小数double都要指定长度 2.varchar和日期类型的数据要加上引号(推荐使用单引号)
练习:创建一个学员表
create table student( id int, name varchar(10), age int, score double(4,1), birth date, insert_time timestamp );
案例: 1.创建一个员工表employee,需要如下字段: 员工编号,姓名,性别,年龄,工龄,生日,工资 create table employee( id int, -- 员工编号 name varchar(20),-- 姓名 gender char(1),-- 性别 age int,-- 年龄 work_years int,-- 工龄 birth date,-- 生日 salary double(8,2) -- 工资 );
复制表
create table 表名 like 被复制的表名;
-
删除表
1. drop table 表名 2. drop table if exists 表名
-
修改
1.修改表
-
修改表名
alter table 表名 rename to 新表名
-
修改表的字符集
-- 查看表的字符集,其实是查看表的创建语句 show create table 表名; -- 修改表的字符集 alter table 表名 character set 字符集;
-
2.修改列
-
添加一列
alter table 表名 add 列名 数据类型;
-
修改列类型
alter table 表名 modify 列名 数据类型;
-
修改列名和类型
alter table 表名 change 旧列名 新列名 数据类型;
-
删除列
alter table 表名 drop 列名;
综合练习:
1.查看当前的服务器一共有多少个数据库 show databases;
2.查看当前正在使用的数据库 select database();
3.选定其中的一个数据库,进行使用 use db3;
4.查看当前库中有多少个表 show tables;
5.创建一个表
create table employee(
id int, -- 员工编号
name varchar(20),-- 姓名
gender char(1),-- 性别
age int,-- 年龄
work_years int,-- 工龄
birth date,-- 生日
salary double(8,2) -- 工资
);
6.修改表:
1.修改员工表employee名为emp
2.修改表的字符集为gbk,查看表的字符集
3.修改表的字符集为utf8,并查看表的字符集
4.添加'部门'列
5.修改'性别'列类型为varchar(6)
6.修改gender为sex,类型为varchar(6)
7.删除'部门'列
- 图形化界面工具 SQLyog
- 演示安装和连接,写sql语句并执行
- 调节字体大小
dml学习
- 添加数据
-
添加全部字段
insert into 表名 (列名1,列名2,...列名n) values (值1,值2,...值n);
注意: 1.值要和列名要一一一对应,有几个列就要有几个值 2.添加全部字段数据时,列名部分可以省略,即: insert into 表名 values (值1,值2,...值n);
-
添加部分字段
insert into 表名 (列名1,列名2,列名3,...) values (值1,值2,值3,...);
注意: 1.值必须和列名对应 2.列名可以不是连续的 3.列名可以不按照表结构中的顺序,但通常建议按照先后顺序 4.添加部分字段时,列名不能省略 5.没有添加数据的字段默认使用null填充
-
批量添加数据
随堂测试: 1.向员工表中新增3名员工信息: 2 张三 25岁,男 3 李四 26岁,男 4 王五 27岁,女
-- 分析:属于添加部分字段 insert into emp (id,name,age,sex) values (2,'张三',3,'男'),(3,'李四',26,'男'),(4,'王五',27,'女') -- 批量新增语法 insert into 表名 (字段1,字段2,...) values (值1,值2,...),(值1,值2,...),(值1,值2,...)
-
注意:
添加数据值时,除了数字类型,其它类型需要使用引号(单双引号都可以),建议使用单引号。
- 删除数据
-
删除满足条件的数据
delete from 表名 [where 条件];
注意: 1.如果不加条件,则删除表中所有的数据 eg: delete from emp1; delete from emp1 where true; delete from emp1 where 1=1;
-
删除表中的所有数据
truncate table 表名;
两种删除所有数据的方法: 1.truncate方式,先删除整个表,再创建一张同样结构的表,执行效率高,推荐使用。 2.delete from 表名 ,不带条件,有多少条记录就会执行多少次删除操作,效率不高,不推荐。
- 修改数据
-
语法
update 表名 set 列名1=值1, 列名2=值2, ... [where 条件];
注意: 1.如果不带条件,则会修改所有的数据
随堂测试: 1.曹操的年龄加1岁,工资涨500 UPDATE emp SET age=age+1,salary =salary+500 WHERE name='曹操'; 2.修改所有员工的部门三国 update emp set dept='三国';
dql学习
-
完整的查询语法
select 字段列表 from 表名列表 where 条件列表 group by 分组字段 having 分组之后的条件 order by 排序 limit 分页限定
1. 基础查询
-
多个字段查询
select 字段名1,字段名2... from 表名;
注意: 如果查询所有字段,则可以使用*来替代字段列表。
-
去除重复
关键字 distinct 直接放在select后面
-
四则运算
一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算) ifnull(表达式1,表达式2):null参与的运算,计算结果都为null 表达式1:哪个字段需要判断是否为null 如果该字段为null后的替换值。
案例:计算学员的英语和数学成绩和
select math,english,ifnull(math,0)+ifnull(english,0) from stu;
-
起别名
字段名 后写关键字 as 或省略as 直接用空格
2. 条件查询
- where和 运算符 构成查询条件
> 、< 、<= 、>= 、= 、<>
BETWEEN...AND
IN( 集合)
LIKE:模糊查询
占位符:
_:单个任意字符
%:多个任意字符
IS NULL
and 或 &&
or 或 ||
not 或 !
- 案例
-- 创建表
CREATE TABLE student (
id INT, -- 编号
NAME VARCHAR(20), -- 姓名
age INT, -- 年龄
sex VARCHAR(5), -- 性别
address VARCHAR(100), -- 地址
math INT, -- 数学
english INT -- 英语
);
-- 填充数据
INSERT INTO student(id,NAME,age,sex,address,math,english) VALUES
(1,'马云',55,'男','杭州',66,78),
(2,'马化腾',45,'女','深圳',98,87),
(3,'马景涛',55,'男','香港',56,77),
(4,'柳岩',20,'女','湖南',76,65),
(5,'柳青',20,'男','湖南',86,NULL),
(6,'刘德华',57,'男','香港',99,99),
(7,'马德',22,'女','香港',99,99),
(8,'德玛西亚',18,'男','南京',56,65);
-- 查询年龄大于20岁
SELECT * FROM student WHERE age > 20;
SELECT * FROM student WHERE age >= 20;
-- 查询年龄等于20岁
SELECT * FROM student WHERE age = 20;
-- 查询年龄不等于20岁
SELECT * FROM student WHERE age != 20;
SELECT * FROM student WHERE age <> 20;
-- 查询年龄大于等于20 小于等于30
SELECT * FROM student WHERE age >= 20 && age <=30;
SELECT * FROM student WHERE age >= 20 AND age <=30;
SELECT * FROM student WHERE age BETWEEN 20 AND 30;
-- 查询年龄22岁,18岁,25岁的信息
SELECT * FROM student WHERE age = 22 OR age = 18 OR age = 25
SELECT * FROM student WHERE age IN (22,18,25);
-- 查询英语成绩为null
SELECT * FROM student WHERE english = NULL; -- 不对的。null值不能使用 = (!=)
SELECT * FROM student WHERE english IS NULL;
-- 查询英语成绩不为null
SELECT * FROM student WHERE english IS NOT NULL;
SELECT * FROM student WHERE NOT english IS NULL;
3. 模糊查询
-
使用关键字 like
通配符: _ 匹配一个字符 % 匹配0-n个字符