SQL语句

10 篇文章 0 订阅

DDL

1.DDL 库

定义库:创建数据库 create database 数据库名;

(数据库名要求:区分大小写,唯一性 ,不能使用关键字如create select;不能单独使用 的数字和特殊符号)

查看所有数据库:show databases;

选择/进入数据库:use   数据库名;   

select database();

调用函数,查询当前库;

删除库:

drop database 数据库名;

系统中所在的位置

/var/lib/mysql/

2.数据类型

a.数值类型  整数类型int  浮点数类型float

b.字符串类型

c.时间和日期类型

3.DDL表

创建目的:表是数据库存储数据的基本单位,表有若干个字段(列)组成,主要用来存储数据记录(行)

a.创建表

create table  表名(列名  类型  约束(可加可不加));

create table t1 (id int);

b.查看表  

show  tables;

c.插入数据 

insert into 表名  value  (要插入的数据);

insert into t1 value (1);

d.查询所有数据:

查询  所有列   从    表名

                            select    *       from    t1;

e.查看表结构:desc 表名;

desc t1;

f.删除表  drop table 表名;

drop table t1;

增加列:

        alter table emp add image varchar(32) after resume;

修改列:

        alter table emp modify job varchar(60) not null;

删除列:

        alter table emp drop sex;

修改表名:

        rename table emp to employee;

修改字符集:        

        alter table employee charset utf8;

 修改列名:

        alter table employee change name user_name varchar(32) not null;

删除数据

delete from 表名 where 条件判断

删除表中所有数据

delete  from  表名

truncate  表名

区别

不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也可以清空mysql表中所有内容。效率上truncate比delete快,但truncate删除后不记录mysql日志,不可以恢复数据。

DML

1.插入数据insert

完整性插入   语法:insert into 表名    values(值1,值2,值n);

部分插入       语法:insert into 表名(列名,列名) values (值1,值2);        

2.更新数据update

语法:update  表名  set  列名= 值  where  条件语句

更新数据库管理员密码

update mysql. user set a  thentication_string=password('要修改的密码') where user='root';(适用于mysql8.0之前版本)

alter user 'root'@'localhost'IDENTIFIED BY 'MyNewPass';   (mysql8.0 以上版本)

更新缓存    flush  privileges;

3.删除数据delete

语法:delete  from  表名   where  条件

DQL

MySQL查询

1.简单查询

查看所有列:(前提是进入数据库)select  * from  表名

查部分列   select  列1,列2,列3        from  表名

四则运算查询   select name,salary,salary*14 from employee5;

2.条件查询

a.单条件查询where

查询hr部门的员工部门 select name  from employee5 where post='hr';

b.多条件查询and/or

查询hr部门的员工,并且工资大于1000and

select * from employee5 where post='hr' and salary>1000;

查询所有部门的员工,并且工资是6000或者8000的员工

select * from employee5 where salary=6000 or salary=8000;

c.关键字between and在什么之间

查询工资5000到15000之间

select * from employee5 where salary between 5000 and 15000;

不在5000到15000之间 :使用not

select * from employee5 where salary between 5000 and 15000;

工资可能是4000,也可能是5000,也可能是6000,也可能是9000

select * from employee5 where salary in (4000,5000,6000,9000);

不在这里面not in

select * from employee5 where salary not  in (4000,5000,6000,9000);

f. 关键字isnull

查看谁的职位描述为空null

select name from employee5 where job_description is null;

10号没显示是因为职业描述敲得是空格  

select name from employee5 where job_description=‘ ’;

g.关键字like模糊查询

好像有个员工叫al什么的

select * from employee5 where name like 'al%';(通配符%代表多个任意字符类似shell里的*)

select * fro m employee5 where name like 'al___';(三个下划线 通配符‘_’代表一个任意字符)

3.查询排序

以工资升序排序     select name,salary from emlpoyee5 order by salary ASC;

以工资降序排序    select name,salary from employee5 order by salary DESC;

工资最高的前五    select name,salary from employee5 order by DESC limit 5;

 查询总成绩

mysql > select name,(chinese+english+math) from student;

可以用as代替括号里的

mysql > select name,(chinese+english+math) as total_score from student;

order by 排序

ASC升序,desc降序

mysql> select name,(chinese+math+english) as total_score from student order by total_score desc;

