首页 > 数据库 >SQL语句

SQL语句

时间:2023-03-10 18:22:31浏览次数:37  
标签:语句 列名 SQL 表名 table where alter select

一、DDL-数据定义语言
create / alter / drop
创库:create database 库名;
删库:drop database 库名;

创表:create table 表名;
删表:drop table 表名;
改表:alter table 表名 add(增加) |change/modify (修改) drop();
alter table 表名 add 列名 数据类型 约束;--为了让新增的列名不和关键字冲突,可以把列名用反引号括起来
alter table 表名 drop 列名;
alter table 表名 change 列名 列新名 数据类型;
alter table 表名 modify 列名 数据类型;
说明:change和modify的区别:modify不能修改字段名,也就是不能修改列名,只能用来修改字段的数据类型;change可以同时修改字段名和数据类型;

alter table 表名 modify 列名 数据类型 first;
alter table 表名 modify 列名 数据类型 after 另一列名;
==================================================================================
数据完整性约束
主键约束: primary key 唯一且不能为空 规定:在每一个表中有且仅有一列有主键约束,不能有多个
1:创表的时候设置主键约束
create table 表名(
列名 int primary key,
...
)
2:在已有的表上添加主键约束: alter table 表名 add constraint 约束名(可以取PK_字段名) primary key(字段名);
3:删除主键约束 alter table 表名 drop primary key;
唯一约束:
特点:不能重复,可以为空,可以添加多个
关键字:unique
#创表的时候添加
create table 表名(
列名 数据类型 unique,
...
)
#在已经有表的情况下添加:
alter table 表名 add contraint 约束名称 unique(字段名);
#删除唯一约束
alter table 表名 drop constraint 约束名称
主键自增:
特点:从1开始,每次自身加1,只能在创建表的时候添加这个约束,而且必须是主键才可以添加
关键字:auto_increment
create table 表名(
列名 int primary key auto_increment,
...
)
#删除主键自增约束
1:去除自增性 alter table 表名 modify 列名 数据类型;
2:删除主键约束 alter table 表名 drop 列名 primary key;
2:域完整性:--只能在创建表的时候添加
域完整性约束保证字段的数据准确性的
域完整性包括类型约束、非空约束、默认值
1)非空约束
特点:字段不允许为空
关键字:not null
2)默认值
特点:设置默认额值
关键字:default

3:引用完整性:
一张表中通用列的取值必须参考另外一张表的主键
引用完整性有外键约束
1)外键约束:
关键字:foreign key
添加外界约束语法:
alter table 表名1 add constraint 约束名(FK_列名) foreign key(列名) reference 另一张表名(列名);
删除外界约束语法:
alter table 表名1 drop foreign key 约束名;

======================================================

DML 操作是指对数据库中表记录的操作,主要包括表记录的插入(insert)、更新(update)、删除(delete)和查询(select),是开发人员日常使用最频繁的操作。下面将依次对它们进行介绍

一:插入

#不指定字段 --这里需要注意值的排列顺序需要和表的字段顺序一致

insert into 表名 vlues(值1,值2,...);

#指定字段

insert into 表名  (列1,列2,列3)values(值1,值2,值3);

#批量插入多行,将不同行的值用逗号隔开即可

insert into 表名  (列1,列2,列3)

values

(值1,值2,值3),

(值4,值5,值6);

#复制某表数据到另一张表---前提:这两张表的结构必须一致,

insert into 表名1 select * from 表名2;

注意下insert into...select 和select ..into区别:

insert into scorebak select * from socre where neza='neza'   --插入一行,要求表scorebak 必须存在
select *  into scorebak from score  where neza='neza'  --也是插入一行,要求表scorebak 不存在

 

二:删除

#删除某行数据

delete from 表名 where  列名=列值;

#如果不加where条件,会删除整张表的数据

delete from 表名;

---以下是删除整张表的几种方式和之间的区别

====delete和trancate、drop的区别=====

DROP TABLE 语句: DROP TABLE 语句用于删除表。DROP TABLE table_name

drop会把整张表的行数据和表结构都删除,且不可恢复

TRUNCATE TABLE 表名   

delete from table_name  where [conditions]

区别:

1:效果等价,都是删除表的行数据,但是truncate table的效率更高

