首页 > 数据库 >SQL语法

SQL语法

时间:2022-08-18 19:55:39浏览次数:48  
标签:null unknown 数据库 SQL 查询 语法 表名 权限

SQL语句的特点

  1. 不区分大小写
  2. 分为DDL,DML,DQL,DCL四个分支
  3. 注释格式为/* */多行注释和#单行注释

注:
DDL(Data definition Language)数据库定义(比如说表,数据库)
DML(Data Mainpulation Language)数据库的增删改查
DQL(Data Query Language)数据库数据的查询
DCL(Data control Language)数据库权限的设置


数据类型

数字类型

整型类型 占用字节
tinyint 1
smallint 2
mediumint 3
int 4
bigint 8
浮点数类型 占用字节
float 4
double 8
dectmal 自定义

注:
浮点数写成
float(精度,标度)这种
123.45这个数的精度是5,标度是2
dectmal的大小取决于我们自己定义的精度和标度

字符串类型

字符串类型 占用字节
char 自定义
varchar 自定义

注:
字符串的写法是:
char(字节数)
其中char和varchar的区别
char(10)即使你本身数据占用了1个字符其他会用空格补成10个字符的
varchar(10)如果存储1个字符的他就占用一个字符
char的性能会高一些,varchar的性能会低一些因为varchar使用的时候要计算一些大小

二级制数据类型 文本数据类型
tinyblob tingtext
mediumblob mediumtext
blob text
longblob longtext

注:
blob数据类型一般用来存储二进制数据比如说安装包,视频,音乐等
text数据类型一般用来存储长文本内容

日期类型

日期数据类型 占用大小 描述
data 3 年-月-日
time 3 时-分-秒
datatime 8 年-月-日-时-分-秒-
year 1
timestamp 4 年-月-日-时-分-秒

注:
timestamp最大是2038年-1月-19号


DDL语法

1.对数据库的操作

创建数据库

Create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则];

删除数据库

Drop database [if exists] 数据库名;

查询数据库
查询所有数据库

show databases;

查询当前所处的是哪个数据库

select database();

进入数据库

Use 数据库名;

2.对表的操作

查询表内有哪些字段

Desc 表名;

显示数据库内的所有表

Show tables;

查询表的创建语法是什么

Show create table;

创建表

Create table 表名(
	字段1 数据类型 [comment 注释内容] [约束条件],
	.......
	字段n 数据类型 [comment 注释内容] [约束条件]
)[comment 注释内容] [charset 字符集] [engine=引擎名];

删除表

Drop table [if exists] 表名;

对表字段的添加

Alter table 表名 add 字段名 数据类型 [comment 注释] [约束条件];

对表字段的删除

Alter table 表名 drop 字段名;

对表字段的修改

Alter table 表名 change 旧字段 新字段 类型 [comment 注释] [约束条件];

对表的名字修改

Alter table 表名 rename to 新表名;

DML语法

Insert(插入数据)

语法

insert into 表名(字段列表) values(值列表),(值列表),(值列表).....;

如果要给全部字段添加值那么,字段列表可以不加

insert into 表名 values(值列表);

注:
符串和日期要加引号,字段和值要一一对应

Update(更新数据)

语法

Update 表名 set 字段=值,字段=值.... [where 条件];

注:
如果不加where条件就会对整个字段进行修改

Delete(删除数据)

语法

Delete from 表名 [where 条件];

注:

  1. 如果不加where条件就会删除全部数据
  2. delete是对表的整行进行删除
  3. 要删除一行内的某个字段数据,用update将其设置为none即可

DQL语法

基本查询

语法

select 字段列表 from 表名;

注:
*可以代表所有字段,一般不用*因为可能触发回表查询(详见索引应用)

条件查询

语法

select 字段列表 from 表名 where 条件;

一些条件:

符号 描述
> 大于
< 小于
= 等于
>= 大于等于
<= 小于等于
!=或者<> 不等于
between A and B 在a到b之内(包含A,B)
IN(值列表) 在这些值之中(只要满足其中一个值即可)
Like '占位符' %代表任意字符, _ 代表一个字符
is NULL 是null
逻辑运算符 描述
and 或写成&& 多个条件同时成立
or 或写成 || 或者
Not 或者写成 ! 否定