count 返回行的总数

select         count(*)/count(列名)         from table_name where条件语句

count(*)列出所有列,包含为空的

count(列名)不包含为空的

sum对数字求和

select sum(列) from 表名

mysql> select sum(math),sum(english),sum(chinese) from student;

avg 求平均值

mysql> select avg(math+chinese+english) from student;

max和min

mysql> select avg(math+chinese+english) from student;

group by 分组查询  having  过滤

查询每个部门,每个岗位的平均工资:

mysql> select avg(sal),deptno,job  from emp  group by deptno,job;

 查询每个部门,每个岗位的平均工资,并且只显示工资小于2000的:

mysql> select avg(sal) as sal_avg,deptno,job  from emp  group   by deptno,job having sal_avg<2000;

   

字符串相关函数

charset   返回字符串字符集

concat(string,substring)       

                                        连接字符串

mysql> select concat (ename,' job is  ',job) from emp;

instr(string,substring)  

                                范围substring在string中出现的位置,没有的话返回0   dual 亚元表

mysql> select instr('hwanghaoyang','ya') from dual;

ucase(string)        转换为大写

lcase(string)        转换为小写

mysql> select ucase(ename)  from emp;

left(string,legth)    

    从string的左边起取length个字符

mysql> select  left('whyabc',3) from dual;

length(string)       

                string长度(按照字节)

replace(str,search_str,replace_str)       

                                 在str中用replace_str代替search_str

mysql> select ename,replace(job,'MANAGER','JINGLI') from emp;

查找出job是manager并替换为jingli

strcmp(string1,string2)

                逐字符比较两个字符串的大小

substring(str,position,length)

                从str字符的position位置,取length个字符

mysql> select substring'wanghaoyang',3,2) from dual;

distinct(string)         去重

ltrim(string)  rtim(string)  trim()

去除前端空格,后端空格,所有空格

从emp表中找出姓名列ename,要求首字母小写,后面照常大写

select concat(lcase(substring(ename,1,1)),substring(ename,2)) as new_name from emp;

日期相关函数

current_date() 

                        当前日期

current_time() 

                        当前时间

current_timestamp()       

                         当前时间戳

now()

date_add(time1,interval 时间值)

        在time1的基础上加时间值

mysql> select * from mes where date_add(send_time,interval 20 minute) >= now();

查看发布时间至今小于20分钟的

date_sub(time1,interval 时间值)

        在time1的基础上减时间值

mysql> select * from mes where date_sub(now(),interval 20 minute) <= send_time; 

datediff(time1,time2)

一个1998-11-11出生的,现在离他80岁还有多久

mysql>  select datediff(date_add('1998-11-11',interval 80 year),now()) from dual;

year/month/day(date/datetime)

提取日期当中的年/月/日

mysql> select day(now()) from dual;

unix_timestamp(now())

转换为秒数

 from_unixtime()

        把一个unix_timestamp转换为指定格式的日期 %Y-%m-%d %h:%i:%s,

mysql> select from_unixtime(1639817465,'%Y-%m-%d %h:%i:%s') from dual;

 加密函数和系统函数

user()

database()

MD5(str)

         32位的加密字符串

 passwd(str)

        加密函数

流程控制函数

if(expr1,expr2,expr3)

        如果expr1为真,则返回expr2,否则返回expr3

ifnull(expr1,expr2)

        如果expr1不为空,则返回expr1,否则返回expr2

select case  when expr1 then expr2 when expr3 then expr4 else expr5 end

如果expr1为真返回expr2,如果expr3为真返回expr4,否则返回expr5

mysql> select ename,(select case when job='CLERK' then 'zhiyuan' when job='MANAGER' then 'jingli' when job='SALESMAN' t hen 'xiaoshou' else job end) as job from emp;

 查询加强

where条件判断

模糊查询like

%:  0到多个任意字符           _:表示单个任意字符

order  by  排序

按照部门号deptno升序,且薪水sal降序显示:

mysql> select * from emp order by deptno asc,sal desc;

分页查询  

基本语法: select ... limit start,rows

表示从start+1行开始取,去除rows行

公式: limit  查询的行数 *  (要查的页数-1) , 查询的行数

mysql> select * from emp order by empno limit 0,3;