原因:truncate速度快,而且效率高是因为使用的系统和事务日志资源少。delete语句每次删除一行,并在事务日志中为所删除的每行记录一项。truncate通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放

2:delete from 语句可以删除指定行,但是truncate table  只能删除整张表

3:delete删除可以恢复,truncate不可恢复

 

三:修改数据

update 表名 set 列名=列值 【where 某列名=某列值】;#where条件最好用的主键列,这样的话可以提高效率,且更准确--在优化表的效率的时候可以考虑的地方

 

四:查询数据

算数运算符:加减乘除、取模/余(%或者mod关键字)、取整(用div关键字)

比较运算符:返回结果都是布尔值0和1,分别表示false和true;     is null / is not null /  between ..and (包含边界的) /  in / not in 

逻辑运算符:and 、or、 !(取反)

语法:

select  字段|表达式  from 表名|视图|结果集

[where条件]  

#like模糊查询,和where子句结合使用

%:可以匹配0个或者多个长度的任意字符

_:  匹配一个字符

[group by 分组]

[having 分组之后进行检索]

[order by 排序]  :order by  列名   (ASC /DESC   升序 /降序)用于对结果集按照一个列或者多个列进行排序

[limit 限制结果] :用来查询想要的行数--limit m,n         m:开始的位置,索引从0开始,  n:取值的长度

 

#去重 select  distinct  列名  from  表名; 

#别名  select  列名  as  新列名  from  表名;

#ifnull(列名,0) 判断列值是否为null,如果是null,则赋值为0,用法如下:

select  列1,ifnull(列2,列n) 新列名  from 表名;

 

 

 

 

 

 

 

 ================

关联查询:连接查询,可分为:内连接,外连接、自连接

内连接:inner join ...  on   就是取交集进行连接

select 表1某列名,表2某列名 from 表1 inner join 表2

on 表1.某列=表2.对应列;

+----+--------------+---------------------------+-------+---------+
| id | name         | url                       | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1  | Google       | https://www.google.cm/    | 1     | USA     |
| 2  | 淘宝          | https://www.taobao.com/   | 13    | CN      |
| 3  | 菜鸟教程      | http://www.runoob.com/    | 4689  | CN      |
| 4  | 微博          | http://weibo.com/         | 20    | CN      |
| 5  | Facebook     | https://www.facebook.com/ | 3     | USA     |
| 7  | stackoverflow | http://stackoverflow.com/ |   0 | IND     |
+----+---------------+---------------------------+-------+---------+


mysql> SELECT * FROM access_log;
+-----+---------+-------+------------+
| aid | site_id | count | date       |
+-----+---------+-------+------------+
|   1 |       1 |    45 | 2016-05-10 |
|   2 |       3 |   100 | 2016-05-13 |
|   3 |       1 |   230 | 2016-05-14 |
|   4 |       2 |    10 | 2016-05-14 |
|   5 |       5 |   205 | 2016-05-14 |
|   6 |       4 |    13 | 2016-05-15 |
|   7 |       3 |   220 | 2016-05-15 |
|   8 |       5 |   545 | 2016-05-16 |
|   9 |       3 |   201 | 2016-05-17 |
+-----+---------+-------+------------+
9 rows in set (0.00 sec)

请注意,"Websites" 表中的 "id" 列指向 "access_log" 表中的字段 "site_id"。上面这两个表是通过 "site_id" 列联系起来的。

然后,如果我们运行下面的 SQL 语句(包含 INNER JOIN):

SELECT Websites.id, Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id;

执行以上 SQL 输出结果如下:

     

外连接:左外连接:left join...on   遍历主表每一条记录去跟从表进行匹配,匹配的话拼接在一起,从表没有匹配项则用NULL填充进结果集中

select * from 主表 left join 从表 on 主表.某列=从表.对应列   ---left左边是主表,右边是从表

  右外连接类似。

 

 

自连接:比较特殊的内连接,将一张表当成是两张表来使用,需要给表分别取一个别名

 

select  * from 表名 as 别名1 left join 表名 as 别名2 on 别名1.列名=别名2.另一个列名;

不同的 SQL JOIN

在我们继续讲解实例之前,我们先列出您可以使用的不同的 SQL JOIN 类型:

  • INNER JOIN:如果表中有至少一个匹配,则返回行
  • LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
  • RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
  • FULL JOIN:只要其中一个表中存在匹配,则返回行

 

 

