创建表格
先判断users表是否存在,然后设置user_id为无符号(UNSIGNED)自动增长(AUTO_INCREMENT)的整型
并通过PRIMARY KEY设置user_id为主键
ENGINE是指存储引擎为INNODB
CHARSET是指编码格式为utf-8
CREATE TABLE IF NOT EXISTS `users` ( `user_id` INT UNSIGNED AUTO_INCREMENT, `user_password` VARCHAR (100) NOT NULL, PRIMARY KEY (`user_id`) ) ENGINE = INNODB DEFAULT CHARSET = utf8
删除表格
DROP TABLE `users`
插入数据:由于user_id是自增的,所以给定值是0,给其他值会赋值上去
字符串的值必须要加上单引号或者双引号
INSERT INTO `users`(`user_id`,`user_password`) VALUES(0,'nihao')
查询数据:条件user_id<20,查询结果如下图
SELECT * from `users` where `user_id`<20
BINARY的使用:
查询时在where后面使用BINARY可以区分字母大小写,否则不区分
select * from `users` where BINARY `user_password`='Nihao'; select * from `users` where `user_password`='Nihao'
LIMIT的使用:
第一条语句:查询使用LIMIT 2时相当于获取两条数据,
第二条语句:使用LIMIT 1,2时相当于在第一条数据之后开始获取两条数据
第三条语句:LIMIT 1 OFFSET 2相当于从第二条数据之后开始获取一条数据,注意与第二条语句是相反的
select * from `users` where `user_password`='Nihao' LIMIT 2; select * from `users` where `user_password`='Nihao' LIMIT 1,2; SELECT * from `users` LIMIT 1 OFFSET 2
使用LIke查询:
%指代在这个字符前所有的字符,_指代单个字符
SELECT * from users where user_password LIKE '%明'; SELECT * from users where user_password LIKE '刘%'; SELECT * from users where user_password LIKE '%德%'; SELECT * from users where user_password LIKE '_明';
UNION的使用:
UNION:将不同表的相同列的相同值展示出来(不包含重复数据)
UNION ALL:将不同表的相同列的相同值展示出来(包含重复数据)
distinct:可以去除重复数据
SELECT class_id from users where user_password LIKE '%明' UNION SELECT class_id from classes; SELECT class_id from users where user_password LIKE '%明' UNION all SELECT class_id from classes;
查询语句排序:根据order by 后面的字段进行排列,默认asc(升序),而desc是降序
SELECT * from classes ORDER BY class_name desc;
转码:
如果字符集采用utf8的编码格式,想要用拼音排序,先要转码
SELECT * from classes ORDER BY CONVERT(class_name using gbk) desc;
GROUP BY:分组查询
select count(*) from users; select class_id,count(*) from users GROUP BY class_id;
with rollup:可以将group by的值最后再统计一遍
coalesce:如果括号内第一个值为空,后面的值会替代前面的值
select COALESCE(class_id,'总数') as '班级ID',count(*) as '人数' from users GROUP BY class_id WITH ROLLUP;
空值处理:
SELECT * from users where class_id is null; select * from users where class_id is not null; SELECT *,IFNULL(class_id,4) as '其他' from users;下图是查询出来的结果class_id和其他是同一个项,不同的处理方式,用4代替空值
正则表达式的使用
SELECT * from users where user_password REGEXP '^武';#^查找以武开头的所有数据# SELECT * from users where user_password REGEXP '易$';#$查找以易结尾的所有数据# SELECT * from users where user_password REGEXP '苏';#包含苏的所有数据 SELECT * from users where user_password REGEXP '王.';#放在后面就是匹配前面的字符,放在前面就是匹配后面的字符,如王维,用'.维'或'王.' SELECT * from users where class_id REGEXP '[12]';#包含在[]内的单个字符,中文会出现问题 SELECT * from users where user_password REGEXP '[^苏轼的]';#[^]查找不包含在[]里的字符 SELECT * from users where user_password regexp '武*';#和前面的匹配包含所有数据类似,包括空字符 select * from users where user_password REGEXP '武+';#不包括空字符 select * from users where user_password REGEXP '武?';#*+?类似,后续还待研究 select * from users where user_password REGEXP '白|刘';#匹配多个值
返回值是是否有匹配的,即bool值
SELECT 'asssssas' REGEXP 'as{2}';#正则表达式的{}表示匹配2个s SELECT 'asssssas' REGEXP 'as{2,}';#正则表达式的{}表示匹配2个s到无数个s SELECT 'asssssas' REGEXP 'as{2,4}';#正则表达式的{}表示匹配2个s到4个s SELECT 'asssssas' REGEXP 'a(ss)*';#括号内作为一个整体去匹配
MySql的执行顺序
更新语句:使用replace可以批量更改数据
UPDATE users SET user_password='李白' where user_id=20; UPDATE users set user_password=REPLACE(user_password,'nihao','刘德华'); SELECT * from users;
删除语句:
delete是DML支持回滚,
truncate和drop是DDL语言不支持回滚
delete from users where user_id=20;