注:
关于is null和is none涉及到mysql特有的三值逻辑

三值逻辑和null(重要!!)

Null的含义

NULL 用于表示缺失的值遗漏的未知数据,不是某种具体类型的值。
数据表中的 NULL 值表示该值所处的字段为空,值为 NULL 的字段没有值,尤其要明白的是:NULL 值与 0 或者空字符串是不同的。

俩种NULL

在SQL中虽然只存在一种null但是我们讨论的时候将其分为俩种null
分别是

  1. 未知(unknown)
    就好比一个人带了墨镜我们不知道他眼睛是什么颜色这就叫未知
  2. 不适用(not applicable,inapp licable)。
    就好比一个冰箱带了墨镜,或者问你男人生孩子的次数,这种情况就叫不适用

三值逻辑

主流语言(c,c++,php等)只有true和false的俩个逻辑值,但是在SQL中还存在另外一个逻辑值unknown
就类似。对(true),错(false),不知道(unknown)

故unknown分为:
逻辑值unknown,作为null的unknown

逻辑值unknown是一个明确的布尔值
作为null的unknown既不是值也不是变量
例如x=x,当x是逻辑值unknown的时候返回true,如果是作为null的unknown的时候返回的是unknown

逻辑值unknown的情况

假定x和y是unknown
故 not x 也为unknown
其他的记住优先级即可

  1. AND 的情况:false > unknown > true
  2. OR 的情况:true > unknown > false
    比如 false and unknown 返回的就是 false因为false的比较级更高!
    true and unknown 返回的是 unknown因为unknown的比较级更高!
    or同理

=null和 is null的区别

对于null如果使用=,>,<等比较词的时候返回的值都是unknown
而查询结果只会包含 WHERE 子句里的判断结果为 true 的行,不会包含判断结果为 false 和 unknown 的行。

NULL 既不是值也不是变量。NULL 只是一个表示没有值的标记,而比较谓词只适用于值。
故使用比较词给null是没有意义的!

聚合函数

常见的聚合函数

名字 描述
count(字段A) 统计数量
max(字段A) 最大值
min(字段A) 最小值
avg(字段A) 平均数
sum(字段A) 求和

用法:select 聚合函数 from 表名;
一般配合分组查询使用

分组查询

语法

select 字段列表 from 表名 where 条件 group by 要分组的字段 having 条件;

注:

  1. 如果不用group by分组的话就是把全部数据放到同一组的意思
  2. where是分组前的过滤。Having是分组后的过滤
  3. 比如说以男,女分组并统计男女的年龄的平均数
  4. 查询的函数一般为分组的字段和聚合函数,查询其他的无意义
  5. 执行顺序是 where->聚合函数->having
  6. 分组查询就好比将一个父表根据字段分成多个子表然后进行查询操作

排序查询

语法

select 字段列表 from 表名 order by 字段名 排序方法,字段名,排序方法....;
名子 描述
Desc 降序
Asc (默认)升序

注:
如果第一个字段值相同就按第二个字段进行排序

分页查询

语法

select 字段列表 from 表名 limit 起始索引 要查询记录条数;

起始索引值=(要查询的页数–1)查询记录数
例如第二页有10条记录数,起始索引就是(2-1)
10=10
如果查询第一页数据直接 limit 10,不需要写起始索引

执行顺序

编写顺序

select 字段列表 from 表名 where 条件 group by 分组字段名 having 条件 order by 排序字段 排序 limit 起始索引 查询记录数;

程序执行顺序

  1. from 表名 ->选择表
  2. where 条件 ->筛选表
  3. group by 字段 ->将表分组(相当于分成多个子表)
  4. having 条件 ->对已经分组后的表再一次进行条件筛选
  5. select 字段 ->选择要查询的字段
  6. order by 字段 顺序 ->选择表的排序
  7. limit 起始索引 查询记录数- >对完成后的表进行分页