=========

子查询:其实是作为另一个查询语句的条件使用

#单行子查询  :某列名=(查询语句)

#多行子查询:某列名 in (查询语句)

 

============

高级查询:

1:函数:已经定义好的,可以实现一定功能的代码块

  日期函数、数字函数、字符函数、聚合函数

  聚合函数:--一般跟分组函数一起使用group by 

    min():select min(列名)   from  表名  [where子句];

    max():select  max(列名)  from  表名  [where 子句];

    avg():select  avg(列名)   from  表名  [where 子句];

    count():select  count(列 名)  from   表名  [where 子句];--统计的是字段的非空值的数量

    sum():select  sum(列名)  from   表名  [where 子句];

  日期函数:

    month() :获取指定日期的月份值

    year():获取年份值

    day():获取日值

==========

分组查询:group by  ..having   :分组之后进行检索

#求每个部门的平均工资

1:按照部门的编号就行分组:注意:分组之后,select 后面并不是所有的字段都可以接的,select后面要接的字段一定要和要分组的字段有一一对应的关系  ---分组:会把重复的值去掉,只会保留一个

 

使用举例:select depno,avg(sal)  from emp  group by depno having avg(sal) >2000;

 

--where :条件筛选,where后面不可以接聚合函数;单独使用

 

--having :可以接聚合函数;必须搭配group by 使用

 

标签:语句,列名,SQL,表名,table,where,alter,select
From: https://www.cnblogs.com/ghs-nnzl/p/17005699.html

相关文章

  • 使用PostgreSQL而不是MySQL存储中型数据有什么好处?
    我可以明确地回答.我们之所以选择Postgres,是因为它在操作上比MySQL更可靠,而当时公司的创始人相信SQL数据库的可移植性.随着年份的发展,我们发现了这一点,我们发现基本上,Post......
  • 【WinForm】 自学笔记三:使用 FreeSql 连接数据库,并对数据进行增删改查
    前面使用 SqlConnection 连接数据可以的方法,每一次进行数据操作都要编写相应的SQL语句,操作起来比较繁琐。为了简化代码的编写,提高代码的可靠性,使用了FreeSql插件,来减......
  • 通过 sqlcmd 命令 + Windows 定时任务实现数据库的定时备份
    SQLServer2022Developer是一个全功能免费版本,许可在非生产环境下用作开发和测试数据库。公司用的SQLServer2022Express是SQLServer的一个免费版本,只有基础的......
  • python+ddt+pymsql实现数据驱动自动化测试
    程序结构:   1,首先连接数据库(mysql.py)并获取到数据库里面的数据importpymysql#创建链接数据库的方法deflianSql(host,user,password,database):""......
  • SQL注入之SQLMap
    SQL注入之SQLMap目录SQL注入之SQLMap一、SQLMap介绍1、Sqlmap简介:2、Sqlmap支持的注入方式:二、SQLMap的使用1.判断是否存在注入点2.SQLMap的命令:三、SQLMap的POST型注入1.......
  • SQLAlchemy
    SQLAlchemy是Python著名的ORM工具包。通过ORM,开发者可以用面向对象的方式来操作数据库,不再需要编写SQL语句。本篇不解释为什么要使用ORM,主要讲解SQLAlchemy的用......
  • WEB安全基础(二)SQL注入
    information_schema即信息数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。SQL注入的分类1.按......
  • LVS+keepalived+nginx+redis+mysql集群负载
    背景:梳理知识体系,关于架构,有做过一个项目,是关于双机热备高可用的方案。两台机器相对独立,两套一模一样且独立运行的系统,客户要求实现高可用。经过和架构部的商讨,通过lvs+ke......
  • SQLServer2016 AlwaysOn数据库重新加入可用性组
    SQLServer2016AlwaysOn架构,主副本SQLServer服务重启  SQLServer主副本SQLServer重启服务之后,AlwaysOn......
  • SQL Server中的merge into语句
    mergeinto语句是用来合并两张表的数据的,比如我们想把一张表的数据批量更新到另外一张表,就可以用mergeinto语句。具体有哪些业务场景呢?1.数据同步2.数据转换3.基于......