统计各个部门的平均工资,并且平均工资大于1000,按照从高到低排序,取出前两行的记录

语法顺序:select  from  group by having order by limit

mysql> select deptno,avg(sal) as avg_sal from emp group by deptno having avg_sal > 1000 order by avg_sal desc limit 0,2;

多表查询

select * from empt,dept;(同时查询两个表,笛卡尔积)

多表查询的条件不能少于  表的个数-1

dept表                                                                                sal_grade

练习1:显示雇员名,雇员工资及所在部门的名字

mysql> select emp.ename,emp.sal,dept.dname from emp,dept where emp.deptno=dept.deptno

练习2:显示各个员工的姓名,工资,以及工资的级别

mysql> select emp.ename,emp.sal,sal_grade.grade from emp,sal_grade where emp.sal between sal_grade.losal  and sal_grade.hisal;

练习3.显示雇员名,雇员工资及所在部门的名字,按部门排序(降序)

mysql> select emp.ename,emp.sal,dept.dname from emp,dept where emp.deptno=dept.deptno  order by emp.deptno desc;

1.自连接  self.sql

自连接是指在同一张表的连接查询[将同一张表看做两张表]

特点:1.把一张表当两张表使用       

2.需要给表取别名  表名  列名

3.列名不明确,可以指定列的别名        列名 as  别名

显示公司员工名字和他的上级的名字

mysql> select worker.ename as worker,boss.ename as bossname from emp worker,emp boss where worker.mgr=boss.empno;

2.子查询

子查询是指嵌入在其它sql语句中的select语句,也叫嵌套语句

单行子查询  =

        指只返回一行数据的子查询语句

多行子查询   in

        指返回多行数据的子查询

查询部门编号和SMITH相同的人的名字

mysql> select ename from emp where deptno=(select deptno from emp where ename='SMITH');

多行子查询:

如何查询和部门10的工作相同的雇员的名字,岗位,工资,和部门号,但是不包含10号部门自己的雇员

mysql> select ename,job,sal,deptno from emp where job in (select distinct job from emp where deptno=10) and deptno != 10;

子查询临时表

-- 查询ecshop中各个类别中,价格最高的商品

-- 先得到 各个类别中,价格最高的商品 max + group by cat_id, 当做临时表

-- 把子查询当做一张临时表可以解决很多很多复杂的查询

mysql> select goods_id, ecs_goods.cat_id, goods_name, shop_price
    from (
        SELECT cat_id , MAX(shop_price) as max_price
        FROM ecs_goods
        GROUP BY cat_id
    ) temp , ecs_goods
    where  temp.cat_id = ecs_goods.cat_id
    and temp.max_price = ecs_goods.shop_price;

ecshop部分内容

 求各种商品的最高价格

all和any

显示工资比部门30的所有员工的工资高的员工的姓名,工资和部门号

mysql> select ename,sal,deptno from emp where sal > all(select sal from emp where deptno=30);

 mysql> select ename,sal,deptno from emp where sal > (select max(sal) from emp where deeptno=30);

显示工资比部门30的其中一个员工的工资高的员工的姓名,工资和部门号

select ename,sal,deptno from emp where sal > any(select sal from emp where deptntno=30);

 mysql> select ename,sal,deptno from emp where sal > (select min(sal) from emp where deeptno=30);

多列子查询

查询和ALLEN的部门和岗位完全相同的所有雇员的(不包含ALLEN本人)

mysql> select * from emp where (job,deptno)=(select job,deptno from emp where ename="ALLEN") and ename != "ALLEN"

mysql> select * from emp where job=(select job from emp where ename="ALLEN") AND  deptno=(select deptno from emp where ename="ALLEN") AND ename != "ALLEN";

  

子查询练习

查询每个部门中,雇员的工资大于平均工资的雇员信息

select ename from emp,(select deptno,avg(sal) as avg_sal from emp group by deptno)avg_sal where emp.deptno=avg_sal.deptno and emp.sal>avg_sal.avg_sal;

表复制,自我复制

创一个新表

create table my_tab01(id int,name varchar(32),sal double,job varchar(32),deptno int);

表复制,把查询的结果复制到表中

insert into my_tab01(id,name,sal,job,deptno) select empno,ename,sal,job,deptno from emp;

创建表时,复制表结构

create table my_tab02 like emp;

表去重