DCL语法

管理用户

查询用户
在mysql中所有的用户都存在系统mysql数据库中,故查询用户就查询mysql的user表即可

Use mysql;进入
Select * from user;查询用户

创建用户

Create user '用户名'@'主机名' identified by '访问密码' ;

其中 主机名一般为一段ip地址,也可以写localhost代表本机
%代表任意主机
修改访问密码

Alter user '用户名'@'主机名' identified with mysql_native_password by '新密码';

删除用户

Drop user '用户名'@'主机名' ;

设置权限

显示用户有哪些权限

Show grants for '用户名'@'主机名';

给予用户权限

Grant 权限列表 on 数据库.表 to '用户名'@'主机名';
Grant all on 数据库1.* to '用户名'@'主机名';		#将数据库1中所有表的权限给用户

撤销用户权限

revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';

多个权限用逗号分割,*代表所有权限
常见的权限

权限 说明
ALL,ALL PRIVILEGES 所有权限
select 查询数据权限
INSERT 插入数据权限
Update 更新数据权限
Delete 删除数据权限
Alter 修改表的权限
Drop 删除,数据库/视图/表的权限
Create 创建数据库/表的权限

标签:null,unknown,数据库,SQL,查询,语法,表名,权限
From: https://www.cnblogs.com/wdadwa/p/MYSQL_learning_02.html

相关文章

  • pt-heatbeat 监控 mysql 主从延迟
    pt-heartbeat监控MySQL主从延迟mysql在进行主从同步时,从库需要拉取主库的binlog进行sql回放,因此理论上只要主库存在数据更新,就一定存在主从延迟。mysql提供了Sec......
  • 【MySQL】什么是子查询
    目录1.谁的工资比Abel的高?2.子查询的分类1.谁的工资比Abel的高?方式一:先查询Abel的工资,再查比Abel工资高的员工SELECTsalaryFROMemployeesWHERElast_name='Abel'......
  • Navicat,pymysql,SQL注入问题
    Navicat可视化软件什么是Navicat?pyton操作MySQLSQL注入问题小知识点补充Navicat可视化软件什么是Navicat?1.Navicat是一个可多重连接的数据库管理工......
  • sql连接问题
    EstablishingSSLconnectionwithoutserver'sidentityverificationisnotrecommended.AccordingtoMySQL5.5.45+,5.6.26+and5.7.6+requirementsSSLconnecti......
  • 【MySQL】SQL99版本新特性:自然连接、USING
    1.自然连接NATURALJOIN:它会帮你自动查询两张连接表中所有相同的字段,然后进行等值连接。不够灵活。SELECTemployee_id,last_name,department_nameFROMemployeese......
  • kepserverEX 5.11通过ODBC连接mysql提示"Failed to automatically generate tags for
    kepserverEX5.11连接mysql,测试连接数据库正常,但是建立设备后提示错误: DateTimeLevelSourceEvent2022-08-1818:24:12ErrorODBCClient......
  • 【MySQL】多表查询7种SQL JOIN的实现
    目录两个表关联有这7种情况1.内连接2.左外连接3.右外连接4.A-A∩B5.B-A∩B6.满外连接7.去除交集部分两个表关联有这7种情况1.内连接SELECTemployee_id,departmen......
  • pgsql存储函数简单使用
    CREATEORREPLACEFUNCTION"public"."generate_road_list_id_to_jcpddas"("road_code_param"varchar)RETURNS"pg_catalog"."int4"AS$BODY$declarereturnvalue......
  • 【MySQL】合并查询结果UNION
    1.UNION合并多条SELECT语句的查询结果,两个表对应的列数和数据类型必须相同,并且相互对应。会执行去重操作。2.UNIONALL不会执行去重操作如果明确知道合并数据后的结......
  • 【MySQL】多表查询:内连接VS外连接
    区别:内连接只取两张表中满足where条件的部分(交集部分),外连接除了取满足的部分还会取不满足的部分。因此外连接又可以分为:左外连接、右外连接、全外连接。1.内连接SQL92内......