SQL的基础学习
SQL
1. 概念:
结构化查询语言(Structured Query Language)简称SQL,意思就是说这个是mysql的执行语句,就相当是java语言一样有规范。只要是关系型数据库,都可以用sql语句,但是不同的数据库,sql语法稍微有些不同
2.语法(规范):
-
在cmd里面
Sql可以执行多行语句,也可以执行单行语句,多行语句就要用分号结尾
-> show dateBases --> 执行(按一下回车,就代表你要执行多行,现在cmd就等你的;直到识别出;之后直接将所有执行过的结果在显示出 来) -> ..... --(执行,但是还不显示) -> ;
-
使用空格和缩进增强代码的可读性
-
sql语句是不区分大小写的,虽然在sqyog里面关键字直接就给你自动变成大写了
-
注释:
多行注释:/* 注释内容 */
单行注释:
--
注释内容 或#
注释内容(Mysql特有的)
3.SQL语言的分类:
-
DDL(数据库定义语言):用来定义数据库,表,表里面的属性 ----> 关键字: create drop alter show use等 就是这写关键字开头的
-
DML(数据库操作语言):用来对数据库中表进行增删改操作的—> **关键字:**insert delete update等 就是这写关键字开头的
-
DQL(数据库查询语言):用来查询表中的数据-----> 关键字: select where
-
DCL(数据库控制语言):用来控制用户的权限(就相当是写了一些权限修饰符)有些用户被修饰符修饰之后查询数据库的能力就被限制了
还有就是创建用户 ----> **关键字:**grant revoke等
-
如图解释五种类型语言所应用的场景:
4.数据库定义语言(DDL)—数据库
-
操作数据库 CRUD
- C – create 创建数据库
- R – retrieve 查询数据库
- U – update 修改数据库(更新就像当时修改)
- D – drop 删除数据库
小知识点:latin1 是 ISO-8859-1这种编码集的别名
C:
-- DDL语句创建一个数据库 CREATE DATABASE IF NOT EXISTS `test` -- DDL语句查看创建`test`表的语句 SHOW CREATE DATABASE `test` -- 创建数据库如果已经存在数据库则创建失败 -- DDL创建一个数据库并且编码集是utf-8 CREATE DATABASE IF NOT EXISTS `test2` CHARSET utf8
R:
-- DDL查看所有的数据库 SHOW DATABASES -- DDL操作查看一个创建数据库的操作语句和创建数据库的编码集 SHOW CREATE DATABASE `test`
U:
-- DDL操作修改test的编码集为gbk ALTER DATABASE `test` CHAR SET gbk
D:
-- DDL删除一个数据库 DROP DATABASE IF EXISTS `test2`
额外还有一个:
-- DDL操作使用数据库 USE `test`
5.数据库定义语言(DDL)—表
1. Create 创建表(DDL创建表)
学生表
学号 | 姓名 | 年龄 |
---|---|---|
CREATE FROM IF NOT EXISTS`student`(
每一列的名字(列名) 数据类型,
列名2 数据类型,
....... ,
列名last 数据类型 -- 不加逗号
);
注意事项:
1.DDL语句中在创建表的时候,每一行的语句后面都要加逗号但是最后一个语句不用加逗号
2.数据类型
-
数据类型
- 整型: INT
- 小数类型: float,double 例如: FLOAT(5,2) —> 意思就是说这个数是五位,但是包括小数点后必须有两位(总共加起来就是五位)
- 日期类型: date 只包含年月日 —> 赋值的时候格式 (yyyy-MM-dd)
- 日期类型: datetime: 包含年月日和时分秒 —> 赋值的时候格式 (yyyy-MM-dd HH-mm-ss)
- 时间戳类型: timestamp: 包含年月日时分秒 —> 不用赋值或者直接赋null 就会返回当前系统的时间(和我们java中的时间戳是不一样的)
- 字符类型: char,varchar
- char(n): 长度不改变字符类型 n就代表了固定的长度,如果n是5的话,现在只输入了3个字符那么就会用空格补齐,然后检查长度的时候就会把空格删除掉
- varchar(n): 长度改变类型 就是说如果n是5的话但是你只输入了3个字符,那么系统不会用空格将后面的补充,它的长度还是3
-
实例:
-
C: 创建表
CREATE TABLE IF NOT EXISTS `student`( `id` INT COMMENT '学号', `name` VARCHAR(2) COMMENT '姓名', `score` DOUBLE(5,2) COMMENT '成绩', `birthday` DATE COMMENT '日期', `currenttime` TIMESTAMP DEFAULT NULL COMMENT '当前时间' );
-
**R:**查询表
-- DDL展示表 SHOW TABLES -- DDL查询表的创造语言的语句 SHOW CREATE TABLE `school`
-
**U:**修改表(修改表内的东西)
-- DDL修改表名 ALTER TABLE `stu` RENAME TO `student` -- DDL 修改表的字符集 ALTER TABLE `stu` CHARACTER SET utf8 -- DDL 添加表中的某一个字段 ALTER TABLE `stu` ADD `index` INT COMMENT '索引' -- DDL 修改表中的某一字段 ALTER TABLE `stu` MODIFY `index` VARCHAR(10) -- modify只能改字段的类型 ALTER TABLE `stu` CHANGE `index` `sex` VARCHAR(10) -- change不仅可以改变字段的名称,也可以更改字段的名字 -- DDL 删除表中的某一个字段 ALTER TABLE `stu` DROP `sex`
-
**D:**删除表(直接将表删除)
-- DDL 删除表 DROP TABLE IF EXISTS `stu`
-
6.数据库操作语言(DML)
- 增加表中的数据—insert into
-- DML 操做表中添加字段的属性
INSERT INTO `student` (id,`name`,score,birthday,currenttime) VALUES (1,'Fan',150.00,'2000-8-12',NULL)
-- 插入全部的字段的属性的话就可以剩去字段的名字
INSERT INTO `student` VALUES (1,'Fa',150.00,'2000-8-12',NULL)
-- DML 操作数据中添加字段属性的不同语法
1.一次插入多个
INSERT INTO `student` (id,`name`,score,birthday,currenttime) VALUES (1,'Fan',150.00,'2000-8-12',NULL)
,(2,'Fan',150.00,'2000-8-12',NULL)
2.一次插入不同个字段的属性
INSERT INTO `student` (id,score,birthday,currenttime) VALUES (1,150.00,'2000-8-12',NULL)
3.一次插入多个不同字段的属性
INSERT INTO `student` (id,score,birthday,currenttime) VALUES (1,150.00,'2000-8-12',NULL),(2,150.00,'2000-8-12',NULL)
注意事项:
1.字段名和属性要一 一对应
2.如果不加字段名则默认为全部字段名,并且按照顺序的字段名
3.除了数字数据类型之外,其他类型都要加引号
-
删除表中的数据—delete from…where
-- DML 删除表中的所有数据 DELETE FROM `student` TRUNCATE `student` -- DML 删除表中指定位置的数据 DELETE FROM `student` WHERE id = 1 TRUNCATE `student`
delete 和 truncate的区别
- delete删除:是将表中的数据一个一个的删除,但是 不会删除自增量(有的属性会设置自增量,这些设置子增量的属性会被删除,但是子增量是不会删除的)
- truncate删除:直接将一张表就删除了,然后再给你原封不动的创建一张表,这样自增量就会全部被删除
-
修改表中的数据 —> update … set
-- DML 改变表中的数据 UPDATE `student` SET id = 2; -- DML 改变表中指定位置的一个数据 UPDATE `student` SET id = 1 WHERE `id` = 3 -- DML 该表表中指定位置的多个数据 UPDATE `student` SET id = 3, score = 100.0 WHERE `id` = 2
7.数据库查询语言(DQL)
几个重要的关键字
select 字段名 from 表名列表 where 条件列表 group by 分组字段 having 分组之后的条件 order by 排序 limit 分页限定
1. 基本查询
①: 添加一张表
INSERT INTO `student1` VALUES
(1,'马云',18,'男','杭州',80,80),
(2,'马化腾',19,'男','深圳',75,60),
(3,'埃隆马斯克',31,'男','美国',76,93),
(4,'扎克伯格',27,'男','美国',65,NULL),
(5,'郎平',16,'女','上海',90,98),
(6,'姚明',32,'男','上海',80,81);
②:要求查询 student1表中所有的学生的年龄信息和姓名
SELECT `name`, `age` FROM `student1`
③:要求查询 student1表中的不重复的性别和地址(去重查询)
distinct—>去重
SELECT
DISTINCT `address` ,`sex`