什么是SQL:结构化查询语句 -- Structured Query Language
SQL 作用
1.是一种所有关系型数据库的查询规范,不同的数据库都支持
2.通用的数据库操作语言,可以用在不同的数据库中
3.不同数据的SQL语句会有一些不同
file:///E:/%25E6%259C%2589%25E9%2581%2593%25E4%25BA%2591/weixinobU7VjoPQFSuozOU3NpWcJIkvNQI/dcc4e8a593dd455abd868b6fbd20557c/clipboard.png
SQL 分类:
DDL:数据定义语言 如:建库,建表
用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter 等
DML:数据操纵语言 如:对表中的记录操作增删改
用来对数据库中表的数据进行增删改。关键字:insert, delete, update 等
DQL:数据查询语言 如:对表中的查询操作
用来查询数据库中表的记录(数据)。关键字:select, where 等
DCL: 数据控制语言 如:对用户权限的设置
用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE 等
MySQL的语法 :
1) 每条语句以分号结尾,如果在 SQLyog 中不是必须加的。
2) SQL 中不区分大小写,关键字中认为大写和小写是一样的
3) 3 种注释:
注释的语法 说明
--空格 单行注释
/* */ 多行注释
# 这是 mysql 特有的注释方式
DDL操作数据库
创建数据库
创建数据库的几种方式
*创建数据库 : CREATE DATABASE 数据库名;
*判断数据库是否已经存在,不存在则创建数据库 :
CREATE DATABASE IF NOT EXISTS 数据库名;
*创建数据库并指定字符集 : CREATE DATABASE 数据库名 CHARACTER SET 字符集;
例:
-- 直接创建数据库db1
create database db1;
-- 判断是否存在,如果不存在则创建数据库db2
create database if not exists db2;
-- 创建数据库并指定字符集为gbk
create database db3 default character set gbk;
CREATE DATABASE IF NOT EXISTS db1 CHARACTER SET gbk;
查看数据库
-- 查看所有的数据库
show databases;
-- 查看某个数据库的定义信息
show create database db3;
show create database db1;
修改数据库
将 db3 数据库的字符集改成 utf8
alter database db3 character set utf8;
删除数据库
DROP DATABASE 数据库名;
删除 db2 数据库
drop database db2
使用数据库
查看正在使用的数据库
SELECT DATABASE(); 使用的一个 mysql 中的全局函数
使用/切换数据库
-- 查看正在使用的数据库
select database();
-- 改变要使用的数据库
use db4; --切换至db4 数据库中 界面不会显示
DDL操作表结构
创建表
CREATE TABLE 表名 (
字段名 1 字段类型 1,
字段名 2 字段类型 2
);
file:///E:/%25E6%259C%2589%25E9%2581%2593%25E4%25BA%2591/weixinobU7VjoPQFSuozOU3NpWcJIkvNQI/e6a7901b54ad470bb01dda3f0a01a2f0/clipboard.png
创建 student 表包含 id,name,birthday 字段
create table student (
id int, -- 整数
name varchar(20), -- 字符串
birthday date -- 生日 最后没有逗号
);
查看表
查看某个数据库中的所有表 :
SHOW TABLES;
查看 day21 数据库中的所有表 :
use day21;
show tables;
查看表结构 :
查看 student 表的结构 :
desc student;
file:///E:/%25E6%259C%2589%25E9%2581%2593%25E4%25BA%2591/weixinobU7VjoPQFSuozOU3NpWcJIkvNQI/d874704eac4449d686c88238d9e224ca/clipboard.png
DESC 表名;
查看创建表的SQL语句
file:///E:/%25E6%259C%2589%25E9%2581%2593%25E4%25BA%2591/weixinobU7VjoPQFSuozOU3NpWcJIkvNQI/453d9d10fbac4f37a081dde7c36744e6/clipboard.png
SHOW CREATE TABLE 表名;
查看 student 的创建表 SQL 语句 :
show create table student;
file:///E:/%25E6%259C%2589%25E9%2581%2593%25E4%25BA%2591/weixinobU7VjoPQFSuozOU3NpWcJIkvNQI/0e2546fafe5a44c2baa1d32fa46fe4d9/clipboard.png
快速创建一个表结构相同的表
CREATE TABLE 新表名 LIKE 旧表名;
例: 创建 s1 表,s1 表结构和 student 表结构相同 :
-- 创建一个s1的表与student结构相同
create table s1 like student;
desc s1;
删除表
直接删除表
DROP TABLE 表名;
-- 直接删除表s1表
drop table s1;
判断表是否存在,如果存在则删除表
DROP TABLE IF EXISTS 表名;
-- 判断表是否存在并删除s1表
drop table if exists s1;
判断删除与直接删除的区别 如果表不存在,不删除,存在则删除
修改表结构
添加表列(ADD)
ALTER TABLE 表名 ADD 列名 类型;
为学生表添加一个新的字段 remark,类型为 varchar(20)
alter table student add remark varchar(20);
修改列类型(MODIFY)
ALTER TABLE 表名 MODIFY 列名 新的类型;
将 student 表中的 remark 字段的改成 varchar(100)
alter table student modify remark varchar(100);
修改列名 (CHANGE)
ALTER TABLE 表名 CHANGE 旧列名 新列名 类型;
将 student 表中的 remark 字段名改成 intro,类型 varchar(30)
alter table student change remark intro varchar(30);
删除列 (DROP)
ALTER TABLE 表名 DROP 列名;
删除 student 表中的字段 intro
alter table student change remark intro varchar(30);
修改表名
RENAME TABLE 表名 TO 新表名;
将学生表 student 改名成 student2
rename table student to student2;
修改字符集character set
ALTER TABLE 表名 character set 字符集;
将 student2 表的编码修改成 gbk
alter table student2 character set gbk;
DML操作表中的数据
插入记录
INSERT [INTO] 表名 [字段名] VALUES (字段值)
INSERT INTO 表名:表示往哪张表中添加数据
(字段名 1, 字段名 2, …):要给哪些字段设置值
VALUES (值 1, 值 2, …):设置具体的值
插入全部字段
所有的字段名都写出来
INSERT INTO 表名 (字段名 1, 字段名 2, 字段名 3…) VALUES (值 1, 值 2, 值 3);
不写字段名
INSERT INTO 表名 VALUES (值 1, 值 2, 值 3…);
插入部分数据
INSERT INTO 表名 (字段名 1, 字段名 2, ...) VALUES (值 1, 值 2, ...);
更新表记录 (修改表内数据)
UPDATE 表名 SET 列名=值 [WHERE 条件表达式]
-- 不带条件修改数据,将所有的性别改成女
update student set sex = '女';
-- 带条件修改数据,将id号为2的学生性别改成男
update student set sex='男' where id=2;
-- 一次修改多个列,把id为3的学生,年龄改成26岁,address改成北京
update student set age=26, address='北京' where id=3;
UPDATE: 需要更新的表名
SET: 修改的列值
WHERE: 符合条件的记录才更新
你可以同时更新一个或多个字段。 你可以在 WHERE 子句中指定任何条件。
删除表记录
DELETE FROM 表名 [WHERE 条件表达式]
如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。 你可以在 WHERE 子句中指定任何条件
不带条件删除数据
DELETE FROM 表名;
-- 不带条件删除数据,删除表中的所有数据
delete from student;
带条件删除数据
DELETE FROM 表名 WHERE 字段名=值;
-- 带条件删除数据,删除id为1的记录
delete from student where id=1;
使用truncate删除表中所有记录
TRUNCATE TABLE 表名;
truncate和delete的区别: truncate 相当于删除表的结构,再创建一张表;delete在表内删除 会留有记录
DQL查询表中的数据
SELECT 列名 FROM 表名 [WHERE 条件表达式] order by 列名 asc 自动升序 / desc 降序
1) SELECT 命令可以读取一行或者多行记录。
2) 你可以使用星号(*)来代替其他字段,SELECT 语句会返回表的所有字段数据
3) 你可以使用 WHERE 语句来包含任何条件。
简单查询
SELECT * FROM 表名;
查询所有的学生:
select * from student;
查询指定列
SELECT 字段名 1, 字段名 2, 字段名 3, ... FROM 表名;
查询 student 表中的 name 和 age 列
select name,age from student;
指定列的别名进行查询 :使用别名的好处: 显示的时候使用新的名字,并不修改表的结构。
对列指定别名
SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名;
-- 使用别名
select name as 姓名,age as 年龄 from student;
对列和表同时指定别名
SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名 AS 表别名;
-- 表使用别名
select st.name as 姓名,age as 年龄 from student as st
清除重复值 (查询只显示指定不重复的列)
SELECT DISTINCT 字段名 FROM 表名;
查询学生来至于哪些地方
-- 查询学生来至于哪些地方
select address from student;
-- 去掉重复的记录
select distinct address from student;
查询结果参与运算 (参与运算的必须是数值类型 )
某列数据和固定值运算
SELECT 列名 1 + 固定值 FROM 表名;
某列数据和其他列数据参与运算
SELECT 列名 1 + 列名 2 FROM 表名;
例:
准备数据:添加数学,英语成绩列,给每条记录添加对应的数学和英语成绩,查询的时候将数学和英语的成绩相 加
select * from student;
-- 给所有的数学加 5 分 : select math+5 from student;
-- 查询 math + english 的和 : select * from student;
select *,(math+english) as 总成绩 from student;
-- as 可以省略 select *,(math+english) 总成绩 from student;
条件查询
SELECT 字段名 FROM 表名 WHERE 条件;
流程:取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回
运算符
> :大于 <:小于 >=:大于等于 <=:小于等于 <> :不等于
BETWEEN...AND :在一个范围之内,如:between 100 and 200 相当于条件在 100 到 200 之间,包头又包尾
BETWEEN 值 1 AND 值 2 (值1 是小值, 值2 是大值)
-- t1.`salary` BETWEEN t4.`hisalary` AND t4.`losalary` // 只显示表属性
-- t1.`salary` BETWEEN t4.`losalary` AND t4.`hisalary` // 显示全部数据
-- t1.`salary` >= t4.`losalary` AND t1.`salary` <= t4.`hisalary` //显示全部数据
--查询 english 成绩大于等于 75,且小于等于 90 的学生
select * from student3 where english between 75 and 90;
IN(集合) :集合表示多个值,使用逗号分隔
SELECT 字段名 FROM 表名 WHERE 字段 in (数据 1, 数据 2...);
-- 查询id是1或3或5的学生: select * from student3 where id in(1,3,5);
-- 查询id不是1或3或5的学生: select * from student3 where id not in(1,3,5);
LIKE '张%' :模糊查询 _表示单个任意字符 %表示多个任意字符
SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';
-- 查询姓马的学生
select * from student3 where name like "马%";
-- 查询姓名中包含'德'字的学生
select * from student3 where name like '%德%';
-- 查询姓马,且姓名有两个字的学生
select * from student3 where name like '马_';
IS NULL:查询某一列为 NULL 的值,注:不能写=NULL
逻辑运算符
and 或 && 与 : SQL 中建议使用前者,后者并不通用
or 或 || 或
not 或 ! 非
-- 查询 age 大于 35 且性别为男的学生(两个条件同时满足)
select * from student3 where age>35 and sex='男';
-- 查询 age 大于 35 或性别为男的学生(两个条件其中一个满足)
select * from student3 where age>35 or sex='男';
-- 查询 id 是 1 或 3 或 5 的学生
select * from student3 where id=1 or id=3 or id=5;
排序查询
SELECT 列名1,列名2,...,列名N FROM 表名 WHERE 条件 ORDER BY 列名1 [DESC/ASC] ORDER BY 列名2 [DESC/ASC];
a)升序排序(默认)
--按照耳机的价格升序排列
SELECT * FROM headset ORDER BY money;
SELECT * FROM headset ORDER BY money ASC;
b)降序排序
--按照耳机的价格降序排列
SELECT * FROM headset ORDER BY money DESC;
分组查询(配合聚合函数),注意分组每次只会显示该组得第一条数据
SELECT 列名1,列名2,...,列名N FROM 表名 GROUP BY 列名;
例:
SELECT name,SUM(money) AS 'price' FROM headset WHERE name LIKE '%海赛%' GROUP BY name ORDER BY price DESC;
--对筛选结果进行再次过滤时要使用HAVING(HACING是对分组后的数据进行筛选)
SELECT 列名1,列名2,...,列名N FROM 表名 GROUP BY 列名 HAVING 条件;
例:
SELECT name,SUM(money) AS 'price' FROM headset WHERE name LIKE '%海赛%' GROUP BY name HAVING price>2000 ORDER BY price DESC;
注意:
分组查询中WHERE和HAVING两个关键字的区别
"WHERE" 是一个约束声明,使用WHERE来约束来之数据库的数据,WHERE是在结果返回之前起作用的,且WHERE中不能使用聚合函数。
"HAVING"是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在HAVING中可以使用聚合函数。
聚合函数:将一列数据作为一个整体,进行纵向的计算。
1. count:计算个数
1. 一般选择非空的列:主键
2. count(*)
2. max:计算最大值
3. min:计算最小值
4. sum:计算和
5. avg:计算平均值
* 注意:聚合函数的计算,排除null值。
解决方案:
1. 选择不包含非空的列进行计算
2. IFNULL函数
select 字段列表 from 表名列表 where 条件列表 group by 分组字段 having 分组之后的条件 order by 排序 limit 分页限定
|