SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。
数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE
子句组成的查询块:
SELECT <字段名表>
FROM <表或视图名>
WHERE <查询条件>
数据操纵语言DML主要有三种形式:
1) 插入:INSERT
2) 更新:UPDATE
3) 删除:DELETE
数据定义语言DDL用来创建数据库中的各种对象-----表、视图、
索引、同义词、聚簇等如:
CREATE TABLE/VIEW/INDEX/SYN/CLUSTER
| | | | |
表 视图 索引 同义词 簇
DDL操作是隐性提交的!不能rollback
数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制
数据库操纵事务发生的时间及效果,对数据库实行监视等。
进入mysql中的命令
mysql -u root -p,密码最好设为123456
展现当前所有数据库:
show databases;
创建数据库:
create database mydb1;(数据库名字,最好设为中文)sql语句不区分大小写,但是自己写的时候可以用大小写区分,关键词都使用大写
create database if not exists mydb2;(if not exists 表示在没有的情况下创建,有则不会发生改变,也不会报错)
创建数据库,规定编码表:
create database mybd2 character set UTF8; (在mysql中UTF-8应该写为 UTF8)
创建数据库,校队规则,Collation是在一个字符集中进行如何排序的规则
create datebase mybd3 character set UTF8 collate UTF8_general_ci ==不区分大小写==
create datebase mybd4 character set UTF8 collate UTF8_bin;==区分大小写==
安 顺序 和 逆序查看表中数据:
select from test1 order by name asc; ==升序==
select from test1 order by nasme desc;==降序==
查看数据库,显示数据库创建语句:
show databases; 查看所有的数据库
show create database db_name; 显示数据库创建语句
删除数据库
drop database mybd1;
修改数据库的编码表
alter database mydb1 character set utf8;
备份,恢复数据库
备份:在cmd中 mysqldump -u 用户名 -p 数据库名>文件名.sql
恢复:方式一:在mysql中 source 文件名.sql
? 方式二:在cmd 中 mysql -u 用户名 p 数据库名 <文件名.sql
显示表:
show tables; 显示全部的表
desc 表名; 简单描述表结构
describe 表名;简单描述表结构
sho create table :查看生成表的 DDL 语句
隔开(在1的旁边,不是单引号) create
order`(id int); 在之后的表操作中也一直要加上```?
新增数据(Insert语句)
==字符串和日期型数据应包含在单引号中。==
表名后没有带列名的需要把所有数据都填充,而且数据类型要和表结构一直,或者可以指定相应列名,单独赋值
a. 表名后没有带列名的,把数据全部填充
insert into 表名 values(数据);//==有s啊!!s!!==
举例 :在student表中新增一个学生数据,学生有 id 姓名,年纪,三个属性, 数据类型分别为 int varchar(100) int
insert into student values(123,‘赵元‘,18);
b. 指定了相应的类名,单独赋值,==未填充的数据来自default==
insert into 表名(列明1,列名2) values(数据1,数据2);
insert into student (id,name) values(123,‘赵元‘);
==插入空值 insert into table values(null),==没啥意思
注意:插入单行的时候使用VALUES,在插入多行的时候使用VALUE 这样比较快一点
==删除表中数据也可使用TRUNCATE TABLE 语句,它和delete有所不同 ==
==delete 和drop的区别==:
delete from 表名:删除一个表内的元素
drop table 表明:删除一个表
DQL:Data Query Language
作用:查询表中的数据。
关键字:
SELECT
方式2: LIMIT nums OFFSET offset; //显示num行数据,偏移量是 offset
注意:offset是指偏移量,当我们从第1行查起,偏移量自然为0。此时,可以写成 LIMIT nums;
**扩展:**我们可以使用 LIMIT 关键字实现分页查询。 LIMIT (page_num – 1) * page_size, page_size;
对查询结果进行排序:我们可以使用 ORDER BY 子句对查询结果进行排序。
==多列排序的时候,在最前面的优先级最强(首先按照第一列的要求进行排序,第一列排序完之后再细微调整第二列,也就是优先级由高到低的过程。)==
如: 根据语文成绩 顺序排列,数学成绩 逆序,英语成绩 顺序
select *from student order by chinese asc, math desc,english asc;
分组查询
[GROUP BY {column_names}] [HAVING
使用 HAVING 过滤分组
举例:查询各班人数
select count(id) as number from student
举例: 查询人数大于2的班级
当使用group by a列语句之后,在单独检索除了a列以 外的其他字段都没有什么意义,这个时候相同分类的数据 已经合并了, 所以,如果想再取出全部的数据,则必须 使用group concat()函数
注意:在 MySQL 中,0 表示 false,非 0 表示 true,故:SELECT * FROM t_students WHERE 1; 也是合法的。
### SELECT语句的执行顺序
(5) SELECT column_name, ...
(1) FROM table_name, ...
(2) [WHERE ...]
(3) [GROUP BY ...]
(4) [HAVING ...]
(6) [ORDER BY ...];
注意:从上到下是写sql语句时正确的语法结构,()括号里面的数字代表该条sql语句在服务器内部解析的先后顺序。
注意:这里以MySQL为例,不同的DBMS的都支持数值类型,字符串类型以及日期类型,但他们的实现可能不一样。
数据类型 | 占用字节 | 说明 |
---|---|---|
TINYINT | 1 | 很小的整数 |
SMALLINT | 2 | 小的整数 |
MEDIUMINT | 3 | 中等大小的整数 |
INT | 4 | 普通大小的整数 |
BIGINT | 8 | 大整数 |
类型名称 | 占用字 | 说明 |
---|---|---|
FLOAT(M,D) | 4 | 单精度浮点数 |
DOUBLE(M,D) | 8 | 双精度浮点数 |
DECIMAL(M,D) | M+2 | 定点数 |
其中 M 称为精度,表示总共的位数;
D 称为标度,表示小数的位数。
DECIMAL 类型不同于 FLOAT & DOUBLE,DECIMAL 实际是以字符串存放 的,它的存储空间并不固定,而是由精度 M 决定的
类型名称 | 日期格式 | 占用字节 |
---|---|---|
YEAR | YYYY (2018) | 1 |
TIME | HH:MM:SS (10:20:00) | 3 |
DATE | YYYY-MM-DD (2018-7-23) | 3 |
DATETIME | YYYY-MM-DD HH:MM:SS | 8 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 4 |
ATETIME 和 TIMESTAMP 虽然显示的格式是一样的,但是它们有很大的区别:
DATETIME 的系统默认值是 NULL, 而 TIMESTAMP 的系统默认值是 当前时间 NOW();
DATETIME 存储的时间与时区无关,而 TIMESTAMP 与时区有关。
类型名称 | 占用字节 | 说明 |
---|---|---|
CHAR(M) | M, 1 <= M <= 255 | 固定长度字符串 |
VARCHAR(M) | L+1, L <=M, 1 <=M <=255 | 变长字符串 |
TINYTEXT | L+1, L < 2^8 | 非常小的文本字符串 |
TEXT | L+2, L < 2^16 | 小的文本字符串 |
MEDIUMTEXT | L+3, L < 2^24 | 中等大小的文本字符串 |
LONGTEXT | L+4, L < 2^32 | 大的文本字符串 |
ENUM | 1 或者 2个字节,取决于枚举的数目,最大 65535个 | 枚举类型 |
SET | 1,2,3,4或8个字节 | 集合类型 |
ENUM 类型总有一个默认值,当ENUM 列声明为NULL,则默认值为NULL。如果 ENUM 列被声明为 NOT NULL,则其默认值为列表的第一个元素。
不怎么用
字符串类型存储的是非二进制字符串(字符字符串),
二进制类型存储的是二进制字符串(字节字符串)
基本和java 一样,与java 不同的有一下几个:
IS NULL 是否为NULL
<=> 安全的等于
IN 是否在列表内
LIKE 通配符匹配
==not like==
==not like==
‘%’ 匹配任何数目的字符,甚至包括零字符
‘_’ 只能匹配一个字符
例如: 查询student中姓名第一个字为‘赵’的学生
select *from tsudnet where name like ‘赵%’
注意:在很多DBMS中,AS关键字是可选的,不过最好使用它,这被视为一条最佳实践。
提示:AS 关键字不仅能给列起别名,还可以给表起别名。在多表查询中,我们会这样使用它。
我们可以给 Chinese + math + english 起一个更简单直接一点的名字。
SELECT name, chinese + math + english AS total FROM t_students;
COUNT()
COUNT(*) 计算表中的总==行==数;
Select count(*)|count(列名) from tablename
[WHERE where_definition]
COUNT(column_name) 计算指定列下的总行数,计算时将忽略值为NULL的行。
MIN():返回指定==列==的最小值
计算时将忽略值为NULL的行;
Select max(列名) from tablename
[WHERE where_definition]?
使用 GROUP BY 关键字对数据进行分组。
[GROUP BY {column_names}] [HAVING
使用 HAVING 过滤分组
注意:使用分组后,数据会根据所指定的字段分组,但是不能把每个组内的数据完全显示
这时需要使用==group_concat()==函数,使全部的数据显示出来。
例如:
聚合函数和group by分组一起使用的时候,聚合函数会对每个一个组进行单独计算
举例:查询每个班的学生人数
select count(id) ,class as count from student group by class;
查询每个班人数大于2 的班级和人数:
select count(id) as number,class as count from student group by class having number>2;
where语句在分组之前,执行完where语句再去对数据进行分组
having语句在分组之后,执行完分组之后,再对分组数据进行一个过滤筛选。
例如:仅选出各科成绩都在90之上的学生,之后,对学生进行分组
数据完整性是为了保证插入到数据库中的数据是正确的,它防止了用户可能的输入错误。
新建主键:
方式一:新建表的时候创建
create table student (id int PRIMARY KEY);
primary key就是设置主键的关键字
方式二: 修改表创建主键
alter table studnet MODIFY id int PRIMARY KEY;
alter table studnet ADD id int PRIMARY KEY;
MODIFY 字段 类型 PRIMARY KEY,设置为主键
ADD 字段 类型 PRIMARY KEY 新增字段为主键
定义主键自动增长
auto_increment
方式一:新建表的时候创建自增长
create table student(id int PRIMARY KEY AUTO_INCREMENT);
方式二: 修改表这设置主键自增长
alter table student MODIFY id int PRIMARY KEY AUTO_INCREMENT;
定义外键约束
constraint constraint_FK_name foreign key(ordersid) references orders(id),
实体完整性中的自动维护,当删除自动维护添加的主键的时候,之后再添加元素,id也从所删的主键之后添加,不会连续,自己添加主键后,自动维护添加的主键是从最大的id开始自增。
用在 例如用户注册的时候选择手机号或者邮箱
唯一性约束,可以插入多个null数据,但是其他的数据只能是唯一的
两种方式:
比如有两张表,一张学生选课表,另外一张课程表,学生选择的课程必须是课程表中出现的课程,这个时候可以用外键来约束。如果不是课程表内的课程,则无法插入。
新建外键:
外键的优劣:
关于外键的优劣,有两种观点,一种认为外键可以起到很好的约束作用,值得使用
另外一种观点,认为外键虽然可以起到约束,但是同时它给数据库系统带来的整体开销远远大于获得的益处。
一对多:在多的一方添加外键约束,有效地减少数据冗余,也就是减少数据重复
多对多:生成第三个表,存储她们的关系
一对一:可以将另外一张表的字段直接写入表中,很不常用
报表查询
外连接:分为左外连接(left out join)、右外连接(right outer join)。与内连接不同的是,外连接不仅返回连接表中符合连接条件及查询条件的数据行,也返回左表(左外连接时)或右表(右外连接时)中仅符合查询条件但不符合连接条件的数据行。
Select *from TABLE1 join_type TABLE2 [on (join_condition)]
[where (query_condition)]
方式二:select * from table1 CROSS JOIN table2;
隐式内连接:不包含inner join关键字和on关键字,在where子句中设定连接条件
SELECT * FROM customer c,orders o WHERE c.id=o.customer_id;
左连接查询和右连接查询没有太大区别
带查询条件的左外连接查询,在where子句中设定查询条件
SELECT * FROM customer c LEFT OUTER JOIN orders o ON c.id=o.customer_id WHERE o.price>250;
带查询条件的右外连接查询,在where子句中设定查询条件
SELECT * FROM customer c RIGHT OUTER JOIN orders o ON c.id=o.customer_id WHERE o.price>250;
练习:
查询“郭靖”的所有订单信息
SELECT * FROM orders WHERE customer_id=(SELECT id FROM customer WHERE name LIKE ‘%郭靖%‘);
select * from customer c inner join orders o on c.id = o.customer_id and c.name like ‘%郭靖%‘;
联合查询能够合并两条查询语句的查询结果,去掉其中的重复数据行,然后返并没有重复数据行的查询结果。联合查询使用union关键字
SELECT * FROM orders WHERE price>100 UNION SELECT * FROM orders WHERE customer_id=1;
报表查询对数据行进行分组统计,其语法格式为:
select … from … [where…] [ group by … [having… ]] [ order by … ]
-其中group by 子句指定按照哪些字段分组,having子句设定分组查询条件。
原文:https://www.cnblogs.com/zhaoyuan72/p/11306214.html