1.创建一个表结构跟my_tab02相似的表

create table my_emp like my_tab02

2.不重复的显示出数据

select distinct  *  from  my_tab02;

3.把显示的数据插入到my_emp表中

insert into my_emp select distinct * from my_tab02;

4.删除my_tab02当中的数据

delete from  my_tab02;

truncate  my_tab02;

5.把my_emp表中的数据插入到my_tab02当中

insert into my_tab02 select * from my_emp;

6.删除my_emp表

drop table my_emp;

合并查询

union   union all

select ename,sal,job from emp where sal>2500 union all select ename,sal,job from emp where job='MANAGER';

select ename,sal,job from emp where sal>2500 union select ename,sal,job from emp where job='MANAGER';

mysql表外连接

左连接

select ... from 表1 left  join 表2 on  条件 

表1是左表,表2是右表

右连接

select  ... from 表1 right  join 表2 on  条件

例子

列出部门名称和这些部门的员工信息(名字和工作),同时列出没有与昂的部门名

 左外连接

select ename,job,dname,dept.deptno from dept left join emp on emp.deptno=dept.deptdeptno;

右外连接

select ename,job,dname,dept.deptno from emp right join dept on emp.deptno=dept.dept.deptno;

mysql约束

主键primary key

字段名 字段类型 primary key

主键列的值不可重复,且不能为空

一张表最多只能有一个主键,但可以是复合主键(包括的部分不能重复)

create table t18 (id int,name varchar(32),email varchar(32),primary key(id,name));
;

使用desc表名,可以查看主键的情况。

not null(非空)

插入时必须非空

unique(唯一)

当定义了唯一约束是,该列的值不能重复

如果没有指定not null,则unique可以有多个

一张表可以有多个unique字段

外键foreign key

create table my_class(id int primary key,name varchar(32) not null default ' ');
create table my_stu(id int primary key,name varchar(32) not null default " ",class_id int,foreign key (class_id) references my_class(id));

check

create table t23(id int primary key,name varchar(32),sex varchar(6) check(sex in('man','woman')),sal double check (sal > 1000 and sal<2000));

自增长

字段名 整型 primary key auto increment

添加自增长的字段的方式

insert into xxx(字段1,字段2....) values (null,'值'...);

insert into xxx(字段2)values('值1','值2'...);

insert into xxx values(null,'值1'...);

 create table t24(id int primary key auto_increment, email varchar(32)not null default ' ', name varchar(32)not null default ' ');
insert into t24 values(null,'aa@qq.com','aa');
insert into t24(email,name) values('bb@.com','bb');

mysql索引

创建一个海量表

索引的原理:

使用索引后,会形成一个索引的数据结构,比如二叉树

索引的代价:

如果对表进行dml操作,会对索引进行维护,读速度有影响

磁盘占用

索引的类型

1.主键索引,主键自动的为主索引(类型primary key)

2.唯一索引(unique)

3.普通索引

4.全文索引(fulltext)适用于myisam

查看是否有索引

show indexes from 表名;

show index from 表名;

show keys from 表名;

desc 表名;

添加索引

添加唯一索引

create unique index id_index on t25(id);

alter table 表名 add unique index 索引名 (列名);

添加普通索引

create index id_index on t25(id);

alter table t25 add index id_index (id)

添加主键索引

1.创表时指定主键

2.alter table t26 add primary key (id);

删除索引

drop index id_index on t25;

删除主键索引

alter table t26 drop primary key;

修改索引

先删除,再添加

创建索引的规则

1.较频繁作为查询条件字段应该创建索引

2.唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件

3.更新频繁的字段不适合创建索引

4.不会出现在where自居中的字段不该创建索引

事务

事务用于保证数据的一致性,它由一组相关的dml语句组成,改组的dml语句要么全部成功,要么全部失败

事务的操作

1.start transaction --开始一个事务

2.savepoint 保存点名 --设置保存点

3.rollback to 保存点名  --回退事务

4.rollback --回退所有事务

5.commit  --提交事务,所有操作生效,不能回退

 

 事务细节:

1.如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚

2.如果开始一个事务,你没有创建保存点,你可以执行rollback,默认就是回滚到事务开始的状态 

3.在该事务没有提交前,可以创建多个保存点

4.在事务没有提交前可以选择回退到哪个保存点

