sql语句 订阅
结构化查询语言(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;sql 语句就是对数据库进行操作的一种语言。 展开全文
结构化查询语言(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;sql 语句就是对数据库进行操作的一种语言。
信息
插    入
insert into table1(field1,
接插入
field2) values(value1,value2)
删    除
delete from table1 where 范围
选    择
select * from table1 where范围
中文名
结构化查询语言
总    数
select count(*) as totalcount
外文名
Structured Query Language
接总数
from table1
sql语句程序功能
创建数据库CREATE DATABASE database-name删除数据库drop database dbname创建新表create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)删除新表drop table tabname增加一个列Alter table tabname add column col type添加主键Alter table tabname add primary key(col)删除主键Alter table tabname drop primary key(col)创建索引create [unique] index idxname on tabname(col….)删除索引drop index idxname创建视图create view viewname as select statement删除视图drop view viewname
收起全文
精华内容
下载资源
问答
  • sql语句
    万次阅读 多人点赞
    2020-06-11 17:23:49

    在写SQL时,经常灵活运用一些SQL语句编写的技巧,可以大大简化程序逻辑。减少程序与数据库的交互次数,有利于数据库高可用性,同时也能显得你的SQL很牛B,让同事们眼前一亮。

    小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这里

    目录

    实用的SQL

    1.插入或替换

    2.插入或更新

    3.插入或忽略

    4.SQL中的if-else判断语句

    5.指定数据快照或备份

    6.写入查询结果集

    7.强制使用指定索引

    心得体会:

    (续)评论区问题反馈

    @当年经理的SQL

    @修改后最终版SQL

    @最终版SQL原理


    高能预警,这是一篇干货满满的MySQL技术文章,总有一天,你必然会用到,记得收藏! -- 来自一位被技术经理毒打多年的程序员的忠告

    实用的SQL

    1.插入或替换

    如果我们想插入一条新记录(INSERT),但如果记录已经存在,就先删除原记录,再插入新记录。

    • 情景示例:这张表存的每个客户最近一次交易订单信息,要求保证单个用户数据不重复录入,且执行效率最高,与数据库交互最少,支撑数据库的高可用。

    此时,可以使用"REPLACE INTO"语句,这样就不必先查询,再决定是否先删除再插入。

    "REPLACE INTO"语句是基于唯一索引或主键来判断唯一(是否存在)的。
    "REPLACE INTO"语句是基于唯一索引或主键来判断唯一(是否存在)的。
    "REPLACE INTO"语句是基于唯一索引或主键来判断唯一(是否存在)的。

    注意事项:如下SQL所示,需要在username字段上建立唯一索引(Unique),transId设置自增即可。

    -- 20点充值
    REPLACE INTO last_transaction (transId,username,amount,trans_time,remark) 
       VALUES (null, 'chenhaha', 30, '2020-06-11 20:00:20', '会员充值');
    
    -- 21点买皮肤
    REPLACE INTO last_transaction (transId,username,amount,trans_time,remark) 
       VALUES (null, 'chenhaha', 100, '2020-06-11 21:00:00', '购买盲僧至高之拳皮肤');


    若username='chenhaha'的记录不存在,REPLACE语句将插入新记录(首次充值),否则,当前username='chenhaha'的记录将被删除,然后再插入新记录。

    id不要给具体值,不然会影响SQL执行,业务有特殊需求除外。

    2.插入或更新

    如果我们希望插入一条新记录(INSERT),但如果记录已经存在,就更新该记录,此时,可以使用"INSERT INTO ... ON DUPLICATE KEY UPDATE ..."语句:

    • 情景示例:这张表存了用户历史充值金额,如果第一次充值就新增一条数据,如果该用户充值过就累加历史充值金额,需要保证单个用户数据不重复录入。

    这时可以使用"INSERT INTO ... ON DUPLICATE KEY UPDATE ..."语句。

    注意事项:同上,"INSERT INTO ... ON DUPLICATE KEY UPDATE ..."语句是基于唯一索引或主键来判断唯一(是否存在)的。如下SQL所示,需要在username字段上建立唯一索引(Unique),transId设置自增即可。

    -- 用户陈哈哈充值了30元买会员
    INSERT INTO total_transaction (t_transId,username,total_amount,last_transTime,last_remark) 
       VALUES (null, 'chenhaha', 30, '2020-06-11 20:00:20', '充会员') 
       ON DUPLICATE KEY UPDATE  total_amount=total_amount + 30, last_transTime='2020-06-11 20:00:20', last_remark ='充会员';
    
    -- 用户陈哈哈充值了100元买瞎子至高之拳皮肤
    INSERT INTO total_transaction (t_transId,username,total_amount,last_transTime,last_remark) 
       VALUES (null, 'chenhaha', 100, '2020-06-11 20:00:20', '购买盲僧至高之拳皮肤') 
       ON DUPLICATE KEY UPDATE total_amount=total_amount + 100, last_transTime='2020-06-11 21:00:00', last_remark ='购买盲僧至高之拳皮肤';

    若username='chenhaha'的记录不存在,INSERT语句将插入新记录,否则,当前username='chenhaha'的记录将被更新,更新的字段由UPDATE指定。

    3.插入或忽略

    如果我们希望插入一条新记录(INSERT),但如果记录已经存在,就啥事也不干直接忽略,此时,可以使用INSERT IGNORE INTO ...语句:情景很多,不再举例赘述。

    注意事项:同上,"INSERT IGNORE INTO ..."语句是基于唯一索引或主键来判断唯一(是否存在)的,需要在username字段上建立唯一索引(Unique),transId设置自增即可。

    -- 用户首次添加
    INSERT IGNORE INTO users_info (id, username, sex, age ,balance, create_time) 
       VALUES (null, 'chenhaha', '男', 12, 0, '2020-06-11 20:00:20');
    
    -- 二次添加,直接忽略
    INSERT IGNORE INTO users_info (id, username, sex, age ,balance, create_time) 
       VALUES (null, 'chenhaha', '男', 12, 0, '2020-06-11 21:00:20');


    若username='chenhaha'的记录不存在,INSERT语句将插入新记录,否则,不执行任何操作。

    4.SQL中的if-else判断语句

    众所周知,if-else判断在任何地方都很有用,在SQL语句中,"CASE WHEN ... THEN ... ELSE ... END"语句可以用在增删改查各类语句中。

    • 给个情景:妇女节大回馈,2020年注册的新用户,所有成年女性账号送10元红包,其他用户送5元红包,自动充值。

    示例语句如下:

    -- 送红包语句
    UPDATE users_info u 
        SET u.balance = CASE WHEN u.sex ='女' and u.age > 18 THEN u.balance + 10 
                             ELSE u.balance + 5 end 
                             WHERE u.create_time >= '2020-01-01'
    • 情景2:有个学生高考分数表,需要将等级列出来,650分以上是重点大学,600-650是一本,500-600分是二本,400-500是三本,400以下大专;

    原测试数据如下:


    查询语句:

    SELECT *,case when total_score >= 650  THEN '重点大学' 
                  when total_score >= 600 and total_score <650 THEN '一本'
                  when total_score >= 500 and total_score <600 THEN '二本'
                  when total_score >= 400 and total_score <500 THEN '三本'        
                  else '大专' end as status_student 
                  from student_score;

    5.指定数据快照或备份

    如果想要对一个表进行快照,即复制一份当前表的数据到一个新表,可以结合CREATE TABLE和SELECT:

    -- 对class_id=1(一班)的记录进行快照,并存储为新表students_of_class1:
    CREATE TABLE students_of_class1 SELECT * FROM student WHERE class_id=1;

    新创建的表结构和SELECT使用的表结构完全一致。

    6.写入查询结果集

    如果查询结果集需要写入到表中,可以结合INSERT和SELECT,将SELECT语句的结果集直接插入到指定表中。

    例如,创建一个统计成绩的表statistics,记录各班的平均成绩:

    CREATE TABLE statistics (
        id BIGINT NOT NULL AUTO_INCREMENT,
        class_id BIGINT NOT NULL,
        average DOUBLE NOT NULL,
        PRIMARY KEY (id)
    );

    然后,我们就可以用一条语句写入各班的平均成绩:

    INSERT INTO statistics (class_id, average) SELECT class_id, AVG(score) FROM students GROUP BY class_id;


    确保INSERT语句的列和SELECT语句的列能一一对应,就可以在statistics表中直接保存查询的结果:

    SELECT * FROM statistics;
    +----+----------+--------------+
    | id | class_id | average      |
    +----+----------+--------------+
    |  1 |        1 |        475.5 |
    |  2 |        2 | 473.33333333 |
    |  3 |        3 | 488.66666666 |
    +----+----------+--------------+
    3 rows in set (0.00 sec)


    7.强制使用指定索引

    在查询的时候,数据库系统会自动分析查询语句,并选择一个最合适的索引。但是很多时候,数据库系统的查询优化器并不一定总是能使用最优索引。如果我们知道如何选择索引,可以使用FORCE INDEX强制查询使用指定的索引。例如:

    SELECT * FROM students FORCE INDEX (idx_class_id) WHERE class_id = 1 ORDER BY id DESC;

    指定索引的前提是索引idx_class_id必须存在。
     

    心得体会:

           记得那一年,我还是个孩子,记得第一个需求是做个统计接口,查询近两小时每隔5分钟为一时间段的网站访问量,JSONArray中一共返回24个值,当时菜啊,写了个接口循环二十四遍,发送24条SQL去查(捂脸),由于那个接口,被技术经理嘲讽~~表示他写的SQL比我吃的米都多。虽然我们山东人基本不吃米饭,但我还是羞愧不已。。

           然后经理通过调用一个dateTime函数分组查询处理一下,就ok了,效率是我的几十倍吧。从那时起,我就定下目标,深入MySQL学习,日后争取嘲讽回去~~~

           筒子们,MySQL路漫漫,其修远兮。永远不要眼高手低,一起加油,希望本文能对你有所帮助。

     

    ------------------------------------------------------------- 华丽的分割线 ---------------------------------------------------------

     

    (续)评论区问题反馈

            这一周有好几个朋友在评论区评论或私信我,问我当年那条SQL是咋写的,经理是咋写的。。看大家对知识的热情这么高,我必须得开源一下了,在这贴出来当时的SQL。有个点声明,项目数据库在内网不好测试,我就模拟了一张表来给大家统计一下吧。

            需求回顾:时间就'2020-01-14 00:00:00' - '2020-01-15 00:00:00' 为准,统计当天以每10分钟为间隔的分组数据。

    @当年经理的SQL

    其中时间根据需求自行修改,由于我只生成了一天的测试数据,我就以此为例。

    SELECT DATE_FORMAT(p.createTime, '%H') as date_str,count(*) as count 
        from data_timing p
    	where DATE_FORMAT(p.createTime, '%Y-%m-%d %H:%i:%S') >= DATE_FORMAT('2020-01-14 00:00:00', '%Y-%m-%d %H:%i:%S')
    	    AND DATE_FORMAT(p.createTime, '%Y-%m-%d %H:%i:%S') < DATE_FORMAT('2020-01-15 00:00:00', '%Y-%m-%d %H:%i:%S')
    		GROUP BY HOUR(p.createTime)

    经理这条SQL查询的结果如下,基本保留了当年原版~~这条的意思是取“2020-01-14”这天24小时每小时的count。当时我很有启发,也很有感觉,发现SQL还能这么玩儿。完事儿写完他说就要撤了,说要去接孩子。我说:“大佬,咱别吃饭吃一半儿啊,再给我来一下子呗”。

    @修改后最终版SQL

    然后经过我后续修改SQL如下:

    SELECT concat( date_format( p.createTime, '%Y-%m-%d %H:' ) , floor( date_format( p.createTime, '%i' ) /10 )*10 ) as date_str
    , count(*) as count from data_timing p
        where DATE_FORMAT(p.createTime, '%Y-%m-%d %H:%i:%S') < DATE_FORMAT('2020-01-15 00:00:00', '%Y-%m-%d %H:%i:%S')
            AND DATE_FORMAT(p.createTime, '%Y-%m-%d %H:%i:%S') >= DATE_FORMAT('2020-01-14 00:00:00', '%Y-%m-%d %H:%i:%S')
            GROUP BY  concat( date_format( p.createTime, '%Y-%m-%d %H:' ) , floor( date_format( p.createTime, '%i' ) /10 ))
    

    乍一看是不是还挺复杂,并不是多复杂,只是其中几个函数内容比较多。。比如concat()里的那一堆,以及date_format那些。先看结果吧。后面跟各位说一下查询原理:

    @最终版SQL原理

    如上所述,是每隔10分钟为一个时间段,当时只能想到了以每分钟为时间段分组的SQL,如下。

    SELECT concat( date_format( p.createTime, '%Y-%m-%d %H:' ) , floor( date_format( p.createTime, '%i' ) )) as date_str
    , count(*) as count from data_timing p
    		where DATE_FORMAT(p.createTime, '%Y-%m-%d %H:%i:%S') < DATE_FORMAT('2020-01-15 00:00:00', '%Y-%m-%d %H:%i:%S')
    		AND DATE_FORMAT(p.createTime, '%Y-%m-%d %H:%i:%S') >= DATE_FORMAT('2020-01-14 00:00:00', '%Y-%m-%d %H:%i:%S')
    		GROUP BY MINUTE(p.createTime)

    查询结果:

    那我怎么以10分钟为单位呢??网上各种查,网上虚的太多。也没有找到真正有用的写法,这不是坑爹吗,后来我想了想。想到了个好主意,每10分钟的特征在于“yyyy-MM-dd HH:m”这里,如果我将“10分钟”级为单位的字符串切分出来,不管“1分钟”级的。不就能分组匹配了么,哎呀我tm真是有点佩服我自己。

    因此,按每分钟分组的SQL和上面按10分钟分组的SQL不同之处就在这里:

    group by concat( date_format( p.createTime, '%Y-%m-%d %H:' ) , floor( date_format( p.createTime, '%i' ) /10 ) )

    我将分钟'%i'除以10然后向下取整,再进行group by 分组,最后展示的时候我可以在处理一下加“ *10 ”用于展示,当然,也可以不用“*10 ”,结果如下,有点畸形,看着难受,但不妨碍使用。

     

    好了,答应各位的已经搞定啦。有细心的小伙伴会发现,咦,你这数据中,如果没查到为0的怎么不显示呢?比如凌晨1点多的,都没有显示。这样岂不是还得后台处理补全?这个问题留给大家,如果有好的方法可以在评论区留言,我会随时关注老铁们的动态的~~

     

    更多相关内容
  • Oracle Sql语句转换成Mysql Sql语句

    热门讨论 2013-02-17 12:06:40
    Oracle Sql语句转换成Mysql Sql语句java 源码,非常简单,只要给定源oracle sql语句地址,和生成目标文件地址运行即可。
  • sql语句格式化工具(绿色版)

    千次下载 热门讨论 2014-04-03 11:35:01
    有时候在项目中需要将sql语句格式化一下,这样sql语句会更有层次。阅读也会更好一些。这个工具就能帮到你。
  • 在项目开发的过程中难免需要打印一下自己拼写的SQL语句,尤其是很长的SQL语句,看起来很不舒服,使用该jar包,打印出来的SQL语句已经被格式化,结构很清晰、简洁,更方便我们调试及分析
  • sql语句中case_SQL中的CASE语句

    千次阅读 2020-07-27 01:00:58
    sql语句中case The case statement in SQL returns a value on a specified condition. We can use a Case statement in select queries along with Where, Order By and Group By clause. It can be used in ...

    sql语句中case

    The case statement in SQL returns a value on a specified condition. We can use a Case statement in select queries along with Where, Order By and Group By clause. It can be used in Insert statement as well. In this article, we would explore CASE statement and its various use cases.

    SQL中的case语句返回指定条件下的值。 我们可以在选择查询中使用Case语句以及Where,Order By和Group By子句。 也可以在Insert语句中使用它。 在本文中,我们将探讨CASE语句及其各种用例。

    Suppose you have a table that stores the ProductID for all products in a mini-store. You want to get Productname for a particular ProductID.

    假设您有一个表,该表在迷你商店中存储所有产品的ProductID。 您想要获取特定ProductID的Productname。

    Look at the following example; We declared a variable @ProductID and specified value 1 for it. In Case statement, we defined conditions. Once a condition is satisfied, its corresponding value is returned.

    看下面的例子; 我们声明了一个变量@ProductID并为其指定了值1。 在案例陈述中,我们定义了条件。 一旦满足条件,将返回其对应的值。

    SQL Case Statement

    Similarly, if we change the condition in a Case statement in SQL, it returns appropriate expression. In the following example, we want to get Product name for ProductID 4.it does not satisfy Case statement condition; therefore, it gave output from Else expression.

    同样,如果我们在SQL中的Case语句中更改条件,则它将返回适当的表达式。 在下面的示例中,我们想要获取ProductID 4的产品名称。它不满足Case语句条件; 因此,它给出了Else表达式的输出。

    SQL Case Statement

    Let us explore a few examples of the Case statement in SQL. Before we proceed, create a sample table and insert few records in it.

    让我们探讨一下SQL中Case语句的一些示例。 在继续之前,创建一个示例表并在其中插入一些记录。

    USE [SQLShackDemo]
    GO
    CREATE TABLE dbo.Employee 
    ( 
    EmployeeID INT IDENTITY PRIMARY KEY, 
    EmployeeName VARCHAR(100) NOT NULL, 
    Gender VARCHAR(1) NOT NULL, 
    StateCode VARCHAR(20) NOT NULL, 
    Salary money NOT NULL,
    ) 
    GO
    USE [SQLShackDemo]
    GO
    SET IDENTITY_INSERT [dbo].[Employee] ON 
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (201, N'Jerome', N'M', N'FL', 83000.0000)
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (202, N'Ray', N'M', N'AL', 88000.0000)
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (203, N'Stella', N'F', N'AL', 76000.0000)
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (204, N'Gilbert', N'M', N'Ar', 42000.0000)
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (205, N'Edward', N'M', N'FL', 93000.0000)
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (206, N'Ernest', N'F', N'Al', 64000.0000)
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (207, N'Jorge', N'F', N'IN', 75000.0000)
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (208, N'Nicholas', N'F', N'Ge', 71000.0000)
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (209, N'Lawrence', N'M', N'IN', 95000.0000)
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (210, N'Salvador', N'M', N'Co', 75000.0000)
    GO
    SET IDENTITY_INSERT [dbo].[Employee] OFF
    GO
    

    We have following records in Employee table.

    我们在Employee表中有以下记录。

    Demo Table

    不同格式的CASE语句 (Different Formats of CASE Statements )

    一个简单的CASE语句表达式 (A simple CASE statement expression)

    In this format, we evaluate one expression against multiple values. In a simple case statement, it evaluates conditions one by one. Once the condition and expression are matched, it returns the expression mentioned in THEN clause.

    以这种格式,我们针对多个值评估一个表达式。 在一个简单的案例陈述中,它会逐一评估条件。 一旦条件和表达式匹配,它将返回THEN子句中提到的表达式。

    We have following syntax for a case statement in SQL with a simple expression

    对于带有简单表达式SQL中的case语句,我们具有以下语法

    SELECT CASE Expression
    When expression1 Then Result1
    When expression2 Then Result2
    ...
    ELSE Result
    END
    

    Usually, we store abbreviations in a table instead of its full form. For example, in my Employee table, I have used abbreviations in Gender and StateCode. I want to use a Case statement to return values as Male and Female in the output instead of M and F.

    通常,我们将缩写存储在表格中而不是完整形式中。 例如,在我的Employee表中,我在Gender和StateCode中使用了缩写。 我想使用Case语句在输出中返回值MaleFemale而不是MF。

    Execute the following code and notice that we want to evaluate CASE Gender in this query.

    执行以下代码,并注意我们要在此查询中评估CASE Gender

    In the following image, you can notice a difference in output using a Case statement in SQL.

    在下图中,您可以注意到在SQL中使用Case语句的输出有所不同。

    SQL Case Statement example

    CASE语句和比较运算符 (The CASE statement and comparison operator)

    In this format of a CASE statement in SQL, we can evaluate a condition using comparison operators. Once this condition is satisfied, we get an expression from corresponding THEN in the output.

    以这种SQL中CASE语句的格式,我们可以使用比较运算符评估条件。 一旦满足此条件,我们将从输出中的相应THEN中获得一个表达式。

    We can see the following syntax for Case statement with a comparison operator.

    我们可以看到带有比较运算符的Case语句的以下语法。

    CASE
        WHEN ComparsionCondition THEN result
        WHEN ComparsionCondition THEN result
        ELSE other
     END
    

    Suppose we have a salary band for each designation. If employee salary is in between a particular range, we want to get designation using a Case statement.

    假设每个职位都有一个薪水范围。 如果员工薪水在特定范围内,我们希望使用Case语句来指定。

    In the following query, we are using a comparison operator and evaluate an expression.

    在以下查询中,我们使用比较运算符并评估表达式。

    Select EmployeeName,
     CASE
    WHEN Salary >=80000 AND Salary <=100000 THEN 'Director'
    WHEN Salary >=50000 AND Salary <80000 THEN 'Senior Consultant'
    Else 'Director'
    END AS Designation
    from Employee
    

    In the following image you can see, we get designation as per condition specified in CASE statement.

    在下图中,您可以根据CASE语句中指定的条件获得名称。

    SQL Case Statement example

    带子句的案例陈述 (Case Statement with Order by clause)

    We can use Case statement with order by clause as well. In SQL, we use Order By clause to sort results in ascending or descending order.

    我们也可以将Case语句与order by子句一起使用。 在SQL中,我们使用Order By子句对结果进行升序或降序排序。

    Suppose in a further example; we want to sort result in the following method.

    再假设一个例子。 我们想用以下方法对结果进行排序。

    1. For Female employee, employee salaries should come in descending order

      对于女员工,员工工资应按降序排列
    2. For Male employee, we should get employee salaries in ascending order

      对于男性员工,我们应该按升序获得员工薪水

    We can define this condition with a combination of Order by and Case statement. In the following query, you can see we specified Order By and Case together. We defined sort conditions in case expression.

    我们可以使用Order by和Case语句的组合来定义此条件。 在以下查询中,您可以看到我们同时指定了Order By和Case。 我们在case表达式中定义了排序条件。

    Select EmployeeName,Gender,Salary
     from Employee
     ORDER BY  CASE Gender
    WHEN 'F' THEN Salary End DESC,
    Case WHEN Gender='M' THEN Salary  
    END
    

    In the output, we have satisfied our sort requirement in ascending or descending order

    在输出中,我们满足了升序或降序的排序要求

    • For Female employee, salary is appearing in descending order

      对于女雇员,薪水以降序显示

    SQL Case Statement in Order By clause
    • For Male employee, salary is appearing in ascending order

      对于男性员工,薪水以升序显示

    SQL Case Statement in Order By clause

    带Group by子句SQL中的Case语句 (Case Statement in SQL with Group by clause)

    We can use a Case statement with Group By clause as well. Suppose we want to group employees based on their salary. We further want to calculate the minimum and maximum salary for a particular range of employees.

    我们也可以将Case语句与Group By子句一起使用。 假设我们要根据员工的薪水进行分组。 我们还想计算特定范围员工的最低和最高薪水。

    In the following query, you can see that we have Group By clause and it contains i with the condition to get the required output.

    在下面的查询中,您可以看到我们有Group By子句,它包含带有条件的i以获得所需的输出。

    Select 
     CASE
    WHEN Salary >=80000 AND Salary <=100000 THEN 'Director'
    WHEN Salary >=50000 AND Salary <80000 THEN 'Senior Consultant'
    Else 'Director'
    END AS Designation,
    Min(salary) as MinimumSalary,
    Max(Salary) as MaximumSalary
    from Employee
    Group By
    CASE
    WHEN Salary >=80000 AND Salary <=100000 THEN 'Director'
    WHEN Salary >=50000 AND Salary <80000 THEN 'Senior Consultant'
    Else 'Director'
    END
    

    We have following output of this query. In this output, we get minimum and maximum salary for a particular designation.

    我们有此查询的以下输出。 在此输出中,我们获得特定指定的最低和最高薪水。

    SQL Case Statement in Group By clause

    用CASE语句更新语句 (Update statement with a CASE statement)

    We can use a Case statement in SQL with update DML as well. Suppose we want to update Statecode of employees based on Case statement conditions.

    我们也可以在带有更新DMLSQL中使用Case语句。 假设我们要根据Case语句条件更新员工的Statecode

    In the following code, we are updating statecode with the following condition.

    在以下代码中,我们将使用以下条件更新状态码。

    • AR, then update to AR,则更新为FL FL
    • GE, then update toGE,则更新为 AL AL
    • For all other statecodes update value to IN

      对于所有其他状态码,将值更新为IN

    Execute the following update command to fulfil our requirement using a Case statement.

    使用Case语句执行以下update命令来满足我们的要求。

    UPDATE employee 
    SET StateCode  = CASE StateCode
     WHEN 'Ar' THEN 'FL' 
     WHEN 'GE' THEN 'AL' 
      ELSE  'IN' 
     END
    

    In the following output, you can see old Statcode (left-hand side) and updated Statecode for the employees based on our conditions in the Case statement.

    在以下输出中,您可以在Case语句中根据我们的条件查看雇员的旧Statcode(左侧)和更新的Statecode。

    SQL Case Statement in Update statement

    带CASE语句的插入语句 (Insert statement with CASE statement)

    We can insert data into SQL tables as well with the help of Case statement in SQL. Suppose we have an application that inserts data into Employees table. We get the following values for gender.

    我们也可以借助SQL中的Case语句将数据插入SQL表中。 假设我们有一个将数据插入到Employees表中的应用程序。 我们得到以下性别值。

    Value

    Description

    Required value in Employee table

    0

    Male Employee

    M

    1

    Female Employee

    F

    描述

    员工表中的必需值

    0

    男员工

    中号

    1个

    女员工

    F

    We do not want to insert value 0 and 1 for Male and Female employees. We need to insert the required values M and F for employee gender.

    我们不想为男性和女性员工插入值0和1。 我们需要为员工性别插入所需的值M和F。

    In the following query, we specified variables to store column values. In the insert statement, you can we are using a Case statement to define corresponding value to insert in the employee table. In the Case statement, it checks for the required values and inserts values from THEN expression in the table.

    在以下查询中,我们指定了用于存储列值的变量。 在insert语句中,您可以使用Case语句定义要插入到employee表中的相应值。 在Case语句中,它将检查所需的值,并将THEN表达式中的值插入表中。

    Declare @EmployeeName varchar(100)
    Declare @Gender int
    Declare @Statecode char(2)
    Declare @salary money
    Set @EmployeeName='Raj'
    Set @Gender=0
    Set @Statecode='FL'
    set @salary=52000
     
    Insert into employee
    values 
    (@EmployeeName,
    CASE @Gender
    WHEN 0 THEN 'M'
    WHEN 1 THEN 'F'
    end,
    @Statecode,
    @salary)
    

    In the following screenshot, we can see newly inserted row contains Gender M instead of value 0.

    在以下屏幕截图中,我们可以看到新插入的行包含Gender M而不是值0。

    SQL Case Statement in Insert clause

    案例陈述限制 (Case Statement limitations)

    • We cannot control the execution flow of stored procedures, functions using a Case statement in SQL

      我们无法使用SQL中的Case语句来控制存储过程,函数的执行流程
    • We can have multiple conditions in Case statement; however, it works in a sequential model. If one condition is satisfied, it stops checking further conditions

      Case语句中可以有多个条件; 但是,它可以在顺序模型中工作。 如果满足一个条件,它将停止检查其他条件
    • We cannot use a Case statement for checking NULL values in a table

      我们不能使用Case语句检查表中的NULL值

    结论 (Conclusion)

    The Case statement in SQL provides flexibility in writing t-SQL for DDL and DML queries. It also adds versatility to SQL Server queries. You should practice Case statement in your queries.

    SQL中的Case语句为编写DDL和DML查询的t-SQL提供了灵活性。 它还为SQL Server查询增加了多功能性。 您应该在查询中练习案例陈述。

    翻译自: https://www.sqlshack.com/case-statement-in-sql/

    sql语句中case

    展开全文
  • SQL语句中JOIN的用法

    万次阅读 2021-07-20 21:07:19
    探究一下SQL语句中JOIN的用法,直到经历这个场景,变得想验证一下究竟。 一、场景 把关系型数据库A中表TEST_TB01和TEST_TB02迁移到大数据平台M(MaxCompute大数据平台)。TEST_TB01单表1000万条记录,TEST_TB02...

    记录:257

    写SQL最高境界:SELECT * FROM 表名。当然这是一句自嘲。探究一下SQL语句中JOIN的用法,直到经历这个场景,变得想验证一下究竟。

    一、场景

    把关系型数据库A中表TEST_TB01和TEST_TB02迁移到大数据平台M(MaxCompute大数据平台)。TEST_TB01单表1000万条记录,TEST_TB02单表80万条记录。

    在关系型数据库中,TEST_TB01和TEST_TB02中有主键约束。在产生新增业务数据时,不会存在重复数据插入。但是,当数据迁移到大数据平台后,由于在大数据平台中无主键约束功能。在产生新增业务数据时,TEST_TB01和TEST_TB02均均插入了重复数据。

    在一个计算任务中,TEST_TB01和TEST_TB02根据某个字段JOIN连接,计算出了一份结果数据,数据推送到使用方的关系型数据库C。直接导致了C数据库的对应表的表空间撑爆,监控预警。

    原因:TEST_TB01和TEST_TB02有重复数据,使用JOIN连接后,生成了10亿+条数据,共计200G+数据,直接推送到C数据库。

    那次考虑不周,瞬间懵了,感觉SQL语句中的JOIN变得陌生极了。于是想探究一下以作记录。

    二、建表

    TEST_TB01建表语句:

    create table TEST_TB01
    (
      sensor_id   BIGINT,
      part_id     BIGINT
     )
    COMMENT '数据表一';

    TEST_TB02建表语句:

    create table TEST_TB02
    (
      part_id    BIGINT,
      elem_id    BIGINT
     )
     COMMENT '数据表二';

    三、SQL语句中使用JOIN无重复数据情况

    在SQL语句中使用JOIN无重复数据情况,即在TEST_TB01和TEST_TB02表中均无重复数据情况。分别使用JOIN、INNER JOIN、LEFT JOIN、LEFT OUTER JOIN、RIGHT JOIN、FULL JOIN验证。

    在TEST_TB01插入数据:

    insert into TEST_TB01 (sensor_id,part_id) values(2101,9911);
    insert into TEST_TB01 (sensor_id,part_id) values(2102,9912);
    insert into TEST_TB01 (sensor_id,part_id) values(2103,9913);
    insert into TEST_TB01 (sensor_id,part_id) values(2104,9914);
    insert into TEST_TB01 (sensor_id,part_id) values(2105,9915);

    在TEST_TB02插入数据:

    insert into TEST_TB02 (part_id,elem_id) values(9911,8901);
    insert into TEST_TB02 (part_id,elem_id) values(9912,8902);
    insert into TEST_TB02 (part_id,elem_id) values(9913,8903);
    insert into TEST_TB02 (part_id,elem_id) values(9916,8906);

    查看TEST_TB01数据:

     查看TEST_TB02数据:

     1.在SQL中使用JOIN

    TEST_TB01和TEST_TB02根据part_id使用JOIN连接,只返回两个表(TEST_TB01和TEST_TB02)中连接字段相等的记录。

    SQL语句:

    SELECT
      *
    FROM
      TEST_TB01 aa
    JOIN TEST_TB02 bb
        ON aa.part_id = bb.part_id
    ORDER BY aa.sensor_id ASC;

    执行结果:

     2.在SQL中使用INNER JOIN

    TEST_TB01和TEST_TB02根据part_id使用INNER JOIN连接,只返回两个表(TEST_TB01和TEST_TB02)中连接字段相等的记录。INNER JOIN和JOIN效果等价。

    SQL语句:

    SELECT
      *
    FROM
      TEST_TB01 aa
    INNER JOIN TEST_TB02 bb
        ON aa.part_id = bb.part_id
    ORDER BY aa.sensor_id ASC;

    执行结果:

     3.在SQL中使用LEFT JOIN

    TEST_TB01和TEST_TB02根据part_id使用LEFT JOIN连接,左连接,返回左表(TEST_TB01)中所有的记录以及右表(TEST_TB02)中连接字段相等的记录。

    SQL语句:

    SELECT
      *
    FROM
      TEST_TB01 aa
    LEFT JOIN TEST_TB02 bb
        ON aa.part_id = bb.part_id
    ORDER BY aa.sensor_id ASC;

    执行结果:

     4.在SQL中使用LEFT OUTER JOIN

    TEST_TB01和TEST_TB02根据part_id使用LEFT OUTER JOIN连接,左外连接,返回左表(TEST_TB01)中所有的记录以及右表(TEST_TB02)中连接字段相等的记录。LEFT OUTER JOIN

    和LEFT  JOIN等价。

    SQL语句:

    SELECT
      *
    FROM
      TEST_TB01 aa
    LEFT OUTER JOIN TEST_TB02 bb
        ON aa.part_id = bb.part_id
    ORDER BY aa.sensor_id ASC;

    执行结果:

     5.在SQL中使用RIGHT JOIN

    TEST_TB01和TEST_TB02根据part_id使用RIGHT JOIN连接,右连接,返回右表(TEST_TB02)中所有的记录以及左表(TEST_TB01)中连接字段相等的记录

    SQL语句:

    SELECT
      *
    FROM
      TEST_TB01 aa
    RIGHT JOIN TEST_TB02 bb
        ON aa.part_id = bb.part_id
    ORDER BY aa.sensor_id ASC;

    执行结果:

     6.在SQL中使用FULL JOIN

    TEST_TB01和TEST_TB02根据part_id使用FULL JOIN连接,外连接,返回两个表中的行:LEFT JOIN + RIGHT JOIN所有行记录。

    SQL语句:

    ​SELECT
      *
    FROM
      TEST_TB01 aa
    FULL JOIN TEST_TB02 bb
        ON aa.part_id = bb.part_id
    ORDER BY aa.sensor_id ASC;

    执行结果:

    四、SQL语句中使用JOIN有重复数据情况

    在SQL语句中使用JOIN有重复数据情况,即在TEST_TB01和TEST_TB02表中均有重复数据情况。分别使用JOIN、INNER JOIN、LEFT JOIN、LEFT OUTER JOIN、RIGHT JOIN、FULL JOIN验证。

    在TEST_TB01插入数据:

    insert into TEST_TB01 (sensor_id,part_id) values(2101,9911);
    insert into TEST_TB01 (sensor_id,part_id) values(2102,9912);
    insert into TEST_TB01 (sensor_id,part_id) values(2103,9913);
    insert into TEST_TB01 (sensor_id,part_id) values(2104,9914);
    insert into TEST_TB01 (sensor_id,part_id) values(2105,9915);
    --造重复数据
    insert into TEST_TB01 (sensor_id,part_id) values(2102,9912);
    insert into TEST_TB01 (sensor_id,part_id) values(2103,9913);

    在TEST_TB02插入数据:

    insert into TEST_TB02 (part_id,elem_id) values(9911,8901);
    insert into TEST_TB02 (part_id,elem_id) values(9912,8902);
    insert into TEST_TB02 (part_id,elem_id) values(9913,8903);
    insert into TEST_TB02 (part_id,elem_id) values(9916,8906);
    --造重复数据
    insert into TEST_TB02 (part_id,elem_id) values(9912,8902);
    insert into TEST_TB02 (part_id,elem_id) values(9913,8903);

    查看TEST_TB01数据:

     查看TEST_TB02数据:

    1.在SQL中使用JOIN

    TEST_TB01和TEST_TB02根据part_id使用JOIN连接,只返回两个表(TEST_TB01和TEST_TB02)中连接字段相等的记录。

    SQL语句:

    SELECT
      *
    FROM
      TEST_TB01 aa
    JOIN TEST_TB02 bb
        ON aa.part_id = bb.part_id
    ORDER BY aa.sensor_id ASC;

    执行结果:

     2.在SQL中使用INNER JOIN

    TEST_TB01和TEST_TB02根据part_id使用INNER JOIN连接,只返回两个表(TEST_TB01和TEST_TB02)中连接字段相等的记录。INNER JOIN和JOIN效果等价。

    SQL语句:

    SELECT
      *
    FROM
      TEST_TB01 aa
    INNER JOIN TEST_TB02 bb
        ON aa.part_id = bb.part_id
    ORDER BY aa.sensor_id ASC;

    执行结果:

     3.在SQL中使用LEFT JOIN

    TEST_TB01和TEST_TB02根据part_id使用LEFT JOIN连接,左连接,返回左表(TEST_TB01)中所有的记录以及右表(TEST_TB02)中连接字段相等的记录。

    SQL语句:

    SELECT
      *
    FROM
      TEST_TB01 aa
    LEFT JOIN TEST_TB02 bb
        ON aa.part_id = bb.part_id
    ORDER BY aa.sensor_id ASC;

    执行结果:

     4.在SQL中使用LEFT OUTER JOIN

    TEST_TB01和TEST_TB02根据part_id使用LEFT OUTER JOIN连接,左外连接,返回左表(TEST_TB01)中所有的记录以及右表(TEST_TB02)中连接字段相等的记录。LEFT OUTER JOIN

    和LEFT  JOIN等价。

    SQL语句:

    SELECT
      *
    FROM
      TEST_TB01 aa
    LEFT OUTER JOIN TEST_TB02 bb
        ON aa.part_id = bb.part_id
    ORDER BY aa.sensor_id ASC;

    执行结果:

     5.在SQL中使用RIGHT JOIN

    TEST_TB01和TEST_TB02根据part_id使用RIGHT JOIN连接,右连接,返回右表(TEST_TB02)中所有的记录以及左表(TEST_TB01)中连接字段相等的记录

    SQL语句:

    SELECT
      *
    FROM
      TEST_TB01 aa
    RIGHT JOIN TEST_TB02 bb
        ON aa.part_id = bb.part_id
    ORDER BY aa.sensor_id ASC;

    执行结果:

     6.在SQL中使用FULL JOIN

    TEST_TB01和TEST_TB02根据part_id使用FULL JOIN连接,外连接,返回两个表中的行:LEFT JOIN + RIGHT JOIN所有行记录。

    SQL语句:

    SELECT
      *
    FROM
      TEST_TB01 aa
    FULL JOIN TEST_TB02 bb
        ON aa.part_id = bb.part_id
    ORDER BY aa.sensor_id ASC;

    执行结果:

    五、SQL中使用JOIN有重复与无重复数据区别

    在SQL语句中使用JOIN有重复数据情况,使用JOIN连接,符合连接字段相等的记录的结果集是笛卡尔积,第一个表的行数乘以第二个表的行数。

    六、解决方式

    1.先去重再使用JOIN连接

    根据业务规则先对TEST_TB01和TEST_TB02分别去重再使用JOIN连接。

    2.先使用JOIN连接再去重

    根据业务规则先对TEST_TB01和TEST_TB02使用JOIN连接生成结果集,再对结果集去重。

    3.建议

    在生产环境特别是数据量大场景,推荐使用第一种方式,先逐个表去重再使用JOIN连接。

    七、关系型数据库验证表结构

    本例是在DataWorks环境(即MaxCompute大数据平台)下验证,即在关系型数据库验证除表结构差异,其它均相同。

    在ORACLE数据库建表语句:

    create table TEST_TB01
    (
      sensor_id  NUMBER(16),
      part_id  NUMBER(16)
     );
     
     create table TEST_TB02
    (
      part_id  NUMBER(16),
      elem_id  NUMBER(16) 
     );

    在MySQL数据库建表语句:

     CREATE TABLE TEST_TB01
    (
      sensor_id  BIGINT,
      part_id  BIGINT
     );
     
     CREATE TABLE TEST_TB02
    (
      part_id  BIGINT,
      elem_id  BIGINT 
     );

    以上,感谢。

    展开全文
  • sql语句大全

    万次阅读 多人点赞 2020-10-19 17:55:38
    获取第n页的数据的SQL语句求解思路 第n页前有n-1页 所在第n页前已经显示的数据的总量是(n-1)*m 由于数据的下标从0开始 所以第n页前所有的网页的下标是0,1,…,(n-1)*m-1 所以第n页的数据起始下标是(n-1)*m 获取第n页...

    数据库操作

    1. 查看所有数据库
    show databases;
    
     
    • 1
    1. 查看当前使用的数据库
    select database();
    
     
    • 1
    1. 创建数据库
    create databases 数据库名 charset=utf8;
    
     
    • 1

    5.删除数据库

    drop database 数据库名
    
     
    • 1

    6 .使用数据句库

    use database 数据库名
    
     
    • 1

    7.查看数据库中所有表

    show tables;
    
     
    • 1

    表的操作

    1.查看表结构

    desc 表名
    
     
    • 1

    2.创建表结构的语法

    create table table_name(
    字段名 数据类型 可选的约束条件);
    
     
    • 1
    • 2

    demo:创建班级和学生表

    create table classes(
        id int unsigned auto_increment primary key not null,
        name varchar(10)
    );
    
     
    • 1
    • 2
    • 3
    • 4
    create table students(
        id int unsigned primary key auto_increment not null,
        name varchar(20) default '',
        age tinyint unsigned default 0,
        height decimal(5,2),
        gender enum('男','女','人妖','保密'),
        cls_id int unsigned default 0
    )
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.修改表–添加字段

    alter table 表名 add 列名 类型
    demo:alter table students add birthday datetime;
    
     
    • 1
    • 2

    4.修改表–修改字段–重命名版

    alert table 表名 change 原名 新名 类型及约束
    demo:alter table syudents change birthday birth  datetime not null;
    
     
    • 1
    • 2

    5.修改表–修改字段–不重命名

    alter table 表名 modify 列名 类型及约束
    demo : alter table students modify birth date nout noll;
    
     
    • 1
    • 2

    6.删除表–删除字段

    alter table 表名 drop 列名
    demo :later table students drop birthday;
    
     
    • 1
    • 2

    7.删除表

    drop table 表名
    demo:drop table students;
    
     
    • 1
    • 2

    8.查看表的创建语句–详细过程

    show create table 表名
    demo : show create tabele students;
    
     
    • 1
    • 2

    查询基本使用

    1.查询所有列

    select * from 表名
    例:
    select * from classes;
    
     
    • 1
    • 2
    • 3

    2.查询指定列

    select 列1,列2,...from 表名;
    例:
    select id,name from classes;
    
    • 1
    • 2
    • 3
    • 4
    增加

    说明:主键列是自动增长,但是在全列插入时需要占位,通常使用空值(0或者null) ; 字段默认值 default 来占位,插入成功后以实际数据为准

    1.全列插入:值的顺序与表结构字段的顺序完全一一对应
    此时 字段名列表不用填写

    insert into 表名 values (...)
    例:
    insert into students values(0,’郭靖‘,1,'蒙古','2016-1-2');
    
     
    • 1
    • 2
    • 3

    2.部分列插入:值的顺序与给出的列顺序对应
    此时需要根据实际的数据的特点 填写对应字段列表

    insert into 表名 (列1,...) values(值1,...)
    例:
    insert into students(name,hometown,birthday) values('黄蓉','桃花岛','2016-3-2');
    
     
    • 1
    • 2
    • 3

    上面的语句一次可以向表中插入一行数据,还可以一次性插入多行数据,这样可以减少与数据库的通信

    3.全列多行插入

    insert into 表名 values(...),(...)...;
    例:
    insert into classes values(0,'python1'),(0,'python2');
    
     
    • 1
    • 2
    • 3

    4.部分列多行插入

    insert into 表名(列1,...) values(值1,...),(值1,...)...;
    例:
    insert into students(name) values('杨康'),('杨过'),('小龙女');
    
     
    • 1
    • 2
    • 3
    修改
    update 表名 set 列1=值1,列2=值2... where 条件
    例:
    update students set gender=0,hometown='北京' where id=5;
    
     
    • 1
    • 2
    • 3
    删除
    delete from 表名 where 条件
    例:
    delete from students where id=5;
    
     
    • 1
    • 2
    • 3

    逻辑删除,本质就是修改操作

    update students set isdelete=1 where id=1;
    
     
    • 1
    as关键字

    1.使用 as 给字段起别名

    select id as 序号, name as 名字, gender as 性别 from students;
    
     
    • 1

    2.可以通过 as 给表起别名

    select s.id,s.name,s.gender from students as s;
    
     
    • 1

    条件语句查询

    where后面支持多种运算符,进行条件的处理
    比较运算符
    逻辑运算符
    模糊查询
    范围查询
    空判断

    比较运算符

    等于: =
    大于: >
    大于等于: >=
    小于: <
    小于等于: <=
    不等于: != 或 <>

    例1:查询编号大于3的学生

    select * from students where id > 3;
    
     
    • 1

    例2:查询编号不大于4的学生

    select * from students where id <= 4;
    
     
    • 1

    例3:查询姓名不是“黄蓉”的学生

    select * from students where name != '黄蓉';
    
     
    • 1

    例4:查询没被删除的学生

    select * from students where is_delete=0;
    
     
    • 1
    逻辑运算符

    and
    or
    not

    例5:查询编号大于3的女同学

    select * from students where id > 3 and gender=0;
    
     
    • 1

    例6:查询编号小于4或没被删除的学生

    select * from students where id < 4 or is_delete=0;
    
     
    • 1
    模糊查询

    like
    %表示任意多个任意字符
    _表示一个任意字符

    例7:查询姓黄的学生

    select * from students where name like '黄%';
    
     
    • 1

    例8:查询姓黄并且“名”是一个字的学生

    select * from students where name like '黄_';
    
     
    • 1

    例9:查询姓黄或叫靖的学生

    select * from students where name like '黄%' or name like '%靖';
    
     
    • 1
    范围查询

    范围查询分为连续范围查询和非连续范围查询

    1. in表示在一个非连续的范围内
      例10:查询编号是1或3或8的学生
    select * from students where id in(1,3,8);
    
     
    • 1
    1. between … and …表示在一个连续的范围内
      例11:查询编号为3至8的学生
    select * from students where id between 3 and 8;
    
     
    • 1

    例12:查询编号是3至8的男生

    select * from students where (id between 3 and 8) and gender=1;
    
     
    • 1
    空判断

    判断为空
    例13:查询没有填写身高的学生

    select * from students where height is null;
    
     
    • 1

    注意: 1. null与’'是不同的 2. is null
    判非空is not null
    例14:查询填写了身高的学生

    select * from students where height is not null;
    
     
    • 1

    例15:查询填写了身高的男生

    select * from students where height is not null and gender=1;
    
    • 1
    • 2

    优先级
    优先级由高到低的顺序为:小括号,not,比较运算符,逻辑运算符
    and比or先运算,如果同时出现并希望先算or,需要结合()使用

    排序

    排序查询语法:

    select * from 表名 order by 列1 asc|desc [,列2 asc|desc,...]
    
     
    • 1

    语法说明:
    将行数据按照列1进行排序,如果某些行 列1 的值相同时,则按照 列2 排序,以此类推
    asc从小到大排列,即升序
    desc从大到小排序,即降序
    默认按照列值从小到大排列(即asc关键字)

    例1:查询未删除男生信息,按学号降序

    select * from students where gender=1 and is_delete=0 order by id desc;
    
     
    • 1

    例2:查询未删除学生信息,按名称升序

    select * from students where is_delete=0 order by name;
    
     
    • 1

    例3:显示所有的学生信息,先按照年龄从大–>小排序,当年龄相同时 按照身高从高–>矮排序

    select * from students  order by age desc,height desc;
    
     
    • 1

    分页

    select * from 表名 limit start=0,count
    
     
    • 1

    说明
    从start开始,获取count条数据
    start默认值为0
    也就是当用户需要获取数据的前n条的时候可以直接写上 xxx limit n;

    例1:查询前3行男生信息

    select * from students where gender=1 limit 0,3;
    
     
    • 1
    关于分页的一个有趣的推导公式

    已知:每页显示m条数据,当前显示第n页

    求总页数:此段逻辑后面会在python项目中实现

    查询总条数p1
    使用p1除以m得到p2
    如果整除则p2为总数页
    如果不整除则p2+1为总页数
    获取第n页的数据的SQL语句求解思路

    第n页前有n-1页
    所在第n页前已经显示的数据的总量是(n-1)*m
    由于数据的下标从0开始 所以第n页前所有的网页的下标是0,1,…,(n-1)*m-1
    所以第n页的数据起始下标是(n-1)*m
    获取第n页数据的SQL语句

    select * from students where is_delete=0 limit (n-1)*m,m
    
     
    • 1

    注意:在sql语句中limit后不可以直接加公式

    聚合函数

    总数

    count(*) 表示计算总行数,括号中写星与列名,结果是相同的
    例1:查询学生总数

    select count(*) from students;
    
     
    • 1
    最大值

    max(列) 表示求此列的最大值

    例2:查询女生的编号最大值

    select max(id) from students where gender=2;
    
     
    • 1
    最小值

    min(列) 表示求此列的最小值

    例3:查询未删除的学生最小编号

    select min(id) from students where is_delete=0;
    
     
    • 1
    求和

    sum(列) 表示求此列的和

    例4:查询男生的总年龄

    select sum(age) from students where gender=1;
    
     
    • 1

    – 平均年龄

    select sum(age)/count(*) from students where gender=1;
    
     
    • 1
    平均值

    avg(列) 表示求此列的平均值

    例5:查询未删除女生的编号平均值

    select avg(id) from students where is_delete=0 and gender=2;
    
     
    • 1

    分组

    group by

    在这里插入图片描述

    在这里插入图片描述

    group by + group_concat()

    group_concat(字段名)根据分组结果,使用group_concat()来放置每一个分组中某字段的集合
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    group by + 聚合函数

    通过group_concat()的启发,我们既然可以统计出每个分组的某字段的值的集合,那么我们也可以通过集合函数来对这个值的集合做一些操作
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    group by + having

    having 条件表达式:用来过滤分组结果
    having作用和where类似,但having只能用于group by 而where是用来过滤表数据
    在这里插入图片描述

    group by + with rollup

    with rollup的作用是:在最后新增一行,来记录当前表中该字段对应的操作结果,一般是汇总结果。
    在这里插入图片描述
    在这里插入图片描述

    连接查询语法

    对于外连接 outer关键字可以省略

    select * from 表1 inner或left或right join 表2 on 表1.列 运算符 表2.列
    
     
    • 1

    例1:使用内连接查询班级表与学生表

    select * from students inner join classes on students.cls_id = classes.id;
    
     
    • 1

    例2:使用左连接查询班级表与学生表
    此处使用了as为表起别名,目的是编写简单

    select * from students as s left join classes as c on s.cls_id = c.id;
    
     
    • 1

    例3:使用右连接查询班级表与学生表

    select * from students as s right join classes as c on s.cls_id = c.id;
    
     
    • 1

    例4:查询学生姓名及班级名称

    select s.name,c.name from students as s inner join classes as c on s.cls_id = c.id;
    
     
    • 1

    子查询

    在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句,外部那个select语句则称为主查询.
    主查询和子查询的关系
    子查询是嵌入到主查询中
    子查询是辅助主查询的,要么充当条件,要么充当数据源
    子查询是可以独立存在的语句,是一条完整的 select 语句

    标量子查询

    查询班级学生平均年龄
    查询大于平均年龄的学生
    查询班级学生的平均身高

    select * from students where age > (select avg(age) from students);
    
     
    • 1
    列级子查询

    查询还有学生在班的所有班级名字
    找出学生表中所有的班级 id
    找出班级表中对应的名字

    select name from classes where id in (select cls_id from students);
    
     
    • 1
    行级子查询

    需求: 查找班级年龄最大,身高最高的学生
    行元素: 将多个字段合成一个行元素,在行级子查询中会使用到行元素

    select * from students where (height,age) = (select max(height),max(age) from students);
    
     
    • 1
    展开全文
  • 在这一部分,我们将会学习如何使用SQL Developer来输入并执行SQL语句及脚本。如何使用摘录窗口,解决常见的语法错误等内容。在你回顾数据库设计的同时,SQL Developer还是一个很好的可输入并运行SQL语句的工具。在接...
  • python中执行sql语句

    千次阅读 2021-02-03 11:14:54
    来源:疯狂的蚂蚁的博客 ...然后执行SQL语句对数据库进行 增删改查等操作并提交事务,此过程如果出现异常则使用回滚技术 使数据库恢复到执行SQL语句之前的......因此SQLite在解析建表语句时,会忽略建表语句中跟在字...
  • insert sql语句_SQL Insert语句概述

    万次阅读 2020-07-25 13:46:33
    insert sql语句 This article on the SQL Insert statement, is part of a series on string manipulation functions, operators and techniques. The previous articles are focused on SQL query techniques, ...
  • sql语句的增加数据: insert into 表名 (字段名1,字段名2,字段名3,...) values (字段名1的值,字段名2的值,字段名3的值,...) sql语句的删除数据: 删除表的所有数据:delete from 表名 根据条件删除数据:...
  • sql语句之多表查询

    千次阅读 2022-03-16 09:56:06
    四、联合连接---->union 1、概念 两个sql语句,中间用union连接 union all 分别查看&不去重 2.示例 select device_id, gender, age, gpa from user_profile where university='山东大学' union all select device_...
  • SQL语句详解(四)——SQL联表查询

    千次阅读 2021-12-15 11:13:11
    今天我们继续给大家介绍MySQL相关知识,本文主要内容是SQL联表查询。 一、SQL联表查询简介 二、内链接 三、外链接 四、交叉链接 五、结果链接
  • Sql Server sql语句创建索引

    千次阅读 2022-06-08 09:50:03
    SQL CREATE INDEX 语法 在表上创建一个简单的索引。允许使用重复的值: 注释:“column_name” 规定需要索引的列。2.创建唯一索引 SQL CREATE UNIQUE INDEX 语法 在表上创建一个唯一的索引。唯一的索引意味着两个...
  • 利用SQL语句创建数据库

    千次阅读 2022-04-08 15:07:14
    SQL语言是集DDL、DML和DCL于一体的数据库语言 SQL语言主要由以下9个单词引导的操作语句来构成,但每一种语句都能表达复杂的操作请求 DDL语句引导词:Create(建立),Alter(修改),Drop(撤销) 模式的定义和删除...
  • sql设置外键(设置外键的sql语句)

    千次阅读 2021-02-01 02:46:07
    sql设置外键(设置外键的sql语句)2020-07-24 11:44:03共8个回答sql怎么设置外键创建数据库时就是有主键的创建了主键,但是表之间的关系没有联系,要建数据库关系图只有主键没有外键时不行的。建外键的前提是此外键...
  • 数据库常用sql语句总结

    万次阅读 多人点赞 2018-12-14 16:16:32
    查看时右侧可以打开CSDN自带的目录,方便查看 目录 一、基础 1.SELECT 语句 2.SELECT DISTINCT 语句 3.WHERE 子句 ...5.ORDER BY 语句 ...6.INSERT INTO 语句 ...7.Update 语句 ...3.SQL 通配符 4.IN...
  • sql语句时间排序 sql语句按照时间排序以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!SQL按时间排序select * from MyTable Order By ModifyTime Desc...
  • sql语句修改数据

    千次阅读 2021-01-21 18:09:34
    sql语句修改数据SQL 中,可以使用 UPDATE 语句来修改、更新一个或多个表的数据。语法格式为:UPDATE SET 字段 1=值 1 [,字段 2=值 2… ] [WHERE 子句 ][ORDER BY 子句] [LIMIT 子句]语法说明如下::用于指定要更新...
  • 在 Shell 脚本中执行 SQL 语句

    千次阅读 2022-01-18 11:35:12
    在 Shell 脚本中执行 SQL 语句 以下执行 SQL 的方式, 既可以在 终端直接执行, 也可以把命令写到 shell 脚本中执行. 测试环境: Contos 7.9 MySQL 8.0 mysql — The MySQL Command-Line Client 短 SQL 命令执行 直接...
  • 使用SQL语句创建数据表(SQL Server)

    千次阅读 2021-10-04 17:37:35
    使用SQL语句创建数据表 CREATE TABLE的语法格式如下 database_name:在其中创建表的数据库的名称。database_name必须指定现有数据库的名称。如果未指定,则database_name默认为当前数据库。 schema_name:新表所属...
  • 批量删除的sql语句

    千次阅读 2022-01-07 15:02:38
    批量删除的sql <!-- 需求: 批量删除多个数据 难点: 如果使用#{集合}获取的是集合对象的整体.删除无效. 思路: 将数组拆分为单个数据. 可以通过遍历的方式操作 语法: mybatis为了参数取值方便,特意封装了遍历的...
  • mybatis-plus打印完整sql语句

    千次阅读 2022-05-26 15:16:16
    导读:为方便查看sql语句,因为一般sql在控制台打印是预处理的select… from table where ss=?,有时语句太长复制语句很麻烦,因此写下这篇文章作记录。 p6spy 配置比较简单,基本是引用jar包后,然后在配置上稍微...
  • 使用SQL语句创建数据库

    千次阅读 2022-04-05 10:48:36
    CREATE DATABASE <... //数据文件的SQL语句 on primary //默认属于PRIMARY文件组,可省略 ( name=<数据库名称> //主数据文件的逻辑名称 filename=<物理名称> //主数据的物理名称 size=<>
  • 添加字段的sql语句

    千次阅读 2021-12-24 13:49:58
    添加字段,比如我在数据表中添加一个 age 字段,类型为int(11) ALTER TABLE player ADD (age int(11));...MySQL - SQL语句增加字段/修改字段/修改类型/修改默认值_william_n的博客-CSDN博客_mysql添加字段sql语句 ...
  • SQL语句修改表操作

    千次阅读 2021-11-24 11:19:31
    此博客用于记录工作用用到的SQL语句,持续更新,欢迎补充! 清空表中某一列的所有值 UPDATE table_name SET column_name = null 注:table_name 为表名 column_name为字段名 批量给指定列插入数据(python中拼接...
  • SQL语句实现模糊查询

    千次阅读 2022-03-10 16:10:15
    SQL模糊搜索的4种匹配模式: 1. % :用来替代任意长度和任意类型的字符串(%中文%); eg: select * from table where keyname like %白%:检索字符串中含有‘白’的; %白% and %痴%:检索含‘白’和‘痴’的,...
  • 在Navicat中执行sql语句

    千次阅读 2021-10-22 12:20:39
    1、打开Navicat后双击查询 2、点击新建查询 3、选择需要操作的数据库,然后编写sql语句,编写完成后点击运行即可,运行后下方会弹出运行结果
  • SQL语句编写规范

    万次阅读 多人点赞 2018-09-30 08:40:01
    SQL语句编写规范
  • 使用SQL语句修改表数据

    万次阅读 2021-10-05 15:12:55
    使用SQL语句修改表数据 利用INSERT语句输入数据 INSERT语句的基本语法格式如下: 上述格式主要参数说明如下: TOP(expression)[PERCENT]:指定将插入的随机行的数目或百分比。 INTO:一个可选的关键字,可以将它...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,894,057
精华内容 757,622
关键字:

sql语句