select 查询列表 from 表名;
select 100; select 'jion'; -- 查询常量值
select 100*100; -- 查询表达式
select distinct name from table_name; -- 去重
select version(); -- 查看版本号
select database(); -- 查看当前数据库名
select user(); -- 查看当前用户
select connection_id(); -- 查看当前用户id-306
select found_rows(); -- 返回上次查询的检索行数
show variables LIKE '%char%'; -- 查看字符列表
show databases; -- 查看所有的数据库
show tables; -- 查看所有的表
desc 表名; -- 查看表结构
show table status; -- 查看所有的表信息(包括视图)
use db_name; -- 使用这个数据库
create database db_name; -- 创建一个数据库
drop database db_name; -- 删除一个数据库
/* 语法:select 查询列表
from 表名
where 筛选条件; */
select * from table_name where _value<>12000; -- 条件运算符:> < != <> >= <=
select * from table_name where _value>=10000 and _value<20000; -- 逻辑运算符:&& || ! and or not
# is null/is not null:可以判断NULL值,=或<>不能用于判断NULL值
# 安全等于:<=> 既可以判断NULL值,又可以判断普通值
# like:(1)一般和通配符搭配:_ 任意单个字符、% 任意多个字符,包含0个字符
select * from table_name where name like '%a%'; -- 包含字符a的name字段
select * from employees where name like '__e_a%'; -- 第三个为字符e,第五个为字符a
select * from table_name where name like '_\_%'; -- 转义字符
select * from table_name where name like '_$_%' escape '$'; -- 转义字符
select * from table_name where _value between 10000 and 20000; -- 包含边界值
select * from table_name where _value in('IT_PROT','AD_VP','AD_PRES'); -- 判断某字段的值是否属于IN列表中的某一项
/*语法:select 查询列表 from 表名 where【筛选列表】 order by 排序列表;
dese 降序
asc 升序(默认)
order by 子句中可以支持单个字段、多个字段、函数、表达式、别名,一般放在查询语句的最后面,但LIMIT子句除外 */
select * from table_name order by _value asc;
select * from table_name order by _value1 asc, _value2 desc; -- 按多个字段排序
/*语法:SELECT 分组函数,列(要求出现在group by的后面)
FROM 表
【where 筛选条件】
group by 分组的列表
【order by 子句】
查询列表必须特殊,要求是分组函数group by后出现的字段 */
select count(*), id from table_name group by id;
/* 语法:select 查询列表
from 表1 别名【连接类型】
join 表2 别名
on 连接条件
【where 筛选条件】
【group by 分组】
【having 分组后的筛选条件】
【order by 排序列表】
分类:
内连接:inner
外连接: 左外:left 【outer】、右外:right 【outer】、全外:full 【outer】
交叉连接:cross */
select * from m inner join n on m.id = n.id; -- 内联接
select * from m left join n on m.id = n.id; -- 左外联接
select * from m right join n on m.id = n.id; -- 右外联接
# MySQL不支持全外连接,但可以通过左外连接+ union+右外连接实现
select * from m full join n on m.id = n.id; -- 全外联接
# 类似全连接full join的联接用法
select id,name from m
union
select id,name from n;
select * from m cross join n; -- 交叉联接,笛卡尔乘积SQL99标准
select * from m, n; -- SQL92标准
/* 子查询
含义:出现在其他语句中的Select语句,称为子查询或内查询
外部的查询语句,称为外查询或主查询
分类:按子查询出现的位置:
Select后面:仅仅支持标量子查询、
From后面:支持表子查询、
Where后面或having后面:标量子查询、列子查询、行子查询、
exists后面(相关子查询):表子查询
按结果集的行列数不同:
标量子查询(结果集只有一行一列)
列子查询(结果集只有一行多列)
行子查询(结果集只有一行多列)
表子查询(结果集一般为多行多列) */
-- 1、标量子查询
select * from employees where salary>(select salary from employees where last_name='Abel');
-- 2、select后面
select n.*,(select count(*) from m where m.id=n.id)from n;
-- 3、from后面
select * from (select * from table_name1 group by _value1) as m inner join n on m.id=n.id;
# 4、exists后面(相关子查询)
/* 语法:exists(完整的查询语句)
结果:1或0 */
select * from m where exists(select * from n where m.id=n.id);
/* 分页查询
应用场景:当要显示的数据,一页显示不全,需要分页提交SQL请求
语法: select 查询列表
from 表
【join type join 表2
on 连接条件
where 筛选条件
group by 分组字段
having 分组后的筛选
order by排序的字段】
limit 【offset,】size;
offset:要显示条目的起始索引(0开始)
size:要显示的条目个数
特点:1、limit语句放在查询语句的最后
2、公式
要显示的页数page,每页的条目数size
select 查询列表
from 表
limit (page-1)*size,size; */
Select * From employees limit 0,5;
Select * From employees limit 5;
Select * From employees limit 10,15;
Select * From employees Where commission_pct IS NOT NULL Order By salary desc Limit 10 , 15;
/* union 联合 合并:将多条查询语句的结果合并成一个结果
语法:查询语句1
union
查询语句2
...
应用场景:要查询的结果来自多个表,且多个表没有直接连接关系,但查询的信息一致时
特点:1、要求多条查询语句的列数是一致的
2、要求多条查询语句的查询的每一列的类型和顺序最好一致
3、unino 默认去重,union all可以包含重复项 */
Select * From employees Where email Like '%a%' or department_id>90;
Select * From employees Where email Like '%a%'
Union
Select * From employees Where department_id>90;
select concat('a', 'p', 'p', 'le'); -- 连接字符串 apple
select concat_ws(',', 'a', 'p', 'p', 'le'); -- 连接用','分割字符串 a,p,p,le
select insert('chinese', 3, 2, 'IN'); -- 从3位置开始的2个字符替换为'IN'-chINese
select instr('杨不悔爱上了殷六侠', '殷六侠'); -- 返回第一次出现的起始索引
select lpad('殷素素', 10, '*'); -- 用指定字符左填充指定长度
select rpad('殷素素', 10, 'ab'); -- 用指定字符右填充指定长度
select left('chinese', 4); -- 返回字符串'chinese'左边的4个字符-chin
select right('chinese', 3); -- 返回字符串'chinese'右边的3个字符-ese
SELECT substr('李莫愁爱上了陆展元', 7); -- 截取从指定索引处后面的所有字符
SELECT substr('李莫愁爱上了陆展元', 1, 3); -- 截取从指定索引处指定字符长度的所有字符
SELECT substring('chinese', 3); -- 返回第三个字符之后的子字符串-inese
SELECT substring('chinese', -3); -- 返回倒数第三个字符之后的子字符串-ese
SELECT substring('chinese', 3, 2); -- 返回字符串'chinese'第三个字符之后的两个字符-in
SELECT trim(' chinese '); -- 切割字符串' chinese '两边的空字符-'chinese'
SELECT ltrim(' chinese '); -- 切割字符串' chinese '两边的空字符-'chinese '
SELECT rtrim(' chinese '); -- 切割字符串' chinese '两边的空字符-' chinese'
SELECT replace('张无忌爱上了周芷若', '周芷若', '赵敏'); -- 替换
SELECT reverse('chinese'); # 反向排序-'esenihc'
SELECT repeat('boy', 3); # 重复字符'boy'三次-'boyboyboy'
SELECT length('chinese'); # 返回字符串的长度-7
SELECT upper('chINese'), lower('chINese'); # 大写小写 CHINESE chinese
SELECT ucase('chINese'), lcase('chINese'); # 大写小写 CHINESE chinese
SELECT position('i' IN 'chinese'); # 返回'i'在'chinese'的第一个位置-3
SELECT position('e' IN 'chinese'); # 返回'i'在'chinese'的第一个位置-5
SELECT strcmp('abc', 'abd'); # 比较字符串,第一个参数小于第二个返回负数- -1
SELECT strcmp('abc', 'abb'); # 比较字符串,第一个参数大于第二个返回正数- 1
SELECT abs(-5); # 绝对值
SELECT bin(15), oct(15), hex(15); # 二进制,八进制,十六进制
SELECT pi(); # 圆周率3.141593
SELECT ceil(5.5); # 向上取整
SELECT floor(5.5); # 向下取整
SELECT greatest(3,1,4,1,5,9,2,6); # 返回集合中最大的值9
SELECT least(3,1,4,1,5,9,2,6); # 返回集合中最小的值1
SELECT mod(5,3); # 取余 mod(a,b) == a-a/b*b
SELECT rand(); # 返回 0 到 1 内的随机值,每次不一样
SELECT rand(5); # 提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。
SELECT round(1415.1415); # 四舍五入1415
SELECT round(1415.1415, 3); # 四舍五入三位数1415.142
SELECT round(1415.1415, -1); # 四舍五入整数位数1420
SELECT truncate(1415.1415, 3); # 截断为3位小数1415.141
SELECT truncate(1415.1415, -1); # 截断为-1位小数1410
SELECT sign(-5); # 符号函数 参数>0 返回1;参数<0 返回-1
SELECT sqrt(9); # 平方根3
SELECT NOW(); -- 返回当前系统日期+时间
SELECT CURDATE(); -- 返回当前系统日期,不包含时间
SELECT CURTIME(); -- 返回当前系统时间,不包含日期
SELECT YEAR(NOW()) 年; -- 可以获取指定的部分,年、月、日、小时、分钟、秒
SELECT YEAR('1998-1-1') 年;
SELECT str_to_date('07-11-1997', '%m-%d-%Y'); -- 将日期格式的字符串转换成指定格式的日期
SELECT date_format('1997/11/07', '%Y年-%m月-%d日'); -- 将日期转换成字符串
SELECT quarter(current_date);
SELECT monthname(current_date), dayname(current_date); -- January Saturday
SELECT dayofweek(current_date), dayofmonth(current_date), dayofyear(current_date);
select count(id) as total from n; -- 总数
select sum(age) as all_age from n; -- 总和
select avg(age) as all_age from n; -- 平均值
select max(age) as all_age from n; -- 最大值
select min(age) as all_age from n; -- 最小值
SELECT IF(10>5, '大', '小');
SELECT ifnull(NULL, 't'), ifnull(2, 't'); # t 2
SELECT isnull(1), isnull(1/0); # 0 1 是null返回1,不是null返回0
SELECT nullif('a', 'a'), nullif('a', 'b'); # null a 参数相同或成立返回null,不同或不成立则返回第一个参数
# case函数的使用:
/*
语法1(switch case 的效果):
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1;
when 常量2 then 要显示的值2或语句2;
...
else 要显示的值n或语句n;
end
语法2(if else嵌套 的效果)的效果:
case
when 条件1 then 要显示的值1或语句1;
when 条件2 then 要显示的值2或语句2;
...
else 要显示的值n或语句n;
end
*/
SELECT salary, department_id,
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
end AS 新工资
FROM employees;
SELECT salary,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
end AS 工资级别
FROM employees;
# 创建一个表
CREATE TABLE n(id INT, name VARCHAR(10));
CREATE TABLE m(id INT, name VARCHAR(10), PRIMARY KEY (id), FOREIGN KEY (id) REFERENCES n(id), UNIQUE (name));
CREATE TABLE m(id INT, name VARCHAR(10));
# 直接将查询结果导入或复制到新创建的表
CREATE TABLE n SELECT * FROM m;
# 新创建的表与一个存在的表的数据结构类似
CREATE TABLE m LIKE n;
# 创建一个临时表
# 临时表将在你连接MySQL期间存在。当断开连接时,MySQL将自动删除表并释放所用的空间。也可手动删除。
CREATE TEMPORARY TABLE l(id INT, name VARCHAR(10));
# 直接将查询结果导入或复制到新创建的临时表
CREATE TEMPORARY TABLE tt SELECT * FROM n;
# 删除一个存在表
DROP TABLE IF EXISTS m;
# 更改存在表的名称
ALTER TABLE n RENAME m;
RENAME TABLE n TO m;
# 查看表的结构(以下五条语句效果相同)
DESC n; # 因为简单,所以建议使用
DESCRIBE n;
SHOW COLUMNS IN n;
SHOW COLUMNS FROM n;
EXPLAIN n;
# 查看表的创建语句
SHOW CREATE TABLE n;
# 添加字段
ALTER TABLE n ADD age VARCHAR(2) ;
# 删除字段
ALTER TABLE n DROP age;
# 更改字段属性和属性
ALTER TABLE n CHANGE age a INT;
# 只更改字段属性
ALTER TABLE n MODIFY age VARCHAR(7) ;
# 增加数据
INSERT INTO n VALUES (1, 'tom', '23'), (2, 'john', '22');
INSERT INTO n SELECT * FROM n; # 把数据复制一遍重新插入
# 删除数据
DELETE FROM n WHERE id = 2;
# 更改数据
UPDATE n SET name = 'tom' WHERE id = 2;
# 数据查找
SELECT * FROM n WHERE name LIKE '%h%';
# 数据排序(反序)
SELECT * FROM n ORDER BY name, id DESC ;
# 增加用户
CREATE USER 'test'@'localhost' IDENTIFIED BY 'test';
INSERT INTO mysql.user(Host, User, Password) VALUES ('localhost', 'test', Password('test')); # 在用户表中插入用户信息,直接操作User表不推荐
# 删除用户
DROP USER 'test'@'localhost';
DELETE FROM mysql.user WHERE User='test' AND Host='localhost';
FLUSH PRIVILEGES ;
# 更改用户密码
SET PASSWORD FOR 'test'@'localhost' = PASSWORD('test');
UPDATE mysql.user SET Password=Password('t') WHERE User='test' AND Host='localhost';
FLUSH PRIVILEGES ;
# 用户授权
GRANT ALL PRIVILEGES ON *.* TO test@localhost IDENTIFIED BY 'test';
# 授予用'test'密码登陆成功的test@localhost用户操作所有数据库的所有表的所有的权限
FLUSH PRIVILEGES ; # 刷新系统权限表,使授予权限生效
# 撤销用户授权
REVOKE DELETE ON *.* FROM 'test'@'localhost'; # 取消该用户的删除权限
drop table if exists tab_identify; -- 删除表
create table tab_identify(
id int primary key auto_increment,
name varchar(50)
); -- 创建表
truncate table tab_identify; -- 清空表信息
insert into tab_identify(name) value('123'); -- 插入数据
show variables like '%auto_increment%'; -- 查看系统字段信息
set auto_increment_increment=3; -- 修改自增长值
select * from tab_identify; -- 查询表信息
alter table tab_identify modify column id int primary key auto_increment; -- 修改表时设置标识符
alter table tab_identify modify column id int; -- 修改表时删除标识符
desc tab_identify; -- 查看表结构
整数类型 | 字节 |
---|---|
tinyint | 1 |
smallint | 2 |
mediumint | 3 |
int、integer | 4 |
bigint | 8 |
1)如果不设置无符号还是有符号,默认是有符号,如果想设置无符号,需要添加unsigned关键字
2)如果插入的数值超出了整型的范围,会报out of range异常,并且插入临界值
3)如果不设置长度,会有默认的长度
长度代表了显示的最大宽度,如果不够会用0在左边填充,但必须搭配zerofill使用!
分类:浮点型 float(M,D) double(M,D)
定点型 dec(M,D) decimal(M,D)
1)M:整数部位+小数部位
D:小数部位
如果超过范围,则插入临界值
2)M和D都可以省略
如果是decimal,则M默认为10,D默认为0
如果是float和double,则会根据插入的数值的精度来决定精度
3)定点型的精确度较高,如果要求插入数值的精度较高如货币运算等则考虑使用
较短的文本:char、varchar
binary和varbinary用于保存较短的二进制
enum用于保存枚举
set用于保存集合
较长的文本:text、blob(较大的二进制)
写法 | M的意思 | 备注 |
---|---|---|
char char(M) 固定长度 | 最大的字符数,可以省略,默认为1 | 比较耗费空间、效率高 |
varchar varchar(M) 可变长度 | 最大的字符数,不可以省略 | 比较节省空间、效率低 |
分类:date只保存日期
time 只保存时间
year只保存年
datetime保存日期+时间
timestamp保存日期+时间
字节 | 范围 | 时区等的影响 | |
---|---|---|---|
datetime | 8 | 1000——9999 | 不受 |
timestamp | 4 | 1970-2038 | 受 |
含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性
六大约束 | 备注 |
---|---|
NOT NULL | 非空,用于保证该字段的值不能为空 |
DEFAULT | 默认,用于保证该字段有默认值 |
PRIMARY KEY | 主键,用于保证该字段的值具有唯一性 |
UNIQUE | 唯一,用于保证该字段的值具有唯一性,可以为空 |
CHECK | 检查约束【mysql中不支持】 |
FOREIGN KEY | 外键,限制两个表的关系,保证该字段的值必须来自于主表的关联列的值 |
1)约束的添加分类:
1、列级约束:六大约束语法上都支持,但外键约束没有效果
2、表级约束:除了非空、默认,其他的都支持
2)主键和唯一的大对比:
保证唯一性 是否允许为空 一个表中可以有多少个 是否允许组合
主键 √ × 至多有1个 √,但不推荐
唯一 √ √ 可以有多个 √,但不推荐
3)外键:
1、要求在从表设置外键关系
2、从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
3、主表的关联列必须是一个key(一般是主键或唯一)
4、插入数据时,先插入主表,再插入从表
删除数据时,先删除从表,再删除主表
# 一、创建表时添加约束
/* 1. 添加列级约束
语法:直接在字段名和类型后面追加 约束类型即可。
只支持:默认、非空、主键、唯一 */
drop table stuinfo;
create table stuinfo(
id int primary key, -- 主键
stuName varchar(20) not null unique, -- 非空
gender char(1) check(gender='男' OR gender ='女'), -- 检查
seat int unique, -- 唯一
age int default 18, -- 默认约束
majorId int references major(id) -- 外键
);
/* 2.添加表级约束
语法:在各个字段的最下面
【constraint 约束名】 约束类型(字段名) */
drop table if exists stuinfo;
create table stuinfo(
id int,
stuname varchar(20),
gender char(1),
seat int,
age int,
majorid int,
constraint pk primary key(id), -- 主键
constraint uq unique(seat), -- 唯一键
constraint ck check(gender='男' OR gender='女'), -- 检查
constraint fk_stuinfo_major foreign key(majorid) references major(id) -- 外键
);
# 二、修改表时添加约束
/* 1、添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束; */
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL; -- 添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18; -- 添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY; -- 添加主键
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE; -- 添加唯一
/* 2、添加表级约束
alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用】; */
alter table n add primary key (id); -- 添加主键
alter table n add constraint pk_n primary key (id); -- 主键只有一个,所以定义键名似乎也没有什么用
alter table n drop primary key; -- 删除主键
alter table m add foreign key (id) references n(id); -- 添加外键,自动生成键名m_ibfk_1
alter table m add CONSTRAINT fk_id FOREIGN KEY (id) REFERENCES n(id); -- 使用定义的键名fk_id
ALTER TABLE m DROP FOREIGN KEY fk_id; -- 删除外键
ALTER TABLE m DROP FOREIGN KEY fk_id, ADD CONSTRAINT fk_id2 FOREIGN KEY (id) REFERENCES n(id); -- 删除之后重新建
alter table n add unique (name); -- 添加唯一键
alter table n add unique u_name (name);
alter table n add unique index u_name (name);
alter table n add constraint u_name unique (name);
create unique index u_name on n(name);
alter table n add index (age); -- 添加索引
alter table n add index i_age (age);
create index i_age on n(age);
drop index u_name on n; -- 删除索引或唯一键
drop index i_age on n;
-- DDL 数据定义语言
# 一、库的管理
CREATE DATABASE IF NOT EXISTS books; -- 创建库Books
RENAME DATABASE books TO 新库名; -- 库的修改
ALTER DATABASE books CHARACTER SET gbk; -- 更改库的字符集
DROP DATABASE IF EXISTS books; -- 库的删除
# 二、表的管理
CREATE TABLE book( -- 创建表Book
id INT,#编号
bName VARCHAR(20),#图书名
price DOUBLE,#价格
authorId INT,#作者编号
publishDate DATETIME#出版日期
);
DESC book; -- 查看表结构
ALTER TABLE book CHANGE COLUMN publishdate pubDate DATETIME; -- 修改列名
ALTER TABLE book MODIFY COLUMN pubdate TIMESTAMP; -- 修改列的类型或约束
ALTER TABLE author ADD COLUMN annual DOUBLE; -- 添加新列
ALTER TABLE book_author DROP COLUMN annual; --删除列
ALTER TABLE author RENAME TO book_author; -- 修改表名
DESC book; -- 查看表结构
DROP TABLE IF EXISTS book_author; -- 表的删除
SHOW TABLES; -- 查看所有表名
-- 通用的写法:
DROP DATABASE IF EXISTS 旧库名;
CREATE DATABASE 新库名;
DROP TABLE IF EXISTS 旧表名;
CREATE TABLE 表名();
# 三、表的复制
SELECT * FROM Author;
SELECT * FROM copy2;
CREATE TABLE copy LIKE author; -- 仅仅复制表的结构
CREATE TABLE copy2 SELECT * FROM author; -- 复制表的结构+数据
CREATE TABLE copy3 SELECT id,au_name FROM author WHERE nation='中国'; -- 只复制部分数据
CREATE TABLE copy4 SELECT id,au_name FROM author WHERE 0; -- 仅仅复制某些字段
-- 含义:虚拟表,和普通表一样使用
# 一、创建视图
/*语法: create view 视图名
as
查询语句; */
CREATE VIEW v AS SELECT id, name FROM n;
CREATE VIEW v(id, name) AS SELECT id, name FROM n;
# 二、视图的修改
/* 方式一语法:create or replace view 视图名 as 查询语句; */
CREATE OR REPLACE VIEW myv3
AS
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id;
/* 方式二语法:alter view 视图名 as 查询语句; */
ALTER VIEW myv3
AS
SELECT * FROM employees;
# 三、删除视图
DROP VIEW emp_v1,emp_v2,myv3;
DROP VIEW IF EXISTS v;
# 四、查看视图
DESC myv3;
SELECT * FROM v;
SHOW CREATE VIEW myv3;
# 五、视图的更新
CREATE OR REPLACE VIEW v AS SELECT name, age FROM n;
ALTER VIEW v AS SELECT name FROM n ;
INSERT INTO myv1 VALUES('张飞','[email protected]'); -- 插入
UPDATE myv1 SET last_name = '张无忌' WHERE last_name='张飞'; -- 修改
DELETE FROM myv1 WHERE last_name = '张无忌'; -- 删除
# 具备以下特点的视图不允许更新
-- 包含以下关键字的sql语句:分组函数、distinct、group by、having、union、union all
-- 常量视图
-- Select中包含子查询
-- join
-- from一个不能更新的视图
-- where子句的子查询引用了from子句中的表