5.mysql的事务机制需要innodb的存储引擎,myisam不支持

6.开启一个事务  start transaction  或者是  set autocommit off

mysql事务隔离级别

1.多个连接开启各自实务操作数据库的数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性

2.如果不考虑隔离性,可能会引发以下问题

脏读:当一个事务读取另一个事务尚未提交的修改时,产生脏读

不可重复读:同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此事发生不可重复读

幻读:同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此事发生幻读

 查看当前会话mysql的隔离级别

select @@tx_isolation;

更改隔离级别

set session transaction isolation level 隔离级别  read uncommitted/read committed/repeatable read/serializable

 查看系统当前隔离级别

select @@global.tx_isolation

设置系统当前隔离级别

set global transaction isolation level 隔离级别

mysql默认的隔离级别是repeatable read

一般情况下,没有特殊要求没必要修改

事务的acid特性

1.原子性

事务是一个不可分割的工作单位,事务的操作要么都发生,要么都不发生

2.一致性

事务必须是数据库从一个一致性状态变换到另一个一致性状态

3.隔离性

事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他的操作数据所干扰,多个并发事务之间要相互隔离

4.持久性

一个事务一旦被提交,他对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

mysql的表类型和存储引擎

1.mysql的表类型由存储引擎决定的,主要包括myisam,innodb,memory等

2.mysql数据表主要支持六种类型,分别是CSV,memory,archive,MRG_MYISAM,MYISAM,innodb

3.这六种又分为两类,一类是“事务安全型”,比如innodb;其余都属于第二类,称为“非事务安全型”(non-transaction-safe),比如myisam和memory。

查看所有的存储引擎

show engines 

 innodb:

支持事务,支持外键,行锁

myisam:

 添加速度快,不支持事务和外键,

memory:

数据存储在内存中,执行速度很快(没有IO读写),默认支持索引(hash表)

修改表的引擎

alter table 表名 engine=xxx

视图

1.视图是一个虚拟表,其内容由查询定义。

2.同真实的表一样,视图包含列,其数据来自对应的真实表(基表 )

3.通过视图可以修改基表的数据

4.基表的改变,也会影响到视图的数据

 视图的基本使用:

1.create view 视图名 as select语句

2.alter view 视图名 as select语句

3.show create view 视图名

4.drop view 视图1,视图2

mysql管理

创建用户

create user '用户名'@'允许登录位置' identified by '密码'

删除用户

drop user '用户名'@'允许登录的位置'

修改密码

给自己修改密码

set password=password('')

给别人修改密码

set password for 'xx'@'xx' =password('xxx');

给用户授权

grant 权限列表 on 库.对象名 to '用户名'@'登录位置'  [identified by '密码']

 回收用户权限

revoke 权限列表 on 库.对象名 from '用户名'@'登录位置'

flush privileges

MySQL练习

-- ------13.显示不带有"R"的员工的姓名.
select ename from emp where ename NOT LIKE '%R%'
-- ------14.显示所有员工姓名的前三个字符.
SELECT left(ename,1,3)from emp;
-- ------15.显示所有员工的姓名,用a替换所有"A"
SELECT REPLACE(ename,'A','a') from emp ;
-- ------16.显示满10年服务年限的员工的姓名和受雇日期.
SELECT ename,hiredate from emp where hiredate<NOW()-10
SELECT ename,hiredate FROM emp where DATE_ADD(hiredate,INTERVAL 10 year) <=NOW()
-- ------17.显示员工的详细资料,按姓名排序.
select * from emp ORDER BY ename
-- ------18.显示员工的姓名和受雇日期,根据其服务年限,将最老的员工排在最前面.
SELECT ename,hiredate from emp ORDER BY hiredate ASC;
-- ------19.显示所有员工的姓名、工作和薪金,按工作降序排序,若工作相同则按薪金排序.
SELECT ename,job,sal from emp ORDER BY job DESC,sal
-- ------20.显示所有员工的姓名、加入公司的年份和月份,按受雇日期所在月排序,
-- 若月份相同则将最早年份的员工排在最前面.
select ename,CONCAT(YEAR(hiredate),"-",MONTH(hiredate)) from emp ORDER BY MONTH(hiredate),YEAR(hiredate)
-- ------21.显示在一个月为30天的情况所有员工的日薪金,忽略余数.
SELECT FLOOR(sal/30),ename from emp ;
-- ------22.找出在(任何年份的)2月受聘的所有员工。
SELECT ename,hiredate from emp where MONTH(hiredate)=2
-- ------23.对于每个员工,显示其加入公司的天数.
SELECT ename,DATEDIFF(NOW(),hiredate) from emp;
-- ------24.显示姓名字段的任何位置包含"A"的所有员工的姓名.
SELECT ename from emp where ename like '%A%';
-- ------25.以年月日的方式显示所有员工的服务年限.   (大概)
SELECT ename,FLOOR(DATEDIFF(NOW(),hiredate)/365)as 'work_year',FLOOR(DATEDIFF(NOW(),hiredate)%365/30)as 'work_month',FLOOR(DATEDIFF(NOW(),hiredate)%31)as 'wrok_day' from emp;

