三种添加注释的方式:
-
#……
-
- - ……
注意这两个短横线之间没有空格,之后+空格+注释内容 -
/*……*/
在workbench中打开表不能双击单元格修改数据:
因为没有设置主键,添加主键即可。
作业练习:
建立sc(学习表)如下:
SELECT * FROM day_one.sc;
#选修了2号同学选修课程的学生学号。
SELECT DISTINCT B.Sno FROM sc A,sc B
WHERE A.Sno='2'
AND B.Sno<>'2'
AND A.Cno=B.Cno;
#同时选修1号和2号课程的学生学号
#方法一
SELECT DISTINCT sc.Sno FROM sc
WHERE exists
(SELECT * FROM sc A
where sc.Sno=A.Sno
AND sc.Cno<>A.Cno
);
#方法二
SELECT DISTINCT A.Sno FROM sc A,sc B
WHERE A.Sno=B.Sno
AND A.Cno<>B.Cno;
建立course(课程表)如下:
#求每一门课程的先修课课号
SELECT A.Cno,B.Cno AS Pre_cou FROM course A, course B
WHERE A.Pre=B.Cname
order by A.Cno;
DISTINCT关键字:
应用于所有列而不仅仅是其前置它的列。
limit:
#选出前5行
select prod_name
from product
limit 5;
#选出第二个 五行
select prod_name
from product
limit 5,5;#第一个参数表示开始位置,第二个参数为要检索的行数
#注:检索出的第一条记录是行0
#MySQL 5 的另一种写法为LIMIT 4 OFFSET 3,也表示从行3开始取4行,集LIMIT 3,4
完全限定的引用
database.tablename
tablename.columnname
caluse : 子句
排序:
select prod_name
from products
order by prod_name
注:也可通过非选择列进行排序,也可按照多个列进行排序
默认排序方向是A-Z,
指定降序使用DESC
,例如:
select prod_id,prod_price
from products
order by prod_price DESC;
#DESC关键字只应用到位于前面的列名。如果想在多个列上进行降序排序,必须对每个列指定DESC关键字。
select prod_od,prod_price,prod_name
from products
order by prod_price DESC,prod_name
#对价格降序,对名字进行升序排序
ORDER BY && LIMIT :
ORDER BY 子句,应在FROM子句之后;
LIMIT 子句,必须放在 ORDER BY 之后,使用子句的次序不对将产生错误消息。
ORDER BY 与 WHERE 同时出现时,应该让ORDER BY 放在后面。
范围值检查:
select prod_name,prod_price
from products
where prod_price between 5 and 10
select *
from laptop
where price between 13000 and 16000;
操作符or的应用:
和and
相同,但and的优先级高于or
示例:
#检索条件:生产商1002或者1003
select prod_name,prod_price
from products
where vend_id=1002 and vend_id=1003;
#检索条件:生产商1002或者1003的,而且价格不低于10
select prod_name,prod_price
from products
where (vend_id=1002 or vend_id=1003) and prod_price>=10;
in操作符
用于指定范围.
#找出生产商为1002或1003的
select prod_name,prod_price
from products
where vend_id in (1002,1003)
order by prod_name;
相当于
select prod_name,prod_price
from products
where vend_id=1002 or vend_id=1003
order by prod_name;
IN操作符一般比OR操作符执行得更快。
IN 可包含其他SELECT语句,使得能够动态地建立WHERE子句。
NOT操作符
用于取反。
#找出生产商不为1002、1003的
select prod_name,prod_price
from products
where vend_id not in (1002,1003)
order by prod_name;
通配符(wildcard)
%
表示任何字符出现任意次数
#查找所以以jet起头的产品
select prod_id,prod_name
from products
where prod_name like 'jet%';
注:通配符不可匹配NULL
_
下划线只匹配单个字符而不是多个字符。
正则表达式:
正则表达式用来匹配文本的特殊的串(字符集合)。
#找出prod_name中含1000的列值
select prod_name
from products
where prod_name regexp '1000'
order by prod_name;
.
匹配任意一个字符,示例
select prod_name
from products
where prod_name regexp '.000'
order by prod_name;
#这样不仅可以找到1000的,还有2000,....
注:MySQL中的正则表达式匹配不区分大小写。
为了能够区分大小写,通常使用BINARY
select prod_name
from porducts
where prod_name regexp binary 'JetPack .000';
|
功能类似与OR,用于搜索两个串之一。
#匹配1000、2000、3000
select prod_name
from products
where prod_name regexp '1000|2000|3000'
[...]
构成一个字符集,能够匹配上其中的任意一个即可。
select prod_name
from products
where prod_name regexp '[123] ton'
order by prod_name
--可以匹配出含1ton 2ton 3ton的记录
[1-5]
表示范围1~5
[A-Z]
表示范围A~Z
select prod_name
from porducts
where prod_name regexp '[1-3]ton'
order by prod_name
--可以匹配出1ton 2ton 3ton
^
用于取反
select prod_name
from products
where prod_name regexp '[^123] ton'
order by prod_name
-- 匹配出除了123之外的任何一个
注:使用\\
匹配特殊字符
-- \\. 表示查找 .
select prod_name
from products
where prod_name regexp '\\.'
定位符
上述的匹配查找 都是匹配一个串中任意位置的文本
元字符 | 说明 |
---|---|
^ | 文本的开始 |
$ | 文本的结束 |
[[:<:]] | 词的开始 |
[[:>:]] | 词的结尾 |
问题:查找以一个数(包括以一个小数点开始的数)开始的所有产品
-- 如果简单搜索[0-9\\.],将会在文本中任意位置查找匹配,所以考虑使用定位符^
select prod_name
from products
where prod_name regexp '^[0-9\\.]'
order by prod_name;
--注意 ^放在集合[]中表示否定
LIKE
与 REGEXP
的区别:
LIKE 匹配整个串 而REGEXP用来匹配子串。
REGEXP检查返回值 0(没有匹配),1 (匹配)
SELECT ''HELLO REGEXP '[0-9]'
返回0;