-- (1).列出至少有一个员工的所有部门
SELECT COUNT(*) as c,deptno from emp GROUP BY deptno HAVING c >= 1;
-- (2).列出薪金比“SMITH”多的所有员工。
SELECT ename,sal FROM emp where sal>(SELECT sal from emp where ename='SMITH')
-- (3).列出受雇日期晚于其直接上级的所有员工。
SELECT worker.ename as 'worker_name',leader.ename as 'leader_name',worker.hiredate AS 'worker_date',leader.hiredate as 'leader.hiredate' from emp worker,emp leader where worker.hiredate>leader.hiredate AND worker.mgr=leader.empno;
-- (4).列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。 要用外连接
SELECT dname,emp.* from dept LEFT JOIN emp ON  emp.deptno=dept.deptno;
-- (5).列出所有“CLERK”(办事员)的姓名及其部门名称。
SELECT ename,dname from emp,dept where emp.deptno=dept.deptno and job ='CLERK'
-- (6).列出最低薪金大于1500的各种工作。
SELECT job from emp GROUP BY job HAVING MIN(sal)>1500;
-- (7).列出在部门“SALES”(销售部)工作的员工的姓名。
SELECT ename from emp,dept where emp.deptno=dept.deptno AND dname='SALES'
-- (8).列出薪金高于公司平均薪金的所有员工。
SELECT ename from emp where  sal > (SELECT AVG(sal) from emp)                                          -- (9).列出与“SCOTT”从事相同工作的所有员工。
 select ename from emp where job = (select job from emp where ename='SCOTT') and ename !='SCOTT'
-- (10).列出薪金高于所在部门30的工作的所有员工的薪金的员工姓名和薪金。
SELECT ename,sal from emp WHERE sal >(SELECT MAX(sal) from emp where deptno=30)
-- (11).列出在每个部门工作的员工数量、平均工资和平均服务期限(时间单位)。
SELECT COUNT(*),AVG(sal),FORMAT(AVG(DATEDIFF(NOW(),hiredate)/365),2) FROM emp GROUP BY deptno
-- (12).列出所有员工的姓名、部门名称和工资。
SELECT ename,sal,dname from emp,dept where emp.deptno=dept.deptno
-- (13).列出所有部门的详细信息和部门人数。
SELECT COUNT(*),deptno as c from emp GROUP BY deptno
SELECT dept.*,c from dept,(select COUNT(*) as c ,deptno from emp GROUP BY deptno)temp where dept.deptno=temp.deptno
-- (14).列出各种工作的最低工资。
SELECT MIN(sal),job from emp GROUP BY job
-- (15).列出MANAGER(经理)的最低薪金。
SELECT MIN(sal) from emp where job='MANAGER'
-- (16).列出所有员工的年工资,按年薪从低到高排序。
select ename,sal*12+IFNULL(comm,0)*12 as total_sal from emp ORDER BY total_sal;

--   3.1 找出所有姓李的学生。
SELECT * FROM hsp_student where `name` LIKE '李%'
--   3.2 列出所有开设超过1个专业的系的名字。
SELECT COUNT(*)as nums,deptname from class GROUP BY deptname HAVING nums >1
--   3.3 列出人数大于等于30的系的编号和名字。
SELECT department.deptname,department.departmentid from ( SELECT deptname from class GROUP BY deptname HAVING SUM(num)>30)c ,department WHERE c.deptname=department.deptname

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值